zoukankan      html  css  js  c++  java
  • 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进行配置完美解决

  • 相关阅读:
    一些坑点
    [Luogu P4168] [Violet]蒲公英 (分块)
    冬令营颓废笔记
    WC2019 填坑记
    [Luogu P1829] [国家集训队]Crash的数字表格 / JZPTAB (莫比乌斯反演)
    [Luogu P2522] [HAOI2011]Problem b (莫比乌斯反演)
    [Luogu P3327] [SDOI2015]约数个数和 (莫比乌斯反演)
    [Luogu P3455] [POI2007]ZAP-Queries (莫比乌斯反演 )
    [Luogu P2257] YY的GCD (莫比乌斯函数)
    杭电 1166 敌兵布阵 (线段树)
  • 原文地址:https://www.cnblogs.com/haizhilangzi/p/9770362.html
Copyright © 2011-2022 走看看