利用mybatis实现数据脱敏

实现原理主要是使用mybatis的TypeHandler接口

首先我们自定义一个EncryptTypeHandler类去继承BaseTypeHandler(BaseTypeHandler实现了TypeHandler)接口,实现其中的四个抽象方法

public abstract void setNonNullParameter(PreparedStatement var1, int var2, T var3, JdbcType var4) throws SQLException;

public abstract T getNullableResult(ResultSet var1, String var2) throws SQLException;

public abstract T getNullableResult(ResultSet var1, int var2) throws SQLException;

public abstract T getNullableResult(CallableStatement var1, int var2) throws SQLException;

setNonNullParameter赋值是调用,主要实现数据的加密

getNullableResult是查询结果是调用,主要实现数据的解密

实现类如下:

@MappedTypes(Encrypt.class)
public class EncryptTypeHandler extends BaseTypeHandler {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)
            throws SQLException {
        ps.setString(i, EncryptUtil.encrypt(parameter));
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String r = rs.getString(columnName);
        return r == null ? null : EncryptUtil.isEncrypted(r) ? EncryptUtil.decrypt(r) : r;
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String r = rs.getString(columnIndex);
        return r == null ? null : EncryptUtil.isEncrypted(r) ? EncryptUtil.decrypt(r) : r;
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String r = cs.getString(columnIndex);
        return r == null ? null : EncryptUtil.isEncrypted(r) ? EncryptUtil.decrypt(r) : r;
    }

使用时只需要早加密或解密的字段处使用javaType指定一个TypeHandler类型即可,此处定义了别名


GitHub上有人封实现好了加密解密的TypeHandler,只需引用配置即可

依赖如下:


  com.github.drtrang
  typehandlers-encrypt
  1.1.1

你可能感兴趣的:(java,mybatis)