Springboot动态获取配置文件信息存入Map

本文介绍如何在Springboot中动态读取配置文件中的数据库信息,并存入Map,进而构造DataSource对象。通过使用@ConfigurationProperties和动态注入Bean,实现了配置文件中数据库数量变化时,系统无需修改代码即可自动加载所有DB。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Springboot动态获取配置文件信息存入Map

需求描述:多个数据库信息在配置文件里,数据库个数变化的时候,不修改代码就自动加载所有的DB到系统内。
具体做法:需要动态的读取配置文件里的DB信息到Map中,然后动态的构造DataSource对象,放入名为targetDataSources 的Map中,再将其动态注入Bean,完成系统数据库的初始化。这样的好处就是配置文件里的DB增加或减少了,可以不修改代码就自动加载所有的DB到系统内。
test.yml配置文件内容如下:
在这里插入图片描述
yml格式的配置信息,datasource里面有三个DB(main,DB-001,DB-002),现将三个DB读取到Map里(注意Map的名字要与配置文件中的名字对应,这里是dataSource),步骤如下:

1.构造一个类,里面的属性名和spring.datasource里的配置项名称要一致,可忽略大小写

     /*
         * @author ann.an
         * @date 2019-07-17
         * @description DB属性定义,属性与配置文件中的DB配置项对应,不对应会解析不到的哟* 
         */

    public class DBInfo {
    	private String url;
    	private String userName;
    	private String passWord;
    	private int initialSize;
    	private int maxActive;
    	private int minIdle;
    	private String bankId;
    	
    	public String getBankId() {
    		return bankId;
    	}
    	public void setBankId(String bankId) {
    		this.bankId = bankId;
    	}
    	public String getUrl() {
    		return url;
    	}
    	public void setUrl(String url) {
    		this.url = url;
    	}
    	public String getUserName() {
    		return userName;
    	}
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    	public String getPassWord() {
    		return passWord;
    	}
    	public void setPassWord(String passWord) {
    		this.passWord = passWord;
    	}
    	
    	public int getInitialSize() {
    		return initialSize;
    	}
    	public void setInitialSize(int initialSize) {
    		this.initialSize = initialSize;
    	}
    	public int getMaxActive() {
    		return maxActive;
    	}
    	public void setMaxActive(int maxActive) {
    		this.maxActive = maxActive;
    	}
    	public int getMinIdle() {
    		return minIdle;
    	}
    	public void setMinIdle(int minIdle) {
    
### 将 JSON 格式的数据存储到 MySQL 数据库 为了在 Spring Boot 项目中将 JSON 格式的对象保存至 MySQL 数据库,可以采用多种方法。一种常见的方式是利用 `@Lob` 解来处理较大的字符串字段,并结合 Jackson 库自动转换 Java 对象与 JSON 字符串。 #### 创建实体类并映射到数据库表 定义一个用于表示要存入数据库的对象的实体类,在该类上应用 JPA 解以便于 ORM 操作: ```java import javax.persistence.*; import com.fasterxml.jackson.databind.ObjectMapper; @Entity public class JsonData { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Lob // Large Object, suitable for storing large text like JSON strings. private String jsonDataString; public void setJson(Object object) throws Exception { ObjectMapper mapper = new ObjectMapper(); this.jsonDataString = mapper.writeValueAsString(object); } public <T> T getJson(Class<T> valueType) throws Exception { ObjectMapper mapper = new ObjectMapper(); return mapper.readValue(this.jsonDataString, valueType); } } ``` 此代码片段展示了如何创建一个名为 `JsonData` 的实体类[^1],其中包含了两个主要的方法:一个是设置 JSON 数据(`setJson`);另一个是从 JSON 字符串反序列化回原始类型的实例 (`getJson`). 使用了 `ObjectMapper` 来完成这些操作. #### 配置数据源连接信息 确保已经在项目的配置文件 (如 `application.properties` 或者 `application.yml`) 中指定了正确的 JDBC URL 和其他必要的参数: 对于 `application.properties`, 可以这样指定: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useSSL=false&amp;serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect spring.jpa.show-sql=true ``` 而对于 `application.yml` 文件,则应按照 YAML 语法格式书写相应的键值对[^2]: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/your_database_name?serverTimezone=Asia/Shanghai&amp;useUnicode=true&amp;characterEncoding=utf8 username: root password: your_password_here driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update show-sql: true ``` 以上配置使得应用程序能够成功连接到本地运行的 MySQL 实例上的特定数据库,并启用了 SQL 日志记录功能方便调试。 #### 编写服务层逻辑和服务接口 编写 RESTful API 控制器或任何其他形式的服务端点,允许客户端发送 HTTP 请求携带待储存的 JSON 载荷。这里给出简单的例子展示如何接收 POST 请求并将接收到的内容作为 JSON 存储起来: ```java @RestController @RequestMapping(&quot;/api/jsondata&quot;) public class JsonDataController { @Autowired private JsonDataService jsonDataService; @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<String> save(@RequestBody Map<String,Object> jsonMap){ try{ JsonData jsonDataEntity = new JsonData(); jsonDataEntity.setJson(jsonMap); // Convert map to string and store it jsonDataService.save(jsonDataEntity); return ResponseEntity.ok(&quot;Saved successfully.&quot;); }catch(Exception e){ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); } } } @Service public class JsonDataService { @PersistenceContext EntityManager entityManager; public void save(JsonData entity){ entityManager.persist(entity); } } ``` 上述控制器接受来自客户端的一个 JSON 形式的请求体,将其转化为 `Map<String, Object>` 类型传递给业务逻辑组件进一步处理。最终调用持久化上下文中的 persist 方法把新创建好的实体加入当前事务之中等待提交入库.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值