欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用Java實現(xiàn)動態(tài)加載數(shù)據(jù)庫

 更新時間:2023年10月26日 08:26:28   作者:xyy123  
這篇文章主要為大家詳細介紹了一個java小案例,即動態(tài)加載數(shù)據(jù)庫信息,文中的示例代碼簡潔易懂,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下

環(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)文章

  • Java實現(xiàn)有限狀態(tài)機的推薦方案分享

    Java實現(xiàn)有限狀態(tài)機的推薦方案分享

    有限狀態(tài)機又稱有限狀態(tài)自動機,簡稱狀態(tài)機,是表示有限個狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的數(shù)學(xué)模型,這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)有限狀態(tài)機的推薦方案,需要的朋友可以參考下
    2021-11-11
  • Springboot2 session設(shè)置超時時間無效的解決

    Springboot2 session設(shè)置超時時間無效的解決

    這篇文章主要介紹了Springboot2 session設(shè)置超時時間無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Mybatis實現(xiàn)增刪改查及分頁查詢的方法

    Mybatis實現(xiàn)增刪改查及分頁查詢的方法

    MyBatis是支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持 久層框架,通過本文給大家介紹Mybatis實現(xiàn)增刪改查及分頁查詢的方法,感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • ArrayList在for循環(huán)中使用remove方法移除元素方法介紹

    ArrayList在for循環(huán)中使用remove方法移除元素方法介紹

    這篇文章主要介紹了ArrayList在for循環(huán)中使用remove方法移除元素的內(nèi)容,介紹了具體代碼實現(xiàn),需要的朋友可以參考下。
    2017-09-09
  • 解析JavaSe的抽象類和接口

    解析JavaSe的抽象類和接口

    這篇文章主要為大家詳細介紹了JavaSe的抽象類和接口,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • mybatis調(diào)用mysql存儲過程并獲取返回值方式

    mybatis調(diào)用mysql存儲過程并獲取返回值方式

    這篇文章主要介紹了mybatis調(diào)用mysql存儲過程并獲取返回值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • JavaWeb ServletConfig作用及原理分析講解

    JavaWeb ServletConfig作用及原理分析講解

    ServletConfig對象,叫Servlet配置對象。主要用于加載配置文件的初始化參數(shù)。我們知道一個Web應(yīng)用里面可以有多個servlet,如果現(xiàn)在有一份數(shù)據(jù)需要傳給所有的servlet使用,那么我們就可以使用ServletContext對象了
    2022-10-10
  • spring注入在有常量的情況下使用@AllArgsConstructor操作

    spring注入在有常量的情況下使用@AllArgsConstructor操作

    這篇文章主要介紹了spring注入在有常量的情況下使用@AllArgsConstructor操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java消息隊列中的Kafka如何保證冪等性

    Java消息隊列中的Kafka如何保證冪等性

    這篇文章主要介紹了Java消息隊列中的Kafka如何保證冪等性,Kafka是一種消息隊列,主要用來處理大量數(shù)據(jù)狀態(tài)下的消息隊列,一般用來做日志的處理,既然是消息隊列,那么Kafka也就擁有消息隊列的相應(yīng)的特性了,需要的朋友可以參考下
    2023-07-07
  • Fastjson 常用API介紹及下載地址(推薦)

    Fastjson 常用API介紹及下載地址(推薦)

    Fastjson是一個Java語言編寫的高性能功能完善的JSON庫。接下來通過本文給大家分享Fastjson 常用API介紹及下載地址,感興趣的朋友一起看看吧
    2017-11-11

最新評論