背景
相信很多人都遇到过这种情况,需要在前端调用的接口中将一些敏感字段进行加密处理。一种比较Low的处理方式就是通过硬编码的方式,或者是使用显示脱敏技术进行处理,这种处理方式就显得比较臃肿了。下面我们就来介绍一种简单优雅的方式来实现数据加密处理。
TypeHandler的使用
TypeHandler是用来处理Java类型和JDBC类型之间的转换的,它是MyBatis中比较重要的一部分。
在MyBatis中,如果某个Java类型没有对应的JDBC类型,或者JDBC类型与Java类型之间的转换逻辑比较复杂,那么我们就需要自定义TypeHandler来完成转换。
BaseTypeHandler类
在Mybatis中提供了各种数据处理的矿机爱类,并且这些数据处理类都是继承了BaseTypeHandler类,在这个类中提供了一些方法需要我们自己来实现,如下所示
BaseTypeHandler 是个抽象类,需要子类去实现其定义的 4 个抽象方法,而它本身实现了 typeHandler 接口的 4 个方法。可以对数据保存与查询时做出相应处理,类似操作数据库之间的一个拦截器
BaseTypeHandler提供了如下的两个基础实现方法,
- setNonNullParameter 非空参数给字段赋值
- getNullableResult 处理可为空的返回值
如何使用BaseTypeHandler类
定义了一个SelfMybatisBaseTypeHandler处理类
@Component
public class SelfMybatisBaseTypeHandler extends BaseTypeHandler {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int columnIndex, Object parameter, JdbcType jdbcType) throws SQLException {
preparedStatement.setString(columnIndex, AESCipher.encrypt(String.valueOf(parameter)));
}
@Override
public Object getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
String columnValue = resultSet.getString(columnName);
return null == columnValue ? null : AESCipher.decrypt(columnValue);
}
@Override
public Object getNullableResult(ResultSet resultSet, int columnName) throws SQLException {
String columnValue = resultSet.getString(columnName);
return null == columnValue ? null : AESCipher.decrypt(columnValue);
}
@Override
public Object getNullableResult(CallableStatement callableStatement, int columnName) throws SQLException {
String columnValue = callableStatement.getString(columnName);
return null == columnValue ? null : AESCipher.decrypt(columnValue);
}
}
需要在处理字段上使用 typeHandler 属性添加相应的处理器。
<result property="applyUserId" column="apply_user_id" typeHandler="com.community.framework.mybatis.SelfMybatisBaseTypeHandler" />
这样就可以实现对于数据字段进行加密处理了。
总结
在MyBatis中,BaseTypeHandler和TypeHandler是用来处理Java类型和JDBC类型之间的转换的。BaseTypeHandler是TypeHandler的基类,提供了一些基础的转换方法,我们可以继承BaseTypeHandler来自定义自己的TypeHandler。
TypeHandler则是用来处理Java类型和JDBC类型之间的复杂转换逻辑的,我们可以通过配置TypeHandler来使用自定义的TypeHandler。以上是关于MyBatis之BaseTypeHandler和TypeHandler用法的介绍,希望对大家有所帮助。