问题说明
因为表中有一个字段涉及到用户的银行卡,身份证号等关键信息,所以为了防止sql注入所以要进行加解密,本来想直接在实体类的GET SET
方法做操作,结果发现mybatis 查询和添加的时候都会调用GET SET方法所以不合理,选择直接在Mybatis层面做处理
解决方案
创建一个 TypeHandler
继承BaseTypeHandler
这里面就是普通的AES加密可以随意替换,主要就是做加密和解密,这个类也可以用作数据替换,具体方法应该是一样的
package com.lf.gas_platform.common.utils;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
public class TypeHandler extends BaseTypeHandler<Object> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType)
throws SQLException {
ps.setString(i, JsonParam.AesEncryption((String)parameter));
}
@Override
public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
String columnValue = rs.getString(columnName);
return JsonParam.AesDecrypt(columnValue);
}
@Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String columnValue = rs.getString(columnIndex);
return JsonParam.AesDecrypt(columnValue);
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
String columnValue = cs.getString(columnIndex);
return JsonParam.AesDecrypt(columnValue);
}
}
实体类不用做任何的操作,主要在mapper.xml里面配置
将要加解密的字段 添加 typeHandler 后面就是上面的类路径,这是查询的时候返回的结果集里面添加
修改、删除、添加 都是一样