项目开发,会对表字段进行进行脱敏操作,如身份证号,手机号等等,通过继承mybatis-plusti提供的BaseTypeHandler类来统一处理这类问题
1.导入依赖(gradle) 加密算法可以使用现成的(如:hutool包提供的AES),也可以自定义,最好是自定义,我这里使用的是自定义的加密算法
2.增加数据库加解密Handler,指定加解密字段
package com.gongqibing.turnright.application.util.encrypthandler;
import com.qibingdaojia.encrypt.util.TurnRightEncryptUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Objects;
@MappedJdbcTypes(JdbcType.VARCHAR)
public class NeedEncryptAttributeHandler extends BaseTypeHandler<String> {
private static final String RETURN_NULL_SIGN = null;
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
if (StringUtils.isEmpty(parameter)) {
ps.setString(i, RETURN_NULL_SIGN);
return;
}
//加密,使用通用方法
String encrypt = TurnRightEncryptUtil.encrypt(parameter);
ps.setString(i, encrypt);
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return decrypt(rs.getString(columnName));
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return decrypt(rs.getString(columnIndex));
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return decrypt(cs.getString(columnIndex));
}
public String decrypt(String value) {
if (Objects.isNull(value)) {
return RETURN_NULL_SIGN;
}
return TurnRightEncryptUtil.decrypt(value);
}
}
3.在实体类中需要加解密的字段添加上typeHandler,指定使用处理器
4.简单测试(使用dubug,跟着流程看到的效果更好,只要走到NeedEncryptAttributeHandler类,说明以及拦截到)