重写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()));
} @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的字符串类型处理器的更多相关文章
- MyBatis从入门到精通(十四):在MyBatis中使用类型处理器
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解在MyBatis中如何 ...
- 浩哥解析MyBatis源码(十)——Type类型模块之类型处理器
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...
- MyBatis源码解析(十)——Type类型模块之类型处理器TypeHandler
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...
- mybatis由浅入深day01_6SqlMapConfig.xml(6.2settings全局参数配置_6.3typeAliases(类型别名)_6.4typeHandlers(类型处理器)_6.5mappers(映射配置))
6 SqlMapConfig.xml mybatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下: properties(属性) settings(全局配置参数) typeAli ...
- mybatis学习系列五--插件及类型处理器
2 插件编写(80-81) 单个插件编写 2.1实现interceptor接口(ibatis) invocation.proceed()方法执行必须要有,否则不会无法实现拦截作用 2.2 使用@int ...
- Mybatis中使用自定义的类型处理器处理枚举enum类型
知识点:在使用Mybatis的框架中,使用自定义的类型处理器处理枚举enum类型 应用:利用枚举类,处理字段有限,可以用状态码,代替的字段,本实例,给员工状态字段设置了一个枚举类 状态码,直接赋值给对 ...
- MyBatis 示例-类型处理器
MyBatis 提供了很多默认类型处理器,参考官网地址:链接,除了官网提供的类型处理器,我们也可以自定义类型处理器. 具体做法为:实现 org.apache.ibatis.type.TypeHandl ...
- MyBatis(九):MyBatis类型处理器(TypeHandler)详解
TypeHandler简介 TypeHandler,顾名思义类型转换器,就是将数据库中的类型与Java中的类型进行相互转换的处理器. MyBatis 在设置预处理语句(PreparedStatemen ...
- MyBatis 源码分析——类型处理器
官网上面讲到:无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型.那 ...
随机推荐
- RAS非对称加密
加解密密钥不一致,一般私钥不公开,使用公钥加密,私钥解密,使用私钥加密,公钥可以解密. java代码 import javax.crypto.Cipher; import java.security. ...
- 纯CSS一个div实现无缝隙尖角框
话不多说直接先上效果图 其实原理很简单,就是一个带边框的方块加上一个黑色三角形和一个白色三角形,最后通过position定位实现. 代码如下: HTML就一个div <div></d ...
- android RecyclerView的瀑布流布局案例
1.先创建 activity_water_fall.xml 和 activity_water_fall_item.xml <?xml version="1.0" encodi ...
- 修正DejalActivityView在iOS8之前系统上存在的Bug
DejalActivityView是国外的第三方库,可自定义文本内容和文本长度的菊花转加载指示器效果.该第三方库与其它hud存在不同,能够遮盖键盘:可以自定义遮盖NavigationBar或不遮盖Na ...
- 程序写入mycat中文乱码解决(也包括mysql编码修改)
乱码问题可能出现的三个地方 1.程序连接的编码要设置 jdbc:mysql://192.168.1.1:8066/TESTDB?useUnicode=true&characterEncodin ...
- 利用ssh的用户配置文件config管理ssh会话
通常利用 ssh 连接远程服务器,一般都要输入以下类似命令: ssh user@hostname -p port 如果拥有多个 ssh 账号,特别是像我这种喜欢在终端里直接 ssh 登陆,不用 PuT ...
- mount.cifs Windows共享目录权限755问题
umount -l /usr/local/tomcat7/webapps/dsideal_yy/html/down mount -t cifs -o rw,dir_mode=,file_mode=,s ...
- Andrew Ng机器学习 二: Logistic Regression
一:逻辑回归(Logistic Regression) 背景:假设你是一所大学招生办的领导,你依据学生的成绩,给与他入学的资格.现在有这样一组以前的数据集ex2data1.txt,第一列表示第一次测验 ...
- k8s安装之grafana.yaml
这个作展示,够用. 为了使用nginx统一管理, 这里将grafana放在子目录下. - name: GF_SERVER_ROOT_URL value: "%(protocol)s://% ...
- P2680 运输计划[二分+LCA+树上差分]
题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间,这 n-1n−1 条航道连通了 LL 国的所有星球. 小 ...