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

利用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)文章

  • 解決spring @ControllerAdvice處理異常無法正確匹配自定義異常

    解決spring @ControllerAdvice處理異常無法正確匹配自定義異常

    這篇文章主要介紹了解決spring @ControllerAdvice處理異常無法正確匹配自定義異常的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring WebFlux 核心操作符之map、flatMap 與 Mono 常用方法詳解

    Spring WebFlux 核心操作符之map、flatMap 與 Mono&

    Spring WebFlux 是 Spring Framework 5.0 引入的響應(yīng)式 Web 框架,基于Project Reactor庫構(gòu)建,是基于ProjectReactor的響應(yīng)式Web框架,本文介紹Spring WebFlux 核心操作符之map、flatMap 與 Mono 常用方法,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • Java的內(nèi)存機制詳解

    Java的內(nèi)存機制詳解

    本文主要介紹了Java的內(nèi)存機制的相關(guān)知識,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03
  • 使用Java計算屏幕的PPI的方法詳解

    使用Java計算屏幕的PPI的方法詳解

    在現(xiàn)代電子設(shè)備中,屏幕的分辨率和顯示效果是用戶非常關(guān)注的一個指標(biāo),PPI(Pixels Per Inch,每英寸像素數(shù))是衡量屏幕顯示精度的重要參數(shù)之一,PPI越高,屏幕顯示的圖像越細膩,視覺效果越好,本文將詳細介紹PPI的概念、計算方法,并通過Java代碼實現(xiàn)PPI的計算
    2025-02-02
  • SpringBoot圖文并茂帶你掌握devtools熱啟動

    SpringBoot圖文并茂帶你掌握devtools熱啟動

    這篇文章主要介紹springBoot插件工具熱部署Devtools,本文分步驟給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • springcloud feign docker上無法通訊的問題及解決

    springcloud feign docker上無法通訊的問題及解決

    這篇文章主要介紹了springcloud feign docker上無法通訊的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • springboot項目部署到k8s上的方法步驟

    springboot項目部署到k8s上的方法步驟

    本文主要介紹了springboot項目部署到k8s上的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • MultipartFile中transferTo(File file)的路徑問題及解決

    MultipartFile中transferTo(File file)的路徑問題及解決

    這篇文章主要介紹了MultipartFile中transferTo(File file)的路徑問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 從JVM的內(nèi)存管理角度分析Java的GC垃圾回收機制

    從JVM的內(nèi)存管理角度分析Java的GC垃圾回收機制

    這篇文章主要介紹了從JVM的內(nèi)存管理角度分析Java的GC垃圾回收機制,帶有GC是Java語言的重要特性之一,需要的朋友可以參考下
    2015-11-11
  • SpringCloud @RefreshScope刷新機制深入探究

    SpringCloud @RefreshScope刷新機制深入探究

    RefeshScope這個注解想必大家都用過,在微服務(wù)配置中心的場景下經(jīng)常出現(xiàn),他可以用來刷新Bean中的屬性配置,那大家對他的實現(xiàn)原理了解嗎?它為什么可以做到動態(tài)刷新呢
    2023-03-03

最新評論

和顺县| 桦川县| 梁平县| 肇东市| 阿勒泰市| 炉霍县| 鱼台县| 石家庄市| 徐州市| 涪陵区| 革吉县| 辽宁省| 玉林市| 新宁县| 河北省| 富宁县| 宕昌县| 宁陕县| 宣威市| 清涧县| 长寿区| 西林县| 进贤县| 台中市| 蒙山县| 和龙市| 凤台县| 兰溪市| 盐山县| 达孜县| 土默特左旗| 沙坪坝区| 夏津县| 余姚市| 曲松县| 应城市| 通州区| 太仓市| 临高县| 桓仁| 舞钢市|