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()));
} @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(, 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("");
user.setUsername("user1");
user.setName("王五");
user.setAge();
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

重写mybatis的字符串类型处理器的更多相关文章

  1. MyBatis从入门到精通(十四):在MyBatis中使用类型处理器

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解在MyBatis中如何 ...

  2. 浩哥解析MyBatis源码(十)——Type类型模块之类型处理器

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...

  3. MyBatis源码解析(十)——Type类型模块之类型处理器TypeHandler

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...

  4. mybatis由浅入深day01_6SqlMapConfig.xml(6.2settings全局参数配置_6.3typeAliases(类型别名)_6.4typeHandlers(类型处理器)_6.5mappers(映射配置))

    6 SqlMapConfig.xml mybatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下: properties(属性) settings(全局配置参数) typeAli ...

  5. mybatis学习系列五--插件及类型处理器

    2 插件编写(80-81) 单个插件编写 2.1实现interceptor接口(ibatis) invocation.proceed()方法执行必须要有,否则不会无法实现拦截作用 2.2 使用@int ...

  6. Mybatis中使用自定义的类型处理器处理枚举enum类型

    知识点:在使用Mybatis的框架中,使用自定义的类型处理器处理枚举enum类型 应用:利用枚举类,处理字段有限,可以用状态码,代替的字段,本实例,给员工状态字段设置了一个枚举类 状态码,直接赋值给对 ...

  7. MyBatis 示例-类型处理器

    MyBatis 提供了很多默认类型处理器,参考官网地址:链接,除了官网提供的类型处理器,我们也可以自定义类型处理器. 具体做法为:实现 org.apache.ibatis.type.TypeHandl ...

  8. MyBatis(九):MyBatis类型处理器(TypeHandler)详解

    TypeHandler简介 TypeHandler,顾名思义类型转换器,就是将数据库中的类型与Java中的类型进行相互转换的处理器. MyBatis 在设置预处理语句(PreparedStatemen ...

  9. MyBatis 源码分析——类型处理器

    官网上面讲到:无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型.那 ...

随机推荐

  1. 定时任务 Quarzt

    Quartz.Net是一个从java版的Quartz移植过来的定时任务框架,可以实现异常灵活的定时任务. Quartz 有三个概念分别是 计划者(ISchedeler).工作(IJob).触发器(Tr ...

  2. Part_five:Redis哨兵高可用

    redis哨兵高可用 1.redis-sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案, 当用redis作master-slave的高可用时,如果master本身宕 ...

  3. 如何在SAP Cloud Platform ABAP编程环境里创建一个employee

    用ABAP Development Tool登录SAP Cloud Platform ABAP编程环境后,对ABAP项目点击右键,选择属性,从而找到该环境的web访问的url: https://325 ...

  4. mysql 模糊查询like小结

    以不完整的条件进行查询 因为条件是模糊的 所以叫模糊查询,可以对有相同信息的数据快速归类 . like  运算符:可以很好的通过%和-两种通配符对数据进行筛选查询 %(所有)放在条件前中后.可查询包含 ...

  5. Hadoop 二次排序

    需求 求每年的最高气温,年份升序,温度求最高 数据源内容如下 temperature.txt 2004 49 1981 -22 1981 -31 1965 -47 2027 -2 1964 6 203 ...

  6. Linux下安装zookeeper和启动

    原文:https://yq.aliyun.com/articles/662422 1.zookeeper官网下载安装包http://mirrors.hust.edu.cn/apache/zookeep ...

  7. Java精通并发-wait与notify及线程同步系统总结

    notifyAll(): 在上两次中对于Object的wait()和notify()方法的官方doc进行了通读,上一次https://www.cnblogs.com/webor2006/p/11407 ...

  8. test20190815 NOIP2019 模拟题

    100+60+40=200,被后面两个题卡着我很不爽. 立方数 [问题描述] 作为 XX 战队的狂热粉丝,MdZzZZ 看到了自己心仪的队伍在半决赛落败,顿时 心灰意冷.看着自己手中的从黄牛那里抢来的 ...

  9. 行为型模式(七) 策略模式(Stragety)

    一.动机(Motivate) 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂:而且有时候支持不使用的算法也是一个性能负担.如何在运行时 ...

  10. 黄杉杉 --java第七次作业

    题目1:创建一个柱体类,包含矩形对象.高和体积等三个成员变量,一个构造方法进行成员变量初始化,和计算体积.换底两个功能方法,在主类中输入长.宽.高,计算柱体体积,输入新的长.宽.高,创建新的矩形对象, ...