- 概述
- 提问
- 回答
- 一、如何自定义typeHandler
- 二、如何配置使用typeHandler?以及mybatis-plus自带方法如何使用?
- 三、@MappedJdbcTypes和@MappedTypes的作用是什么
- 四、typeHandler如何配置单个字段使用?以及如何配置全局使用?
- 全局使用
- 单个字段的使用
- 五、如何进行身份证,密码,手机号,邮箱等等的脱敏处理
TypeHandler顾名思义就是类型处理器,这里类型指的是数据库类型和java类型之间的处理。
通常情况下我们使用mybatis的时候都是varchar对应String,Date对应Date等等,但是使用自定义TypeHandler之后我们可以任意的转换数据库类型(JdbcType)和java类型。
当你使用这个typeHandler熟练之后,你会发现,这个东西不仅仅能够进行类型处理,而且可以进行一下数据上的处理,比如身份证,密码,手机号,邮箱等等的脱敏处理。
以下的所有的讲解使用都是基于在springboot下的使用。其它的请
提问- 如何自定义typeHandler
- 如何配置使用typeHandler?以及mybatis-plus自带方法如何使用?
- @MappedJdbcTypes和MappedTypes的作用是什么
- typeHandler如何配置单个字段使用?以及如何配置全局使用?
- 如何进行身份证,密码,手机号,邮箱等等的脱敏处
自定义typeHandler需要实现[org.apache.ibatis.type.TypeHandler],但是已经有[org.apache.ibatis.type.baseTypeHandler]实现了TypeHandler,我们只要继承这个baseTypeHandler就可以实现自定义的TypeHandler。
注意:TypeHandler里面还有两种枚举类型的EnumOrdinalTypeHandler和EnumTypeHandler.这两种的使用不在这篇文章中说明,请查看[mybatis 枚举类型处理器 EnumTypeHandler、EnumOrdinalTypeHandler]
package org.loulan.application.function.mybatis.org.typeHandler; import lombok.SneakyThrows; import org.apache.ibatis.type.baseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedJdbcTypes; import org.apache.ibatis.type.MappedTypes; import javax.swing.text.DateFormatter; import java.sql.*; import java.text.SimpleDateFormat; @MappedJdbcTypes(JdbcType.TIMESTAMP) @MappedTypes(String.class) public class DateTypeHandler extends baseTypeHandler二、如何配置使用typeHandler?以及mybatis-plus自带方法如何使用?{ @SneakyThrows @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException { SimpleDateFormat format = new SimpleDateFormat(); java.util.Date parse = format.parse(s); preparedStatement.setDate(i, new Date(parse.getTime())); } @Override public String getNullableResult(ResultSet resultSet, String s) throws SQLException { try { String date = resultSet.getString(s); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); java.util.Date parse = format.parse(date); return format.format(parse); } catch (Exception ex) { return null; } } @Override public String getNullableResult(ResultSet resultSet, int i) throws SQLException { Date date = resultSet.getDate(i); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); return format.format(date); } @Override public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException { Date date = callableStatement.getDate(i); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); return format.format(date); } }
如上的案例,已经定义好了将日期类型转换为自定格式化的字符串,但是这个自定义的typeHandler如何使用呢?
typeHandler的使用,我们可以在mapper.xml的配置文件中的resultMap中进行配置使用,也可以在参数传递的时候进行配置使用。
UUID,ADL_CD,AD_NM, AD_SHNM,AD_A,PID_UUID, ST_DT,END_DT,IS_ENABLE, TS,NT select from dm_addr insert into dm_addr(ADL_CD,ST_DT) VALUES(#{adlCd},#{stDt,typeHandler=org.loulan.application.function.mybatis.org.typeHandler.DateTypeHandler})
如上在resultMap或者参数中配置typeHandler属性便可一使用。
那么如果我们调用的是mybatis-plus自带的方法应该如何使用typeHandler,这个其实在官方网站中也提到了,就是使用注解@TableField,该注解里面有一个属性就是typeHandler(需要配合@TableName里面autoResultMap使用),通过这个属性的配置就可以使用typeHandler。如下是官方给的解释:
三、@MappedJdbcTypes和@MappedTypes的作用是什么关于jdbcType和typeHandler以及numericScale的说明:
numericScale只生效于 update 的sql. jdbcType和typeHandler如果不配合@TableName#autoResultMap = true一起使用,也只生效于 update 的sql. 对于typeHandler如果你的字段类型和set进去的类型为equals关系,则只需要让你的typeHandler让Mybatis加载到即可,不需要使用注解
使用typeHandler就不可避免的会使用到这两个注解,这两个注解一个是用来定义数据库类型JdbcType,一个是定义java类型。
如此我们可以看出,既然定义了两种类型,还正好是转换的两种类型,那么它的作用就是筛选。只有符合这两种类型转换的typehandler才能使用,也就是说,即使你定义对应的resultMap使用了typeHandler,但是类型对应不上也是无法使用的。
个人认为,这两个注解的使用,更多的使用在全局的typeHandler上面。
四、typeHandler如何配置单个字段使用?以及如何配置全局使用? 全局使用使用typeHandler的时候,有时候我们是使用在全局的过程中的,也就是说只要符合筛选条件的就可以使用这个typeHandler,如何配置才能让这个typeHandler变成为全局的typeHandler。
// application.yml
mybatis-plus:
type-handlers-package: org.loulan.application.function.mybatis.org.config
通过这个配置的扫描就可以将对应jar包下的typeHandler扫描为全局的typeHandler。全局的typeHandler是不需要在resultMap中配置查询返回的,只要符合条件的就可以自动使用这个typeHandler。
单个字段的使用就像前面讲解说明的时候一样,需要配置在指定的resultMap中,单个字段的配置使用,实体类中的配置需要配置在@TableField的typeHandler属性中。
注意要进行@TableField属性typeHandler配置使用的需要配合@TableName的autoResultMap属性。
为什么要配合@TableNamed的autoResultMap来使用呢,个人经过测试,这个并不是一定的。只是实体类的配置中没有resultMap,造成这个typeHandler没有承载,其实在@TableName中还有一个属性resultMap,使用这个属性可以直接指定mapper.xml中一个resultMap直接使用,这样@TableField的typeHandler属性也就可以使用了。
五、如何进行身份证,密码,手机号,邮箱等等的脱敏处理通过上面学习,我们可以知道typeHandler的实现使用需要实现4个方法,这四个方法中有一个方式设set,三个方法是get。如此我们便可以在set方法中通过对传递过来的数据进行加密再保存到数据库。在get方法中,我们可以使用解密方法解密之后再返回到对象的属性中。
set和get操作就可以使用这些关键信息的脱敏处理,而且不需要们额外的进行处理。关于关键信息的脱敏处理也可以使用全局的拦截器等等进行mybatis的拦截处理。



