1.简介
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
StringTypeHandler是MyBatis默认的字符串类型处理器。下面我们将重新写一个字符串类型处理器。
mybatis官方文档:
https://www.w3cschool.cn/mybatis/7zy61ilv.html
https://mybatis.org/mybatis-3/zh/getting-started.html
2.实现目标
插入数据库的字符串类型,在后面加一个0-100的随机数,例如:“张三”插入数据变成“张三-10”。
读取数据库的字符串类型,去掉后面的随机数,例如:“张三-10”读取为“张三”。
3.实现步骤
3.1application.yml修改配置
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替代
4.2@MappedJdbcTypes(value = JdbcType.VARCHAR, includeNullJdbcType = true)中includeNullJdbcType指不写jdbcType=VARCHAR是否使用此处理器,默认为false