首页 > 编程 > Java > 正文

详解springboot采用多数据源对JdbcTemplate配置的方法

2019-11-26 09:37:00
字体:
来源:转载
供稿:网友

springboot多数据源配置,代码如下

DataSourceConfig

package com.rookie.bigdata.config; import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.jdbc.DataSourceBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; /** * @author * @date 2018/10/10 */@Configurationpublic class DataSourceConfig {  @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @ConfigurationProperties(prefix="spring.datasource.primary") public DataSource primaryDataSource() {  return DataSourceBuilder.create().build(); }  @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @Primary @ConfigurationProperties(prefix="spring.datasource.secondary") public DataSource secondaryDataSource() {  return DataSourceBuilder.create().build(); }  @Bean(name = "primaryJdbcTemplate") public JdbcTemplate primaryJdbcTemplate(   @Qualifier("primaryDataSource") DataSource dataSource) {  return new JdbcTemplate(dataSource); }  @Bean(name = "secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate(   @Qualifier("secondaryDataSource") DataSource dataSource) {  return new JdbcTemplate(dataSource); } }

StudentServiceImpl

package com.rookie.bigdata.service; import com.rookie.bigdata.domain.Student;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Service; /** * @author * @date 2018/10/9 */@Servicepublic class StudentServiceImpl implements StudentService {  @Autowired @Qualifier("primaryJdbcTemplate") private JdbcTemplate jdbcTemplate;  @Autowired @Qualifier("secondaryJdbcTemplate") private JdbcTemplate jdbcTemplate2;  /**  * 采用第一个暑假源进行插入数据  * @param student  */ @Override public void create(Student student) {   jdbcTemplate.update("INSERT INTO student(stu_no,name,age)VALUE (?,?,?)", student.getStuNo(), student.getName(), student.getAge());  }  /**  * 第一个数据源进行插入数据  * @param stuNo  */ @Override public void deleteByNo(Integer stuNo) {  jdbcTemplate.update("DELETE FROM student WHERE stu_no=?", stuNo); }  /**  * 第二个数据源进行查询数据  * @param stuNo  * @return  */ @Override public Integer queryByStuNo(Integer stuNo) {  return jdbcTemplate2.queryForObject("select count(1) from student", Integer.class); }}

配置文件 application.properties

spring.datasource.primary.url=jdbc:mysql://localhost:3306/springbootspring.datasource.primary.username=rootspring.datasource.primary.password=rootspring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver spring.datasource.secondary.url=jdbc:mysql://localhost:3306/springbootspring.datasource.secondary.username=rootspring.datasource.secondary.password=rootspring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver

测试代码如下

package com.rookie.bigdata.service; import com.rookie.bigdata.domain.Student;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner; /** * @author liuxili * @date 2018/10/10 */ @RunWith(SpringRunner.class)@SpringBootTestpublic class StudentServiceImplTest {  @Autowired private StudentServiceImpl studentService;  @Test public void create1() throws Exception {  Student student = new Student();  student.setStuNo(1L);  student.setName("张三");  student.setAge(23);  studentService.create(student); } @Test public void deleteByName1() throws Exception {  studentService.deleteByNo(1); } @Test public void queryByStuNo1() throws Exception {  System.out.println(studentService.queryByStuNo(1));  }}

在运行的时候会出现如下异常问题,运行失败,报出java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.异常

后来经过查资料,发现出现该问题的原因是由于springboot版本的问题,本实例采用的springboot版本为2.0.5,如果将版本改为1.5以前的版本就不会出现如上的问题,其实解决上面的异常主要有如下两种解决方案

方案一:

按照如下方案进行修改application.properties配置文件,如下:修改完成后,上面的异常不会再出现

spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/springbootspring.datasource.primary.username=rootspring.datasource.primary.password=rootspring.datasource.primary.driver-class-name=com.mysql.jdbc.Driverspring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/springbootspring.datasource.secondary.username=rootspring.datasource.secondary.password=rootspring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver

方案二:

原有的application.properties配置文件不进行修改,修改DataSourceConfig类中的信息,如下:修改完成后,异常也不会再出现能够正常运行

application.properties

spring.datasource.primary.url=jdbc:mysql://localhost:3306/springbootspring.datasource.primary.username=rootspring.datasource.primary.password=rootspring.datasource.primary.driver-class-name=com.mysql.jdbc.Driverspring.datasource.secondary.url=jdbc:mysql://localhost:3306/springbootspring.datasource.secondary.username=rootspring.datasource.secondary.password=rootspring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver

DataSourceConfig

package com.rookie.bigdata.config;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.jdbc.core.JdbcTemplate;import javax.sql.DataSource;/** * @author * @date 2018/10/10 */@Configurationpublic class DataSourceConfig { @Bean(name = "primaryJdbcTemplate") public JdbcTemplate primaryJdbcTemplate(   @Qualifier("primaryDataSource") DataSource dataSource) {  return new JdbcTemplate(dataSource); } @Bean(name = "secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate(   @Qualifier("primaryDataSource") DataSource dataSource) {  return new JdbcTemplate(dataSource); } @Primary @Bean(name = "primaryDataSourceProperties") @Qualifier("primaryDataSourceProperties") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSourceProperties primaryDataSourceProperties() {  return new DataSourceProperties(); } @Bean(name = "secondaryDataSourceProperties") @Qualifier("secondaryDataSourceProperties") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSourceProperties secondaryDataSourceProperties() {  return new DataSourceProperties(); }  @Primary @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() {   return primaryDataSourceProperties().initializeDataSourceBuilder().build(); } @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() {   return primaryDataSourceProperties().initializeDataSourceBuilder().build(); }}

至此,springboot 采用多数据源对JdbcTemplate进行配置完美解决,感谢大家对武林网的支持。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表