四时宝库

程序员的知识宝库

优雅,Mybatis如何实现对敏感字段的加密处理?

背景

相信很多人都遇到过这种情况,需要在前端调用的接口中将一些敏感字段进行加密处理。一种比较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用法的介绍,希望对大家有所帮助。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接