基于Mybatis-Plus的字段加密方案

2,826 阅读1分钟

在使用Mybatis-Plus框架时可能会有字段加密的需求,此时可以通过Mybatis-Plus自带的注解和自定义Mybatis类型处理器来实现字段加密的功能。

自定义类型处理器

// 可封装字段加密工具类提供加解密的功能,该工具类在应用初始或启动的时候设置密码等信息。

public class CryptoTypeHandler implements TypeHandler<String> {

    @Override
    public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        if (parameter != null) {
            String encryptedText = /* TODO加密逻辑 */
            ps.setString(i, encryptedText);
        } else {
            ps.setNull(i, Types.VARCHAR);
        }
    }

    @Override
    public String getResult(ResultSet rs, String columnName) throws SQLException {
        String result = rs.getString(columnName);
        if (result == null) {
            return null;
        }

        String decryptedText =  /* TODO解密逻辑 */
        return decryptedText;
    }

    @Override
    public String getResult(ResultSet rs, int columnIndex) throws SQLException {
        String result = rs.getString(columnIndex);
        if (result == null) {
            return null;
        }

        String decryptedText = /* TODO解密逻辑 */
        return decryptedText;
    }

    @Override
    public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
        String result = cs.getString(columnIndex);
        if (result == null) {
            return null;
        }

        String decryptedText = /* TODO解密逻辑 */
        return decryptedText;
    }

}

设置字段的类型处理器

// 若要通过BaseMapper获取的结果自动解密,则要加上"autoResultMap = true"。

@TableName(value = "xxxx", autoResultMap = true)
public class Sample {
    ...

    @TableField(value = "secret_info", typeHandler = CryptoTypeHandler.class)
    private String secretInfo;

    public String getSecretInfo() {
        return secretInfo;
    }

    public void setSecretInfo(String secretInfo) {
        this.secretInfo = secretInfo;
    }

}