侧边栏壁纸
博主头像
会飞的大象博主等级

爱运动的程序猿

  • 累计撰写 126 篇文章
  • 累计创建 158 个标签
  • 累计收到 0 条评论
标签搜索

目 录CONTENT

文章目录

数据库数据加密-mybaitsplus

会飞的大象
2024-10-30 / 0 评论 / 0 点赞 / 228 阅读 / 1,156 字

数据库数据加密主要通过mybtisplus的特性实现,同时mybaitsplus3.1.1不支持,仅在3.1.2以及以后进行支持

编写加密算法以及逻辑继承BaseTypeHandler类

主要实现入库与查询的逻辑,仅仅对mybaitsplus的数据库代码生效,对自己手写的在xml里的sql不生效,需要手动配置。

public class TypeHandler extends BaseTypeHandler<String> {


    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        if (ObjectUtils.isEmpty(parameter)) {
            ps.setString(i, null);
            return;
        }
        ps.setString(i, SM4Util.encrypt(parameter));
    }

    @Override
    public String getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
        return SM4Util.decrypt(resultSet.getString(columnName));
    }

    @Override
    public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return SM4Util.decrypt(resultSet.getString(i));
    }

    @Override
    public String getNullableResult(CallableStatement ca, int i) throws SQLException {
        return SM4Util.decrypt(ca.getString(i));
    }
}

实体类编写逻辑

主要表中加上@TableName(value = “TB_CA”,autoResultMap = true),其中autoResultMap = true是必加的
还有在需要进行加密的字段上加上 @TableField(typeHandler = TypeHandler.class)注解

package cn.byzk.appsignservice2.common.model;

import cn.byzk.appsignservice2.common.config.mybatis.TypeHandler;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

/**
 * ca表信息.
 *
 * @author 会飞的大象 2022-03-15
 * @version 1.0
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@TableName(value = "TB_CA",autoResultMap = true)
@KeySequence("SEQUENCE_TB_CA")
public class TbCaModel {

    /**
     * 自增id使用序列.
     */
    @TableId(value = "ID", type = IdType.INPUT)
    private Long id;

    /**
     * 公司名称.
     */
    private String companyName;

    /**
     * 根证书.
     */
    private String rootCert;

    /**
     * s
     * 官网
     */
    private String officialWebsite;

    /**
     * 详细地址
     */
    private String detailsAddress;

    /**
     * 联系人
     */
    @TableField(typeHandler = TypeHandler.class)
    private String contacts;

    /***
     * 联系方式
     */
    @TableField(typeHandler = TypeHandler.class)
    private String contactWay;


    /**
     * 户名.
     */
    private String accountName;

    /**
     * 开户银行.
     */
    private String accountBank;

    /**
     * 开户账号
     */
    private String account;


    /**
     * 收费通知单.
     */
    private String chargeNote;

    /**
     * 公司备注.
     */
    private String companyRemark;


    /**
     * 创建时间.
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 状态0正常,1删除.
     */
    private Integer status = 0;

}

手写的sql处理方式

编写resultMap,并在查询要解密的数据指定typeHandler=“cn.byzk.appsignservice2.common.config.mybatis.TypeHandler”

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.byzk.appsignservice2.common.mapper.CaMapper">
    <sql id="base">
        id
                ,company_name,root_cert,official_website,details_address,contacts,contact_way,
        account_name,account_bank,account,charge_note,company_remark,create_time,status
    </sql>

    <resultMap id="caResultMap" type="cn.byzk.appsignservice2.common.model.TbCaModel">
        <id column="id" property="id"/>
        <result column="company_name" property="companyName" />
        <result column="root_cert" property="rootCert" />
        <result column="official_website" property="officialWebsite" />
        <result column="details_address" property="detailsAddress" />
        <result column="contacts" property="contacts" typeHandler="cn.byzk.appsignservice2.common.config.mybatis.TypeHandler" />
        <result column="contact_way" property="contactWay" typeHandler="cn.byzk.appsignservice2.common.config.mybatis.TypeHandler" />
        <result column="account_name" property="accountName" />
        <result column="account_bank" property="accountBank" />
        <result column="account" property="account" />
        <result column="company_remark" property="companyRemark" />
        <result column="create_time" property="createTime" />
        <result column="status" property="status" />
    </resultMap>

    <select id="getAll" resultMap="caResultMap">
        SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM (
        select tb1.id,tb1.company_name,tb1.official_website,tb1.details_address,tb1.contacts,
        tb1.contact_way,tb1.account_name,tb1.account_bank,tb1.account,
<!--        tb2.content as charge_note,tb1.root_cert,-->
        tb1.company_remark,tb1.create_time,tb1.status from TB_CA tb1
<!--        left join TB_FILE tb2 on tb1.charge_note=tb2.unique_number-->
        <where>
            1 = 1
            <if test="caQueryDto.companyName != null and caQueryDto.companyName != '' ">
                and tb1.company_name like '%' || #{caQueryDto.companyName} || '%'
            </if>
            <if test="caQueryDto.contacts != null and caQueryDto.contacts != ''">
                and tb1.contacts like '%' || #{caQueryDto.contacts,typeHandler=cn.byzk.appsignservice2.common.config.mybatis.TypeHandler} || '%'
            </if>
        </where>
        order by tb1.create_time desc
        ) TMP ) WHERE ROW_ID &lt;=	${caQueryDto.page*caQueryDto.size} and  ROW_ID &gt; ${(caQueryDto.page - 1) * caQueryDto.size}
    </select>

    <select id="getAllCount" resultType="long">
        select count(1) from TB_CA
        <where>
            1 = 1
            <if test="caQueryDto.companyName != null and caQueryDto.companyName != '' ">
                and company_name like '%' || #{caQueryDto.companyName} || '%'
            </if>
            <if test="caQueryDto.contacts != null and caQueryDto.contacts != ''">
                and contacts like '%' || #{caQueryDto.contacts,typeHandler=cn.byzk.appsignservice2.common.config.mybatis.TypeHandler} || '%'
            </if>
        </where>
    </select>
    <select id="getInfoById" resultMap="caResultMap">
        select tb1.id,
               tb1.company_name,
               tb1.root_cert,
               tb1.official_website,
               tb1.details_address,
               tb1.contacts,
               tb1.contact_way,
               tb1.account_name,
               tb1.account_bank,
               tb1.account,
               tb2.content as charge_note,
               tb1.company_remark,
               tb1.create_time,
               tb1.status
        from TB_CA tb1
                     left join TB_FILE tb2 on tb1.charge_note = tb2.unique_number
        where
                tb1.id=#{id}
    </select>

    <select id="getAllAvailableCa" resultType="cn.byzk.appsignservice2.common.model.TbCaModel">
        select  id,company_name,company_remark,status from   TB_CA
        where status=#{status}
    </select>
</mapper>
0

评论区