1. 简介
无论是 MyBatis 在预处理语句 (PreparedStatement) 中设置一个参数时, 还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型.
StringTypeHandler 是 MyBatis 默认的字符串类型处理器. 下面我们将重新写一个字符串类型处理器.
mybatis 官方文档:
https://www.w3cschool.cn/mybatis/7zy61ilv.html
2. 实现目标
插入数据库的字符串类型, 在后面加一个 0-100 的随机数, 例如:"张三" 插入数据变成 "张三 - 10".
读取数据库的字符串类型, 去掉后面的随机数, 例如:"张三 - 10" 读取为 "张三".
3. 实现步骤
3.1application.YAML 修改配置
- mybatis:
- mapper-locations: classpath:mybatis/*.xml
- type-handlers-package: com.springboot.springbootstart.mybatis
主要是需要加入 mybatis.type-handlers-package: com.springboot.springbootstart.mybatis
com.springboot.springbootstart.mybatis 为 ExampleTypeHandler 类的包名
3.2 新增 ExampleTypeHandler 继承 BaseTypeHandler
- package com.springboot.springbootstart.mybatis;
- import java.sql.CallableStatement;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.Random;
- import org.apache.ibatis.type.BaseTypeHandler;
- import org.apache.ibatis.type.JdbcType;
- import org.apache.ibatis.type.MappedJdbcTypes;
- @MappedJdbcTypes(value = JdbcType.VARCHAR, includeNullJdbcType = true)
- public class ExampleTypeHandler extends BaseTypeHandler<String> {
- @Override
- public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)
- throws SQLException {
- Random r = new Random();
- ps.setString(i, parameter + "-" + String.valueOf(r.nextInt(101)));
- }
- @Override
- public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
- return getNewField(rs.getString(columnName));
- }
- @Override
- public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
- return getNewField(rs.getString(columnIndex));
- }
- @Override
- public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
- return getNewField(cs.getString(columnIndex));
- }
- private String getNewField(String field) {
- int index = field.lastIndexOf("-");
- return field.substring(0, index);
- }
- }
完成以上两步就将 StringTypeHandler 替换 ExampleTypeHandler 了, 下面做插入和查询测试.
3.3 测试
mapper 的写法
- <insert id="insert" parameterType="com.springboot.springbootstart.entity.User">
- insert into user
- (id, username, name, age)
- values
- (#{id},#{username},#{name},#{age})
- </insert>
- <select id="get" resultType="com.springboot.springbootstart.entity.User">
- SELECT t.id ,
- t.username ,
- t.name ,
- t.age ,
- t.create_time
- FROM user t
- </select>
只贴测试方法的代码
- @Test
- @Transactional
- @Rollback(false)
- public void insert(){
- User user = new User();
- user.setId("8");
- user.setUsername("user1");
- user.setName("王五");
- user.setAge(18);
- userService.insert(user);
- }
- @Test
- public void get(){
- try{
- List<User> list = userService.get();
- for(User user : list){
- System.err.println(user);
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- }
数据库结果
查询结果
User(id=8, username=user1, name = 王五, age=18, createTime=null)
4. 其他配置和用法说明
4.1mybatis.type-handlers-package: com.springboot.springbootstart.mybatis 可以使用在 ExampleTypeHandler 加上 @Component 替代
[email protected](value = JdbcType.VARCHAR, includeNullJdbcType = true)中 includeNullJdbcType 指不写 jdbcType=VARCHAR 是否使用此处理器, 默认为 false
来源: http://www.bubuko.com/infodetail-3329662.html