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

mybatis類型轉(zhuǎn)換器如何實現(xiàn)數(shù)據(jù)加解密

 更新時間:2021年09月23日 10:05:21   作者:userwyh  
這篇文章主要介紹了mybatis類型轉(zhuǎn)換器如何實現(xiàn)數(shù)據(jù)加解密,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

mybatis類型轉(zhuǎn)換器數(shù)據(jù)加解密

背景需求

對表中的某些字段進行加密,查詢之后對字段進行解密,業(yè)務代碼無需關(guān)注加解密環(huán)節(jié)。

mybatis 攔截器 vs 類型轉(zhuǎn)換器

mybatis的攔截器能實現(xiàn)上面的需求,但是會攔截所有的sql語句,如果項目中只是部分sql涉及到加解密操作,還是比較犧牲大局的。實現(xiàn)起來也比較麻煩,特別是單參數(shù)查詢的時候,比如參數(shù)名稱name,此時需要對name進行加密就相對困難。如果是多參數(shù),因為底層會將參數(shù)封裝成Map,可以根據(jù)是否含有指定的key進行加密。

mybatis類型轉(zhuǎn)換器也可以實現(xiàn)上面的需求,方案為修改xml里面的配置,指定類型轉(zhuǎn)換器,并在轉(zhuǎn)換器里面實現(xiàn)數(shù)據(jù)的加解密。

mybatis 類型轉(zhuǎn)換器

java有java的數(shù)據(jù)類型,數(shù)據(jù)庫有數(shù)據(jù)庫的數(shù)據(jù)類型,那么我們在往數(shù)據(jù)庫中插入數(shù)據(jù)的時候是如何把java類型當做數(shù)據(jù)庫類型插入數(shù)據(jù)庫,在從數(shù)據(jù)庫讀取數(shù)據(jù)的時候又是如何把數(shù)據(jù)庫類型當做java類型來處理呢?這中間必然要經(jīng)過一個類型轉(zhuǎn)換。

mybatis提供了TypeHandler接口,抽象類BaseTypeHandler實現(xiàn)TypeHandler接口,String,Integer,Long等常見的數(shù)據(jù)類型轉(zhuǎn)換都是基于繼承BaseTypeHandler實現(xiàn),BaseTypeHandler提供了基本的判空等操作。因此我們可以繼承BaseTypeHandler或者實現(xiàn)TypeHandler接口完成自定義類型轉(zhuǎn)換,一般建議繼承BaseTypeHandler來編碼。

數(shù)據(jù)加解密類型轉(zhuǎn)換

假設(shè)加解密采用AES算法,此處對加解密結(jié)果做一下緩存,因為一些數(shù)據(jù)是一樣的,如果每次都去加密,也是會消耗一定的時間

public class DataSecurityHandler extends BaseTypeHandler {
    public static final LoadingCache<String, String> ENCRYPT_CACHE = CacheBuilder.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES).build(new CacheLoader<String, String>() {
        public String load(String parameterValue) {
            return AES.encrypt(parameterValue);
        }
    });
    public static final LoadingCache<String, String> DECRYPT_CACHE = CacheBuilder.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES).build(new CacheLoader<String, String>() {
        public String load(String parameterValue) {
            return AES.decrypt(parameterValue);
        }
    });
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object parameter, JdbcType jdbcType) throws SQLException {
        String parameterValue = (String) parameter;
        String resultValue = ENCRYPT_CACHE.getUnchecked(StringUtils.trimToEmpty(parameterValue));
        preparedStatement.setString(i, resultValue);
    }
    @Override
    public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {
        return DECRYPT_CACHE.getUnchecked(StringUtils.trimToEmpty(resultSet.getString(s)));
    }
    @Override
    public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return DECRYPT_CACHE.getUnchecked(StringUtils.trimToEmpty(resultSet.getString(i)));
    }
    @Override
    public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return DECRYPT_CACHE.getUnchecked(StringUtils.trimToEmpty(callableStatement.getString(i)));
    }
}

使用方法

針對sql語句,在xml配置文件中,對需要加密的字段加上

#{name,jdbcType=VARCHAR,typeHandler=com..........DataSecurityHandler},

針對查詢結(jié)果,在xml配置文件中,在resultMap里面對需要解密的字段加上

<result column="name" property="name" jdbcType="VARCHAR" typeHandler="com.*..........DataSecurityHandler"/>

mybatis密碼解密

mybatis的配置

properties的配置

代碼:

 
package com.finance.entity.batctrl; 
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.Properties; 
import javax.sql.DataSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
 
import org.apache.commons.codec.binary.Base64;
import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;  
public class MyBatisSessionFactory { 
 
	/**
	 * session工廠
	 */
	private final static SqlSessionFactory sqlSessionFactory;
 
