MyBatis(九):MyBatis类型处理器(TypeHandler)详解
TypeHandler简介
TypeHandler,顾名思义类型转换器,就是将数据库中的类型与Java中的类型进行相互转换的处理器。
MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型
实现讲解
经常自定义类型转换器方式有两种,实现
TypeHandler接口, 或继承抽象类BaseTypeHandle,并且可以指定转换后的字段类型。- 其实BaseTypeHandler也是继承了TypeHandler接口,在实现的TypeHandler接口的方法中调用的是自身抽象方法,如下
public abstract class BaseTypeHandler<T> extends TypeReference<T> implements TypeHandler<T> { public T getResult(ResultSet rs, String columnName) throws SQLException {
Object result;
try {
result = this.getNullableResult(rs, columnName);
} catch (Exception var5) {
throw new ResultMapException("Error attempting to get column '" + columnName + "' from result set. Cause: " + var5, var5);
} return rs.wasNull() ? null : result;
} public abstract T getNullableResult(ResultSet var1, String var2) throws SQLException;
}
- 抽象类BaseTypeHandler的抽象方法
// 执行之前,将Java类型转换为对应的jdbc类型,用于赋值sql中参数
public abstract void setNonNullParameter(PreparedStatement var1, int var2, T var3, JdbcType var4) throws SQLException; // 根据列名从resultSet中获取,将JDBC类型转换为Java类型
public abstract T getNullableResult(ResultSet var1, String var2) throws SQLException; // 根据下标从resultSet中获取,将JDBC类型转换为Java类型
public abstract T getNullableResult(ResultSet var1, int var2) throws SQLException; // 用于在执行完存储过程后,将JDBC类型转换为Java类型
public abstract T getNullableResult(CallableStatement var1, int var2) throws SQLException;
自定义类型处理器
假设现在有一个支付标识(0-否 1-是)字段,数据库中我们存入的是tinyint 0/1,但是前端显示却是 是/否,使用TypeHandler就可以实现。具体步骤如下:
- 新建MyTypeHandler,继承BaseTypeHandler类
public class MyTypeHandler extends BaseTypeHandler<String> { /**
* @Description 执行之前,将Java类型转换为对应的jdbc类型,用于赋值sql中参数
**/
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
preparedStatement.setInt(i,Integer.valueOf(s));
} /**
* @Description 根据列名从resultSet中获取,将JDBC类型转换为Java类型
**/
@Override
public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
return this.convert(resultSet.getInt(s));
} /**
* @Description 根据下标从resultSet中获取,将JDBC类型转换为Java类型
**/
@Override
public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
return this.convert(resultSet.getInt(i));
} /**
* @Description 用于在执行完存储过程后,将JDBC类型转换为Java类型
**/
@Override
public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return this.convert(callableStatement.getInt(i));
} /**
* @Description 对数据库中0/1进行转换
**/
private String convert(int flag){
if (flag==1){
return "是";
}
return "否";
}
}
- 在Mapper中指定需要转换的字段,jdbcType指数据库中的类型,javaType指Java中的类型,typeHandler指定自定义的转换器
<result column="flag" property="flag" jdbcType="TINYINT" javaType="java.lang.String" typeHandler="com.rangers.MyTypeHandler"></result>
- 进行测试
private SqlSession sqlSession ;
private OrderMapper orderMapper; @Before
public void init() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
orderMapper = sqlSession.getMapper(OrderMapper.class);
} // 测试读取时转换
@org.junit.Test
public void testResult(){
Order order = orderMapper.selectOne(1);
System.out.println(order);
} // 测试传入时转换
@org.junit.Test
public void testParameter(){
// 假设前端传入字符串0/1
List<Order> orders = orderMapper.selectOneByFlag("1");
System.out.println(orders);
} @After
public void close(){
sqlSession.close();
}
[Order{id=2, time=Wed Mar 10 17:22:45 CST 2021, total=2.22, uid=1, flag=是}, Order{id=3, time=Wed Mar 10 17:22:57 CST 2021, total=3.33, uid=2, flag=是}]
全局字段转换与单个字段转换
全局转换:在核心配置文件中添加typeHandlers标签
<typeHandlers>
<typeHandler handler="com.rangers.MyTypeHandle"/>
</typeHandlers>
单个字段转换:指定jdbcType、javaType与typeHandler
<result column="flag" property="flag" jdbcType="TINYINT" javaType="java.lang.String" typeHandler="com.rangers.MyTypeHandler"></result>
通常在项目中使用的是单个字段进行转换,经常自定义类型处理器还有日期处理、加密字段处理、List处理,JSON处理等
MyBatis(九):MyBatis类型处理器(TypeHandler)详解的更多相关文章
- MyBatis源码解析(十)——Type类型模块之类型处理器TypeHandler
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...
- 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)
上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, ...
- Mybatis的配置文件和映射文件详解
一.Mybatis的全局配置文件 1.SqlMapConfig.xml是mybatis的全局配置文件,配置内容如下: properties(属性) settings(全局配置参数) typeAlias ...
- 热烈祝贺华清远见《ARM处理器开发详解》第2版正式出版
2014年6月,由华清远见研发中心组织多名业 内顶尖讲师编写的<ARM处理器开发详解>一书正式出版.本书以S5PV210处理器为平台,详细介绍了嵌入式系统开发的各个主要环节,并注重实践,辅 ...
- C#中的预处理器指令详解
这篇文章主要介绍了C#中的预处理器指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregio ...
- MyBatis的SQL语句映射文件详解
SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用 < ...
- MyBatis魔法堂:Insert操作详解(返回主键、批量插入)
一.前言 数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二. insert元素 属性详解 其属性如下: parameterType ...
- MyBatis魔法堂:Insert操作详解
一.前言 数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二. insert元素 属性详解 其属性如下: parameterType:入参的全限 ...
- MyBatis学习笔记2--配置环境详解
1.MyBatis-config.xml详解 一个完整的配置文件如下所示 <configuration> <!-- <properties resource="jdb ...
随机推荐
- Cobbler自定义安装系统和私有源
1.自定义安装系统(根据mac地址) --name=定义名称 --mac=客户端的mac地址 --ip-address=需求的ip --subnet=掩码 --gateway=网关 --interfa ...
- LEETCODE - 160【相交链表】
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...
- C++的继承权限
原文来自于:https://www.cnblogs.com/2018shawn/p/10648408.html 公式: 继承成员对外的访问属性 = Max{继承方式,父类成员访问级别}: ps;以下成 ...
- POJ 1625 Censored!(AC自动机 + DP + 大数 + 拓展ASCII处理)题解
题意:给出n个字符,p个病毒串,要你求出长度为m的不包含病毒串的主串的个数 思路:不给取模最恶劣情况$50^{50}$,所以用高精度板子.因为m比较小,可以直接用DP写. 因为给你的串的字符包含拓展A ...
- IDEA插件:快速删除Java代码中的注释
背景 有时,我们需要删除Java源代码中的注释.目前有不少方法,比如: 实现状态机.该方式较为通用,适用于多种语言(取决于状态机支持的注释符号). 正则匹配.该方式容易误判,尤其是容易误删字符串. ...
- PostCSS All In One
PostCSS All In One https://postcss.org/ https://www.webpackjs.com/loaders/postcss-loader/ https://gi ...
- Node.js _dirname & path All In One
Node.js _dirname & path All In One file path 相对路径 绝对路径 _dirname https://nodejs.org/docs/latest/a ...
- html template tag
html template tag const tagName = `emoji-element`; const template = document.createElement('template ...
- JSDoc in action
JSDoc in action JSDoc https://jsdoc.app/index.html https://github.com/jsdoc/jsdoc $ npm -g jsdoc $ n ...
- ES-Next & ES7 @decorator
ES-Next & ES7 @decorator @decorator https://tc39.github.io/proposal-decorators/#sec-syntax https ...