利用Java实现动态加载数据库

 更新时间:2023年10月26日 08:26:28   作者: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动态加载数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现有限状态机的推荐方案分享

    Java实现有限状态机的推荐方案分享

    有限状态机又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型,这篇文章主要给大家介绍了关于Java实现有限状态机的推荐方案,需要的朋友可以参考下
    2021-11-11
  • Springboot2 session设置超时时间无效的解决

    Springboot2 session设置超时时间无效的解决

    这篇文章主要介绍了Springboot2 session设置超时时间无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Mybatis实现增删改查及分页查询的方法

    Mybatis实现增删改查及分页查询的方法

    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持 久层框架,通过本文给大家介绍Mybatis实现增删改查及分页查询的方法,感兴趣的朋友一起学习吧
    2016-01-01
  • ArrayList在for循环中使用remove方法移除元素方法介绍

    ArrayList在for循环中使用remove方法移除元素方法介绍

    这篇文章主要介绍了ArrayList在for循环中使用remove方法移除元素的内容,介绍了具体代码实现,需要的朋友可以参考下。
    2017-09-09
  • 解析JavaSe的抽象类和接口

    解析JavaSe的抽象类和接口

    这篇文章主要为大家详细介绍了JavaSe的抽象类和接口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • mybatis调用mysql存储过程并获取返回值方式

    mybatis调用mysql存储过程并获取返回值方式

    这篇文章主要介绍了mybatis调用mysql存储过程并获取返回值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • JavaWeb ServletConfig作用及原理分析讲解

    JavaWeb ServletConfig作用及原理分析讲解

    ServletConfig对象,叫Servlet配置对象。主要用于加载配置文件的初始化参数。我们知道一个Web应用里面可以有多个servlet,如果现在有一份数据需要传给所有的servlet使用,那么我们就可以使用ServletContext对象了
    2022-10-10
  • spring注入在有常量的情况下使用@AllArgsConstructor操作

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

    这篇文章主要介绍了spring注入在有常量的情况下使用@AllArgsConstructor操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java消息队列中的Kafka如何保证幂等性

    Java消息队列中的Kafka如何保证幂等性

    这篇文章主要介绍了Java消息队列中的Kafka如何保证幂等性,Kafka是一种消息队列,主要用来处理大量数据状态下的消息队列,一般用来做日志的处理,既然是消息队列,那么Kafka也就拥有消息队列的相应的特性了,需要的朋友可以参考下
    2023-07-07
  • Fastjson 常用API介绍及下载地址(推荐)

    Fastjson 常用API介绍及下载地址(推荐)

    Fastjson是一个Java语言编写的高性能功能完善的JSON库。接下来通过本文给大家分享Fastjson 常用API介绍及下载地址,感兴趣的朋友一起看看吧
    2017-11-11

最新评论