业务布景:
关于一些灵敏字段,咱们需求在新增修改时,对数据进行加密,在查询的时分,对数据进行解密。
比较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”/>
看这样处理是不是简单许多,趁便还解耦了呢!
这无处不在的高雅!
文末总结:
高雅永不过时,关注高雅哥一同学习吧。