数据实现自动加密和解密功能

记录一个功能的实现

Springboot+MyBatis Plus

1.首先我们需要创建一个自定义的类型处理器,用于将数据库中的加密数据解密成明文数据,并将明文数据加密后插入到数据库中 (EncryptUtils是加密工具类,可以根据要加密的方式自行编写)

@MappedTypes(String.class)
public class EncryptTypeHandler extends BaseTypeHandler<String> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        // 加密参数并设置到PreparedStatement对象中
        ps.setString(i, EncryptUtils.encrypt(parameter));
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 从ResultSet对象中获取加密的参数并解密
        return EncryptUtils.decrypt(rs.getString(columnName));
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 从ResultSet对象中获取加密的参数并解密
        return EncryptUtils.decrypt(rs.getString(columnIndex));
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 从CallableStatement对象中获取加密的参数并解密
        return EncryptUtils.decrypt(cs.getString(columnIndex));
    }
}

2.在实体类中使用自定义类型处理器

@TableName(value = "user", autoResultMap = true)
public class User {
    private Long id;
    @TableField(typeHandler = EncryptTypeHandler.class)
    private String name;        // 加密的名字字段
    @TableField(typeHandler = EncryptTypeHandler.class)
    private String phone;       // 加密的手机号字段
    @TableField(typeHandler = EncryptTypeHandler.class)
    private String idCard;      // 加密的身份证号字段

}

在xml中可以这样配置

<result column="user_name" property="userName" typeHandler="org.springblade.common.interceptor.DecryptTypeHandler" javaType="java.lang.String" jdbcType="VARCHAR"/>

现在,当我们使用 MyBatis Plus 进行插入和查询操作时,就会自动进行加密和解密操作了