利用Java实现动态加载数据库
作者:xyy123
这篇文章主要为大家详细介绍了一个java小案例,即动态加载数据库信息,文中的示例代码简洁易懂,具有一定的学习价值,感兴趣的小伙伴可以了解一下
环境搭建
创建application.properties
,内容为数据库信息,账号密码已加密(加密参考开头链接)
# 测试数据库信息 db1.dev.dbname = dev_db db1.dev.username = MTN5u+gCyJI4zhXkJreKpA== db1.dev.password = Rlsy5KIMbP73BLKKWEvkPw== # 生产数据库信息 db1.pro.dbname = pro_db db1.pro.username = MTN5u+gCyJI4zhXkJreKpA== db1.pro.password = wiv2NB5Tr24P0qKQTXerYg==
创建DBUtil
工具类,动态加载数据库信息
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() { // 读取机器环境 String env = System.getenv("Env"); if("dev".equals(env)) { // 测试环境 return false; } // 生产环境 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 { // 判断当前环境 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; } }
创建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 待加密的数据 * @return 加密后的数据,使用Base64编码 */ public static String encrypt(String data) throws Exception { // 将AES密钥转换为SecretKeySpec对象 SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM); // 将AES初始化向量转换为IvParameterSpec对象 IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes()); // 根据加密算法获取加密器 Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION); // 初始化加密器,设置加密模式、密钥和初始化向量 cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); // 加密数据 byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); // 对加密后的数据使用Base64编码 return Base64.getEncoder().encodeToString(encryptedData); } /** * AES解密 * * @param encryptedData 加密后的数据,使用Base64编码 * @return 解密后的数据 */ public static String decrypt(String encryptedData) throws Exception { // 将AES密钥转换为SecretKeySpec对象 SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM); // 将AES初始化向量转换为IvParameterSpec对象 IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes()); // 根据加密算法获取解密器 Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION); // 初始化解密器,设置解密模式、密钥和初始化向量 cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); // 对加密后的数据使用Base64解码 byte[] decodedData = Base64.getDecoder().decode(encryptedData); // 解密数据 byte[] decryptedData = cipher.doFinal(decodedData); // 返回解密后的数据 return new String(decryptedData, StandardCharsets.UTF_8); } }
测试
设置当前环境为测试环境
设置当前环境为生产环境
到此这篇关于利用Java实现动态加载数据库的文章就介绍到这了,更多相关java动态加载数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!