摘要:配置文件一般是使用保存配置文件內容然后在配置文件中進行讀取在文件下新建文件內容如下數據庫配置文件然后接著把文件放入源碼包中配置文件讀取數據庫配置文件定義別名自定義數據處理定義數據庫信息事物管理
properties配置文件
一般是使用properties保存配置文件內容,然后在mybatis配置文件中進行讀取
在resource文件下新建db.properties文件
內容如下
# 數據庫配置文件 driver = com.mysql.cj.jdbc.Driver url = jdbc:mysql:// /mybatis username = password =
然后,接著把文件放入源碼包中
配置mybatis-config.xml文件
目錄結構如下
生產環境的數據庫密碼都為加密密碼,需要在使用的時候,把加密密碼解密成為明文
先創建數據庫密碼類
package com.ming.Util; import javax.crypto.*; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.security.*; import java.util.Base64; public class Decode { /** * 生成秘鑰 * @param * @return */ public static String generateDecode() throws UnsupportedEncodingException { KeyGenerator keyGen = null;//密鑰生成器 try { keyGen = KeyGenerator.getInstance("DES"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } keyGen.init(56);//初始化密鑰生成器 SecretKey secretKey = keyGen.generateKey();//生成密鑰 byte[] key = secretKey.getEncoded();//密鑰字節數組 // 進行base64編碼 String encodedKey = Base64.getEncoder().encodeToString(key); return encodedKey; } /** * 進行加密 * @param string * @param key * @return */ public static String encryptionDecode(String string, String key){ //System.out.println(System.getenv("KEYWORDES")); SecretKey secretKey = new SecretKeySpec(Base64.getDecoder().decode(key), "DES");//恢復密鑰 Cipher cipher = null;//Cipher完成加密或解密工作類 try { cipher = Cipher.getInstance("DES"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } try { cipher.init(Cipher.ENCRYPT_MODE, secretKey);//對Cipher初始化,加密模式 } catch (InvalidKeyException e) { e.printStackTrace(); } byte[] cipherByte = null; try { cipherByte = cipher.doFinal(Base64.getDecoder().decode(string));//加密data } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return Base64.getEncoder().encodeToString(cipherByte); } public static String decryptDecode(String string, String key){ SecretKey secretKey = new SecretKeySpec(Base64.getDecoder().decode(key), "DES");//恢復密鑰 Cipher cipher = null;//Cipher完成加密或解密工作類 try { cipher = Cipher.getInstance("DES"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } try { cipher.init(Cipher.DECRYPT_MODE, secretKey);//對Cipher初始化,解密模式 } catch (InvalidKeyException e) { e.printStackTrace(); } byte[] cipherByte = new byte[0];//解密data try { cipherByte = cipher.doFinal(Base64.getDecoder().decode(string)); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return Base64.getEncoder().encodeToString(cipherByte); } }
該類有三個方法,為加密data,解密data,生成key
然后編輯操作系統環境變量
達到輸入
? ~ echo $KEYWORDES
可以輸出環境變量
接著再次修改SqlSessionFactoryUtil類
package com.ming.Util; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.Properties; /** * @author ming * 構建SqlSessionFactory * 由于數據庫連接是寶貴的,需要對數據庫連接統一管理,所以使用單例進行管理 * 這里的單利使用的雙重鎖 * SqlSessionFactory為線程不安全類型需要加鎖,確保同一時刻,只有一個線程可以使用該對象 */ public class SqlSessionFactoryUtil { /** * SqlSessionFactory對象 */ private static SqlSessionFactory sqlSessionFactory = null; /** * 類線程鎖 */ private static final Class CLASS_LOCK = SqlSessionFactoryUtil.class; /** * 日志管理類 */ private static final Logger logger = LogManager.getLogger(); /** * 單例 */ private SqlSessionFactoryUtil(){ } /** * @return SqlSessionFactory * 初始化SqlSessionFactory對象 */ public static SqlSessionFactory initSqlSessionFactory(){ // 獲得輸入流 InputStream cfgStream = null; // 閱讀流 Reader cfgReader = null; InputStream proStream = null; Reader proReader = null; // 持久化屬性集 Properties properties = null; try{ // 配置文件流 cfgStream = Resources.getResourceAsStream("mybatis-config.xml"); // 獲得閱讀流 cfgReader = new InputStreamReader(cfgStream); // 讀入屬性文件 proStream = Resources.getResourceAsStream("db.properties"); proReader = new InputStreamReader(proStream); // 持久化屬性集 properties = new Properties(); // 流轉載進入屬性集合 properties.load(proReader); }catch (Exception e){ logger.error(e); } if(sqlSessionFactory == null){ synchronized (CLASS_LOCK){ sqlSessionFactory = new SqlSessionFactoryBuilder().build(cfgReader, properties); } } return sqlSessionFactory; } /** * 打開SqlSession * @return SqlSession */ public static SqlSession openSqlSesion(){ // 判空處理 if(sqlSessionFactory == null){ initSqlSessionFactory(); } return sqlSessionFactory.openSession(); } }
接著,再次對密碼進行加密,在讀取的時候,對閱讀流的結果集進行持久化設置
先對db.properties數據庫密碼進行加密
更改以后配置文件如下
# 數據庫配置文件 driver = com.mysql.cj.jdbc.Driver url = jdbc:mysql://47.94.95.84:32786/mybatis username = mybatis password = 8GgwaJCtTXLGItiYF9c4mg==
接著再次更改Util類
package com.ming.Util; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.Properties; /** * @author ming * 構建SqlSessionFactory * 由于數據庫連接是寶貴的,需要對數據庫連接統一管理,所以使用單例進行管理 * 這里的單利使用的雙重鎖 * SqlSessionFactory為線程不安全類型需要加鎖,確保同一時刻,只有一個線程可以使用該對象 */ public class SqlSessionFactoryUtil { /** * SqlSessionFactory對象 */ private static SqlSessionFactory sqlSessionFactory = null; /** * 類線程鎖 */ private static final Class CLASS_LOCK = SqlSessionFactoryUtil.class; /** * 日志管理類 */ private static final Logger logger = LogManager.getLogger(); /** * 單例 */ private SqlSessionFactoryUtil(){ } /** * @return SqlSessionFactory * 初始化SqlSessionFactory對象 */ public static SqlSessionFactory initSqlSessionFactory(){ // 獲得輸入流 InputStream cfgStream = null; // 閱讀流 Reader cfgReader = null; InputStream proStream = null; Reader proReader = null; // 持久化屬性集 Properties properties = null; try{ // 配置文件流 cfgStream = Resources.getResourceAsStream("mybatis-config.xml"); // 獲得閱讀流 cfgReader = new InputStreamReader(cfgStream); // 讀入屬性文件 proStream = Resources.getResourceAsStream("db.properties"); proReader = new InputStreamReader(proStream); // 持久化屬性集 properties = new Properties(); // 流裝載進入屬性集合 properties.load(proReader); // 獲取當前系統ENV String key = System.getenv("KEYWORDES"); // 進行解密 properties.setProperty("password", Decode.decryptDecode(properties.getProperty("password"), key)); }catch (Exception e){ logger.error(e); } if(sqlSessionFactory == null){ synchronized (CLASS_LOCK){ sqlSessionFactory = new SqlSessionFactoryBuilder().build(cfgReader, properties); } } return sqlSessionFactory; } /** * 打開SqlSession * @return SqlSession */ public static SqlSession openSqlSesion(){ // 判空處理 if(sqlSessionFactory == null){ initSqlSessionFactory(); } return sqlSessionFactory.openSession(); } }
書寫單元測試
package com.ming.Util; import org.junit.Test; import static org.junit.Assert.*; public class SqlSessionFactoryUtilTest { @Test public void initSqlSessionFactory() { } @Test public void openSqlSesion() { SqlSessionFactoryUtil.openSqlSesion(); } }
目前的目錄結構
此時執行單元測試,可以發現單元測試已經通過
控制臺打印出log信息
2019-04-11 17:17:37.357 [DEBUG] org.apache.ibatis.logging.LogFactory.setImplementation(LogFactory.java:105) - Logging initialized using "class org.apache.ibatis.logging.log4j2.Log4j2Impl" adapter. 2019-04-11 17:17:37.403 [DEBUG] org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:334) - PooledDataSource forcefully closed/removed all connections. 2019-04-11 17:17:37.403 [DEBUG] org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:334) - PooledDataSource forcefully closed/removed all connections. 2019-04-11 17:17:37.404 [DEBUG] org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:334) - PooledDataSource forcefully closed/removed all connections. 2019-04-11 17:17:37.404 [DEBUG] org.apache.ibatis.datasource.pooled.PooledDataSource.forceCloseAll(PooledDataSource.java:334) - PooledDataSource forcefully closed/removed all connections. Process finished with exit code 0
發現錯誤,修改加密類
package com.ming.Util; import javax.crypto.*; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.security.*; import java.util.Base64; public class Decode { /** * 生成秘鑰 * @param * @return */ public static String generateDecode() throws UnsupportedEncodingException { KeyGenerator keyGen = null;//密鑰生成器 try { keyGen = KeyGenerator.getInstance("DES"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } keyGen.init(56);//初始化密鑰生成器 SecretKey secretKey = keyGen.generateKey();//生成密鑰 byte[] key = secretKey.getEncoded();//密鑰字節數組 // 進行base64編碼 String encodedKey = Base64.getEncoder().encodeToString(key); return encodedKey; } /** * 進行加密 * @param string * @param key * @return */ public static String encryptionDecode(String string, String key){ SecretKey secretKey = new SecretKeySpec(Base64.getDecoder().decode(key), "DES");//恢復密鑰 Cipher cipher = null;//Cipher完成加密或解密工作類 try { cipher = Cipher.getInstance("DES"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } try { cipher.init(Cipher.ENCRYPT_MODE, secretKey);//對Cipher初始化,加密模式 } catch (InvalidKeyException e) { e.printStackTrace(); } byte[] cipherByte = null; try { cipherByte = cipher.doFinal(string.getBytes());//加密data } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return Base64.getEncoder().encodeToString(cipherByte); } /** * 進行解密 * @param string * @param key * @return */ public static String decryptDecode(String string, String key){ SecretKey secretKey = new SecretKeySpec(Base64.getDecoder().decode(key), "DES");//恢復密鑰 Cipher cipher = null;//Cipher完成加密或解密工作類 try { cipher = Cipher.getInstance("DES"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } try { cipher.init(Cipher.DECRYPT_MODE, secretKey);//對Cipher初始化,解密模式 } catch (InvalidKeyException e) { e.printStackTrace(); } byte[] cipherByte = new byte[0];//解密data try { cipherByte = cipher.doFinal(Base64.getDecoder().decode(string)); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return new String(cipherByte); } }
再次運行,可以發現已經成功執行sql語句
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77583.html
摘要:這里使用的是數據庫啟動類上加上注解在啟動類中添加對包掃描掃描多個包下的可以有以下幾種方法掃描會自動加載相關配置,數據源就會自動注入到中,會自動注入到中,可以直接使用。有配置文件下的使用掃描多個包下的可以有以下幾種方法掃描 Spring-Boot 學習筆記 1 Spring-Boot 介紹 1.1 什么是Spring-Boot Spring-Boot是由Pivotal團隊提供的全新框架...
摘要:項目介紹在之前的整合項目之后,更加完善功能,之前的代碼不予展示與介紹,想了解的請參考整合項目項目代碼獲取功能新增用戶注冊登錄錯誤次數限制使用作緩存注解配置引入數據校驗使用統一異常處理配置項目結構代碼控制層,以下展示注冊和登錄功能會跳到我們自 shiro項目介紹 在之前的shiro整合項目之后,更加完善shiro功能,之前的代碼不予展示與介紹,想了解的請參考shiro整合項目項目代碼獲取...
摘要:通過整合及可以實現數據庫查詢后將數據持久化。但是可能出現幻像讀這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。 所需技術:spring、mybatis、druid、flyway、logback、nodejs、html、css3 ;目標:創建一個業務框架,后端采用spring+mybatis,中間層采用node,前端html5,css3等; showImg(https:/...
摘要:概述本章學習查詢的一對一關系的多種實現方式。本系列文章是基于版本。總結本文介紹了一對一映射的三種方法,希望對大家有幫助。最后創建了群方便大家交流,可掃描加入,同時也可加我,共同學習共同進步,謝謝 概述 本章學習Mybatis查詢的一對一關系的多種實現方式。 本系列文章是基于Mybatis 3.4.6 版本。 創建表 創建測試使用的數據庫表,使用用戶表和用戶身份證表進行測試,用戶表與身份...
摘要:概述上一篇針對進行了入門體驗,本節將繼續介紹基本映射單表查詢。本系列文章是基于版本。總結本節實例了基本查詢及映射,這些也是實際工作中用的最多的功能,雖然簡單,日積月累會構建起我們的知識結構和體系,一步一步來。。。 概述 上一篇針對Mybatis進行了入門體驗,本節將繼續介紹Mybatis基本映射--單表查詢。 本系列文章是基于Mybatis 3.4.6 版本。 創建表 針對于上一節,我...
閱讀 5030·2021-09-07 09:58
閱讀 781·2019-08-30 15:55
閱讀 2909·2019-08-30 15:55
閱讀 915·2019-08-30 15:53
閱讀 1549·2019-08-29 12:57
閱讀 1796·2019-08-26 13:46
閱讀 559·2019-08-26 11:00
閱讀 3658·2019-08-23 15:42