	/**
	 * 日志類
	 */
	private static Logger logger = LoggerFactory.getLogger(MyBatisSessionFactory.class);
 
	static {
        String resource = "mybatis-configuration.xml"; 
        //Reader reader = null;
        InputStream inputStream = null; 
        Properties props = new Properties();
        try {
            //reader = Resources.getResourceAsReader(resource);        	        	            
            InputStream in = Resources.getResourceAsStream("batch.properties");
            
            props.load(in);
            String url= props.getProperty("jdbc.url");
            String username= props.getProperty("jdbc.username");
            String password= props.getProperty("jdbc.password");
            
            logger.debug("befor url -> "+url);
            logger.debug("befor username -> "+username);
            logger.debug("befor decode -> "+password);
            
            byte[] b = Base64.decodeBase64(password.getBytes());
            String decode = new String(b);
            props.put("url",url);
            props.put("username",username);
            props.put("password",decode);
            logger.debug("after url -> "+url);
            logger.debug("after username -> "+username);
            logger.debug("after decode -> "+decode);
            inputStream = Resources.getResourceAsStream(resource);        
        } catch (IOException e) {
        }        
        
        //sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream ,props );
    }
 
	public static SqlSessionFactory getSessionFactory() {
		return sqlSessionFactory;
	} 
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java Spring @Autowired的這些騷操作,你都知道嗎

    Java Spring @Autowired的這些騷操作,你都知道嗎

    這篇文章主要介紹了徹底搞明白Spring中的自動裝配和Autowired注解的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • 一文徹底搞懂Java和JDK的版本命名問題

    一文徹底搞懂Java和JDK的版本命名問題

    今天通過本文給大家分享我對Java的版本號以及JDK的命名的了解,通過實例圖文展示給大家介紹的非常詳細,需要的朋友跟隨小編一起看看吧
    2021-06-06
  • MyBatisPlus?大數(shù)據(jù)量查詢慢的問題解決

    MyBatisPlus?大數(shù)據(jù)量查詢慢的問題解決

    本文主要介紹了MyBatis?Plus?解決大數(shù)據(jù)量查詢慢問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Mybatis-plus?sql注入及防止sql注入詳解

    Mybatis-plus?sql注入及防止sql注入詳解

    mybatis-plus提供了許多默認單表 CRUD 語句,對于其他SQL情況愛莫能助,下面這篇文章主要給大家介紹了關(guān)于Mybatis-plus?sql注入及防止sql注入的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • SpringBoot 整合 Netty 多端口監(jiān)聽的操作方法

    SpringBoot 整合 Netty 多端口監(jiān)聽的操作方法

    Netty提供異步的、基于事件驅(qū)動的網(wǎng)絡應用程序框架,用以快速開發(fā)高性能、高可靠性的網(wǎng)絡 IO 程序,是目前最流行的 NIO 框架,這篇文章主要介紹了SpringBoot 整和 Netty 并監(jiān)聽多端口,需要的朋友可以參考下
    2023-10-10
  • JAVA項目字典與緩存搭配使用方法解析

    JAVA項目字典與緩存搭配使用方法解析

    這篇文章主要介紹了JAVA項目字典與緩存搭配使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Java的sort的排序及使用詳解

    Java的sort的排序及使用詳解

    這篇文章主要為大家詳細介紹了Java的sort的排序及使用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下 ,希望您能夠多多關(guān)注
    2022-02-02
  • jdbc與druid連接池的使用詳解

    jdbc與druid連接池的使用詳解

    這篇文章主要介紹了jdbc與druid連接池的使用詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 解決maven常見錯誤:Dependency is duplicated in file(s):

    解決maven常見錯誤:Dependency is duplicated in 

    這篇文章主要介紹了解決maven常見錯誤:Dependency is duplicated in file(s):問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java裝飾者模式的示例詳解

    Java裝飾者模式的示例詳解

    裝飾者模式:在不改變原有對象的基礎(chǔ)之上,動態(tài)的將功能附加到對象上,提供了繼承更有彈性的替代方案,也體現(xiàn)了開閉原則。本文將通過示例詳細講解一下裝飾者模式,需要的可以參考一下
    2022-02-02

最新評論

东方市| 昭觉县| 海阳市| 大英县| 营口市| 翁牛特旗| 旬阳县| 吴旗县| 和田县| 治多县| 慈溪市| 锡林郭勒盟| 林西县| 巴南区| 阿克| 菏泽市| 鹿邑县| 凤阳县| 河池市| 股票| 新干县| 巴青县| 石渠县| 孟津县| 三都| 大安市| 九龙县| 阳山县| 辽中县| 什邡市| 邢台县| 维西| 阜新市| 永平县| 峨边| 鄂州市| 江陵县| 成安县| 边坝县| 阿鲁科尔沁旗| 金平|