最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis給數(shù)據(jù)庫敏感字段加解密詳解

 更新時(shí)間:2023年11月23日 09:59:06   作者:chaojunma  
這篇文章主要介紹了Mybatis給數(shù)據(jù)庫敏感字段加解密詳解,為了保護(hù)數(shù)據(jù)庫敏感字段數(shù)據(jù)安全,有時(shí)候我們需要將敏感數(shù)據(jù)加密入庫,查詢時(shí)再解密成明文,我們可以利用Mybatis自定義TypeHandler來處理,需要的朋友可以參考下

前言

為了保護(hù)數(shù)據(jù)庫敏感字段數(shù)據(jù)安全,有時(shí)候我們需要將敏感數(shù)據(jù)加密入庫,查詢時(shí)再解密成明文。

我們可以利用Mybatis自定義TypeHandler來處理,下面我們來具體實(shí)現(xiàn)一下。

定義KeyCenterUtils加解密工具類

import org.springframework.stereotype.Service;
import java.util.Base64;
 
@Service
public class KeyCenterUtils {
 
    public  String encrypt(String src) {
        try {
            String result = Base64.getEncoder().encodeToString(src.getBytes("UTF-8"));
            return result;
        } catch (Exception e) {
            throw new RuntimeException("encrypt fail!", e);
        }
    }
 
    public  String decrypt(String src) {
        try {
            byte[] asBytes = Base64.getDecoder().decode(src);
            String result = new String(asBytes, "UTF-8");
            return result;
        } catch (Exception e) {
            throw new RuntimeException("decrypt fail!", e);
        }
    }
}

自定義Handler類實(shí)現(xiàn)數(shù)據(jù)庫字段加解密

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mk.util.KeyCenterUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
@Service
public class CustomTypeHandler<T> extends BaseTypeHandler<T> {
 
    @Autowired
    private KeyCenterUtils keyCenterUtils;
 
    public CustomTypeHandler() {
    }
 
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, this.keyCenterUtils.encrypt((String)parameter));
    }
    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String columnValue = rs.getString(columnName);
        //有一些可能是空字符
        return StringUtils.isBlank(columnValue) ? (T)columnValue : (T)this.keyCenterUtils.decrypt(columnValue);
    }
 
    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String columnValue = rs.getString(columnIndex);
        return StringUtils.isBlank(columnValue) ? (T)columnValue : (T)this.keyCenterUtils.decrypt(columnValue);
    }
 
    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String columnValue = cs.getString(columnIndex);
        return StringUtils.isBlank(columnValue) ? (T)columnValue : (T)this.keyCenterUtils.decrypt(columnValue);
    }
}

因?yàn)槲矣玫氖荕ybatis-Plus,所以可以使用Mybatis-Plus的@TableField的注解通過typeHandler屬性指定上面自定義的Handler即可。

實(shí)體類添加注解

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "lemon_user", autoResultMap = true)
public class User {
 
    @TableId(type = IdType.AUTO)
    private Long id;
 
    private String username;
 
    @TableField(typeHandler = CustomTypeHandler.class)
    private String password;
 
    private String salt;
}

注意:上面的@TableName注解設(shè)置了autoResultMap = true的屬性值,這樣通過Mybatis-Plus的BaseMapper查詢出來的數(shù)據(jù)才會(huì)將加密字段進(jìn)行解密,默認(rèn)不生效。

如果不是Mybatis-Plus的 BaseMapper內(nèi)部的方法,則需要我們?cè)诓樵儠r(shí)在resultMap的屬性中指定我們自定義的typeHandler,如下:

<resultMap id="baseResultMap" type="com.mk.entity.User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="password" column="password" typeHandler="com.mk.handler.CustomTypeHandler"/>
</resultMap>
 
<select id="getUserByName" resultMap="baseResultMap">
    select * from lemon_user where username = #{username}
</select>

