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

最新文章

  1. 一款全兼容的播放器 videojs
  2. Unity中Instantiate一个prefab时需要注意的问题
  3. 如何让oracle的select强制走索引
  4. HTML、CSS和JS
  5. HackerRank Ice Cream Parlor
  6. APK扩展文件及使用
  7. Linux的SOCKET编程详解
  8. align=absMiddle属性设置
  9. uva10375 Choose and divide
  10. ThindPad x230 无法U盘启动
  11. asp.net 页面跳转的方法
  12. 华哥倒酒&lt;区间标记,二分&gt;
  13. phpstrom 的一些常用设置
  14. MPSOC之1——overview、开发板、工具
  15. Mesos源码分析(13): MesosContainerier运行一个Task
  16. C++诡异异常处理
  17. 对比synchronized与java.util.concurrent.locks.Lock 的异同
  18. 微信小程序生命周期——小程序的生命周期及页面的生命周期。
  19. Android 开发工具类 06_NetUtils
  20. HDU 1025 LIS二分优化

热门文章

  1. H5调起IOS原生商店支付
  2. DRF 有无外键操作实例
  3. MySQL Connection--使用tcpkill杀掉MySQL活跃连接
  4. oracle 删除表空间
  5. atoi()和itoa()函数详解以及C语言实现
  6. Django分表操作、聚合及FQ方法
  7. 2018 China Collegiate Programming Contest Final (CCPC-Final 2018)-K - Mr. Panda and Kakin-中国剩余定理+同余定理
  8. Mongodb的安装--简单快速
  9. C语言二级指针间接赋值
  10. tensorflow API _ 1 (control_flow_ops.cond)