创建加解密处理器继承BaseTypeHandler并实现其中方法
在实体类中开启
autoResultMap = true
在需要加密的字段上添加
@TableField(typeHandler = EncryptFieldTypeHandler.class)
本文使用的加密为 SM4
使用的是工具是HutTool
import com.sxgis.forestywzt.common.core.utils.StringUtils;
import com.sxgis.forestywzt.common.encrypt.utils.EncryptUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 字段加密处理
* 该类主要用于数据库字段的加密和解密操作,继承自BaseTypeHandler,并实现了对String类型的操作
* @author zhangYK
*/
@MappedTypes({String.class})
public class EncryptFieldTypeHandler extends BaseTypeHandler<String> {
// 加密密钥
private static final String KEY = "sxsgdzbphjgpt@24";
/**
* 设置非空参数
* 该方法主要用于在向数据库插入或更新数据时,对字符串类型的字段进行加密处理
*
* @param ps PreparedStatement对象,用于执行SQL语句
* @param i 参数索引
* @param parameter 待处理的参数值
* @param jdbcType 数据库类型,此处未使用
* @throws SQLException 如果设置参数过程中发生错误
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
if (StringUtils.isEmpty(parameter)) {
ps.setString(i, null);
return;
}
ps.setString(i, EncryptUtils.encryptBySm4(parameter,KEY));
}
/**
* 获取可空结果
* 该方法主要用于在查询数据库时,对结果集中的字符串类型的字段进行解密处理
*
* @param rs ResultSet对象,包含查询结果
* @param columnName 结果集中的列名
* @return 解密后的字符串
* @throws SQLException 如果获取结果过程中发生错误
*/
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return EncryptUtils.decryptBySm4(rs.getString(columnName), KEY);
}
/**
* 获取可空结果
* 该方法与上一个getNullableResult功能相同,只是参数不同,用于根据列索引获取并解密字段值
*
* @param rs ResultSet对象,包含查询结果
* @param columnIndex 结果集中的列索引
* @return 解密后的字符串
* @throws SQLException 如果获取结果过程中发生错误
*/
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return EncryptUtils.decryptBySm4(rs.getString(columnIndex), KEY);
}
/**
* 获取可空结果
* 该方法与前两个getNullableResult功能相同,适用于存储过程的调用,根据列索引获取并解密字段值
*
* @param cs CallableStatement对象,用于执行存储过程
* @param columnIndex 结果集中的列索引
* @return 解密后的字符串
* @throws SQLException 如果获取结果过程中发生错误
*/
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return EncryptUtils.decryptBySm4(cs.getString(columnIndex), KEY);
}
}
注意点:
- 需要在实体类上添加
@TableName(autoResultMap = true)
- 在需要加密的字段上添加
@TableField(typeHandler = EncryptFieldTypeHandler.class)
- 对于自定义sql在XML中需要定义字段的
typrHandler
否则字段不能正常加解密
<resultMap type="com.ruoyi.domain.vo.SysUserVo" id="SysUserResult">
<result property="phonenumber" column="phonenumber" typeHandler="com.ruoyi.common.mybatis.handler.EncryptFieldTypeHandler"/>
</resultMap>
评论区