侧边栏壁纸
博主头像
小白不想白 博主等级

行动起来,活在当下

  • 累计撰写 16 篇文章
  • 累计创建 5 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

MyBatis-Plus实现字段加密/解密

小白不想白
2025-01-08 / 0 评论 / 0 点赞 / 1 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

创建加解密处理器继承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>
0

评论区