• 重写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

  • 相关阅读:
    Javascript、CSS和IMG之网页执行探索
    从零开始学习Node.js例子九 设置HTTP头
    从零开始学习Node.js例子八 使用SQLite3和MongoDB
    如何做到 jQuery-free?
    jQuery的deferred对象详解
    使用openxml读取xml数据
    Drupal commerce 性能优化
    DataTable数据进行排序、检索、合并、分页、统计
    jquery实现替代iframe的功能
    9_Jvn框架之实现ORM持久层save操作(第九讲)
  • 原文地址:https://www.cnblogs.com/SmilingEye/p/12035247.html
Copyright © 2020-2023  润新知