业务背景:
对于一些敏感字段,我们需要在新增修改时,对数据进行加密,在查询的时候,对数据进行解密。
比较low的处理方式:
一般情况下,我们都是会进行硬编码,在每个需要加解密的方法中,增加密或解密的处理逻辑。这种处理方式,有很大的一个弊端,那就是不够优雅。
今天就教大家一个优雅的处理方式:
继承mybatis的BaseTypeHandler类
mybatis框架中提供了各种数据类型的处理类,这些处理类都继承了BaseTypeHandler类。BaseTypeHandler中有两个重要的方法,分别是:setNonNullParameter,getNullableResult,非空参数给字段赋值,处理可为空的返回值。
mybatis源码中的类型处理器
下面我们就写一个字段加解密的TypeHandler:
@Component
public class AESEncryptHandler 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);
}
}
在需要处理的字段上进行配置:
< result column="cardNumber" jdbcType="VARCHAR" typeHandler="com.xhx.springboot.convert.AESEncryptHandler"/>
看这样处理是不是简单很多,顺便还解耦了呢!
这无处不在的优雅!
文末总结:
优雅永不过时,关注优雅哥一起学习吧。