文章目录
前言
今天简单介绍利用MyBatis的TypeHandler接口实现字段的加解密。
字段的加密和解密,实现方式确实有好几种。比如,在业务层实现、在数据库层面实现等等,但是这些相对来说,耦合性稍微强那么一点点,而且涉及到改动的话,改动的地方比较多;所以最好的就是统一管理这些功能。
一、TypeHandler接口
Mybatis的TypeHandler
类型转换器是负责Java类
和jdbc类型
之间的转换。
主要涉及到下面这几个类:
TypeHandler
类型转换器的顶层接口。BaseTypeHandler
抽象类继承自TypeHandler,Mybatis中所有的类型转换器实现均继承他。TypeHandlerRegistry
类型转换器注册器,负责存储类型转换器。TypeAliasRegistry
类型别名转换器,用来存储类型与别名的对应关系。
其主要作用就是:
- 可以指定我们在Java实体类所包含的自定义类型存入数据库后的类型是什么。
- 从数据库中取出该数据后自动转换为我们自定义的Java类型。
所以来实现简单的字段加密和解密比较方便。
二、实现
- 1、定义一个
实体类包装对象
表示我们要加密的数据对象。
/**
* 编写一个实体类,凡是此实体类的数据都表示需要加解密
*/
@Data
public class Encrypt {
private String value;
}
- 2、实现
TypeHandler<T>
接口,我们这实现BaseTypeHandler<T>
。
@MappedJdbcTypes(JdbcType.VARCHAR) // 表示该Handler处理的java类型
@MappedTypes(Encrypt.class) // 表示处理器处理的Jdbc类型
public class EncryptTypeHandler extends BaseTypeHandler<Encrypt> {
private static final byte[] KEYS = "12345678abcdefgh".getBytes(StandardCharsets.UTF_8);
/**
* 设置参数
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Encrypt parameter, JdbcType jdbcType) throws SQLException {
if (parameter == null || parameter.getValue() == null) {
ps.setString(i, null);
return;
}
AES aes = SecureUtil.aes(KEYS);
String encrypt = aes.encryptHex(parameter.getValue());
ps.setString(i, encrypt);
}
/**
* 获取值
*/
@Override
public Encrypt