到此這篇關(guān)于Mybatis給數(shù)據(jù)庫敏感字段加解密詳解的文章就介紹到這了,更多相關(guān)Mybatis敏感字段加解密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • WebSocket+Vue+SpringBoot實(shí)現(xiàn)語音通話的使用示例

    WebSocket+Vue+SpringBoot實(shí)現(xiàn)語音通話的使用示例

    本文主要介紹了WebSocket+Vue+SpringBoot實(shí)現(xiàn)語音通話的使用示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • 通過實(shí)例了解java checked和unchecked異常

    通過實(shí)例了解java checked和unchecked異常

    這篇文章主要介紹了通過實(shí)例了解checked和unchecked異常,Java異常分為兩種類型,checked異常和unchecked異常,另一種叫法是異常和錯(cuò)誤。下面小編就帶大家來一起學(xué)習(xí)一下吧
    2019-06-06
  • SpringCloud之服務(wù)注冊(cè)與發(fā)現(xiàn)Spring Cloud Eureka實(shí)例代碼

    SpringCloud之服務(wù)注冊(cè)與發(fā)現(xiàn)Spring Cloud Eureka實(shí)例代碼

    這篇文章主要介紹了SpringCloud之服務(wù)注冊(cè)與發(fā)現(xiàn)Spring Cloud Eureka實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • 一文搞懂Runnable、Callable、Future、FutureTask及應(yīng)用

    一文搞懂Runnable、Callable、Future、FutureTask及應(yīng)用

    一般創(chuàng)建線程只有兩種方式,一種是繼承Thread,一種是實(shí)現(xiàn)Runnable接口,在Java1.5之后就有了Callable、Future,這二種可以提供線程執(zhí)行完的結(jié)果,本文主要介紹了Runnable、Callable、Future、FutureTask及應(yīng)用,感興趣的可以了解一下
    2023-08-08
  • Java前后端的JSON傳輸方式(前后端JSON格式轉(zhuǎn)換)

    Java前后端的JSON傳輸方式(前后端JSON格式轉(zhuǎn)換)

    這篇文章主要介紹了Java前后端的JSON傳輸方式(前后端JSON格式轉(zhuǎn)換),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Netty分布式解碼器讀取數(shù)據(jù)不完整的邏輯剖析

    Netty分布式解碼器讀取數(shù)據(jù)不完整的邏輯剖析

    這篇文章主要為大家介紹了Netty分布式解碼器讀取數(shù)據(jù)不完整的邏輯剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java多線程編程之讀寫鎖ReadWriteLock用法實(shí)例

    Java多線程編程之讀寫鎖ReadWriteLock用法實(shí)例

    這篇文章主要介紹了Java多線程編程之讀寫鎖ReadWriteLock用法實(shí)例,本文直接給出編碼實(shí)例,需要的朋友可以參考下
    2015-05-05
  • MySQL查詢字段實(shí)現(xiàn)字符串分割split功能的示例代碼

    MySQL查詢字段實(shí)現(xiàn)字符串分割split功能的示例代碼

    本文主要介紹了MySQL查詢字段實(shí)現(xiàn)字符串分割split功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • SpringCloud Feign隔離與降級(jí)詳細(xì)分析

    SpringCloud Feign隔離與降級(jí)詳細(xì)分析

    Feign是Netflix公司開發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開發(fā)非?;A(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似
    2022-11-11
  • Java圖像處理教程之正片疊底效果的實(shí)現(xiàn)

    Java圖像處理教程之正片疊底效果的實(shí)現(xiàn)

    正片疊底效果是我們平時(shí)在Photoshop中會(huì)見到的一種效果,下面這篇文章主要給大家介紹了關(guān)于利用Java如何實(shí)現(xiàn)正片疊底的效果,分享出來供大家參考學(xué)習(xí),文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友可以參考借鑒,下面來一起看看詳細(xì)的介紹吧。
    2017-09-09

最新評(píng)論

江北区| 涟水县| 花莲县| 高邑县| 会理县| 陈巴尔虎旗| 突泉县| 清新县| 柳林县| 仙桃市| 门头沟区| 龙川县| 疏勒县| 德清县| 佛坪县| 北辰区| 孙吴县| 南郑县| 新营市| 磐安县| 康定县| 迭部县| 临海市| 浮梁县| 三台县| 威信县| 班戈县| 札达县| 弥勒县| 资阳市| 贺州市| 龙山县| 桂阳县| 舟山市| 阿鲁科尔沁旗| 周口市| 金门县| 潮安县| 鸡西市| 呼玛县| 平安县|