侧边栏

重写mybatis的字符串类型处理器

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

posted on 2019-12-13 15:14  SmilingEye  阅读(862)  评论(0编辑  收藏  举报

导航