在使用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;
}
}