zoukankan      html  css  js  c++  java
  • 【JdbcTemplate】springboot之多数据源配置JdbcTemplate

    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
     */
    @Configuration
    public 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
     */
    @Service
    public 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/springboot
    spring.datasource.primary.username=root
    spring.datasource.primary.password=root
    spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
    
    spring.datasource.secondary.url=jdbc:mysql://localhost:3306/springboot
    spring.datasource.secondary.username=root
    spring.datasource.secondary.password=root
    spring.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)
    @SpringBootTest
    public 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/springboot
    spring.datasource.primary.username=root
    spring.datasource.primary.password=root
    spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
    
    spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/springboot
    spring.datasource.secondary.username=root
    spring.datasource.secondary.password=root
    spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
    复制代码

    方案二:

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

      application.properties

    复制代码
    spring.datasource.primary.url=jdbc:mysql://localhost:3306/springboot
    spring.datasource.primary.username=root
    spring.datasource.primary.password=root
    spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
    
    spring.datasource.secondary.url=jdbc:mysql://localhost:3306/springboot
    spring.datasource.secondary.username=root
    spring.datasource.secondary.password=root
    spring.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
     */
    @Configuration
    public 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进行配置完美解决

  • 相关阅读:
    Java虚拟机--编译那点事儿
    Java虚拟机--常用Java命令(二)
    Java虚拟机--常用Java命令(一)
    Java虚拟机--类加载机制
    Java虚拟机--JIT编译器
    Java虚拟机--垃圾回收机制
    Java虚拟机--对象模型
    Junit测试--多个测试接口如何产生业务联系
    Java虚拟机--内存模型
    Java虚拟机--内存结构
  • 原文地址:https://www.cnblogs.com/zzsuje/p/15397000.html
Copyright © 2011-2022 走看看