利用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 {
// 判斷當前環(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è)置當前環(huán)境為測試環(huán)境


設(shè)置當前環(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-07
ArrayList在for循環(huán)中使用remove方法移除元素方法介紹
這篇文章主要介紹了ArrayList在for循環(huán)中使用remove方法移除元素的內(nèi)容,介紹了具體代碼實現(xiàn),需要的朋友可以參考下。2017-09-09
mybatis調(diào)用mysql存儲過程并獲取返回值方式
這篇文章主要介紹了mybatis調(diào)用mysql存儲過程并獲取返回值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
JavaWeb ServletConfig作用及原理分析講解
ServletConfig對象,叫Servlet配置對象。主要用于加載配置文件的初始化參數(shù)。我們知道一個Web應(yīng)用里面可以有多個servlet,如果現(xiàn)在有一份數(shù)據(jù)需要傳給所有的servlet使用,那么我們就可以使用ServletContext對象了2022-10-10
spring注入在有常量的情況下使用@AllArgsConstructor操作
這篇文章主要介紹了spring注入在有常量的情況下使用@AllArgsConstructor操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

