利用Java實現(xiàn)動態(tài)加載數(shù)據(jù)庫
環(huán)境搭建
創(chuàng)建application.properties
,內(nèi)容為數(shù)據(jù)庫信息,賬號密碼已加密(加密參考開頭鏈接)
# 測試數(shù)據(jù)庫信息 db1.dev.dbname = dev_db db1.dev.username = MTN5u+gCyJI4zhXkJreKpA== db1.dev.password = Rlsy5KIMbP73BLKKWEvkPw== # 生產(chǎn)數(shù)據(jù)庫信息 db1.pro.dbname = pro_db db1.pro.username = MTN5u+gCyJI4zhXkJreKpA== db1.pro.password = wiv2NB5Tr24P0qKQTXerYg==
創(chuàng)建DBUtil
工具類,動態(tài)加載數(shù)據(jù)庫信息
package demo1; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Properties; public class DBUtil { private static boolean isProduction() { // 讀取機器環(huán)境 String env = System.getenv("Env"); if("dev".equals(env)) { // 測試環(huán)境 return false; } // 生產(chǎn)環(huán)境 return true; } private static String getInfo(String value) throws IOException { InputStream inputStream = Main.class.getResourceAsStream("/application.properties") ; Properties properties = new Properties(); properties.load(inputStream); String property = properties.getProperty(value); return property; } public static HashMap<String, String> getDBInfo() throws Exception { // 判斷當(dāng)前環(huán)境 String env = isProduction()? "pro":"dev"; String dbname = "db1." + env + ".dbname"; String username = "db1." + env + ".username"; String password = "db1." + env + ".password"; HashMap<String, String> res = new HashMap<String, String>(); res.put("dbname", getInfo(dbname)); res.put("username",EncryptUtil.decrypt( getInfo(username))); res.put("password", EncryptUtil.decrypt(getInfo(password))); return res; } }
創(chuàng)建EncryptUtil
加密工具類
package demo1; import java.nio.charset.StandardCharsets; import java.util.Base64; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class EncryptUtil { private static final String AES_ALGORITHM = "AES"; // AES加密模式為CBC,填充方式為PKCS5Padding private static final String AES_TRANSFORMATION = "AES/CBC/PKCS5Padding"; // AES密鑰為16位 private static final String AES_KEY = System.getenv("AES_KEY"); // AES初始化向量為16位 private static final String AES_IV = System.getenv("AES_IV"); /** * AES加密 * * @param data 待加密的數(shù)據(jù) * @return 加密后的數(shù)據(jù),使用Base64編碼 */ public static String encrypt(String data) throws Exception { // 將AES密鑰轉(zhuǎn)換為SecretKeySpec對象 SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM); // 將AES初始化向量轉(zhuǎn)換為IvParameterSpec對象 IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes()); // 根據(jù)加密算法獲取加密器 Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION); // 初始化加密器,設(shè)置加密模式、密鑰和初始化向量 cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); // 加密數(shù)據(jù) byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); // 對加密后的數(shù)據(jù)使用Base64編碼 return Base64.getEncoder().encodeToString(encryptedData); } /** * AES解密 * * @param encryptedData 加密后的數(shù)據(jù),使用Base64編碼 * @return 解密后的數(shù)據(jù) */ public static String decrypt(String encryptedData) throws Exception { // 將AES密鑰轉(zhuǎn)換為SecretKeySpec對象 SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM); // 將AES初始化向量轉(zhuǎn)換為IvParameterSpec對象 IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes()); // 根據(jù)加密算法獲取解密器 Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION); // 初始化解密器,設(shè)置解密模式、密鑰和初始化向量 cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); // 對加密后的數(shù)據(jù)使用Base64解碼 byte[] decodedData = Base64.getDecoder().decode(encryptedData); // 解密數(shù)據(jù) byte[] decryptedData = cipher.doFinal(decodedData); // 返回解密后的數(shù)據(jù) return new String(decryptedData, StandardCharsets.UTF_8); } }
測試
設(shè)置當(dāng)前環(huán)境為測試環(huán)境
設(shè)置當(dāng)前環(huán)境為生產(chǎn)環(huán)境
到此這篇關(guān)于利用Java實現(xiàn)動態(tài)加載數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)java動態(tài)加載數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot2 session設(shè)置超時時間無效的解決
這篇文章主要介紹了Springboot2 session設(shè)置超時時間無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07ArrayList在for循環(huán)中使用remove方法移除元素方法介紹
這篇文章主要介紹了ArrayList在for循環(huán)中使用remove方法移除元素的內(nèi)容,介紹了具體代碼實現(xiàn),需要的朋友可以參考下。2017-09-09mybatis調(diào)用mysql存儲過程并獲取返回值方式
這篇文章主要介紹了mybatis調(diào)用mysql存儲過程并獲取返回值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08JavaWeb ServletConfig作用及原理分析講解
ServletConfig對象,叫Servlet配置對象。主要用于加載配置文件的初始化參數(shù)。我們知道一個Web應(yīng)用里面可以有多個servlet,如果現(xiàn)在有一份數(shù)據(jù)需要傳給所有的servlet使用,那么我們就可以使用ServletContext對象了2022-10-10spring注入在有常量的情況下使用@AllArgsConstructor操作
這篇文章主要介紹了spring注入在有常量的情況下使用@AllArgsConstructor操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09