zoukankan      html  css  js  c++  java
  • springboot数据源配置

    ===========================多数据源配置==============================

    配置文件application.properties:

        #多数据源配置
    spring.datasource.db1.url=jdbc:mysql://localhost:3306/hibernate?useSSL=false
    spring.datasource.db1.username=root
    spring.datasource.db1.password=root
    spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver
    
    spring.datasource.db2.url=jdbc:mysql://localhost:3306/spring?useSSL=false
    spring.datasource.db2.username=root
    spring.datasource.db2.password=root
    spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver

    数据库配置DatasourceConfigure.java:

    package com.bxw.configuration;
    
    import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
    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 javax.sql.DataSource;
    import java.util.HashMap;
    import java.util.Map;
    
    @Configuration
    public class DataSourceConfigure {
        @Bean(name = "db1")
        @ConfigurationProperties(prefix = "spring.datasource.db1") // application.properteis中对应属性的前缀
        public DataSource dataSource1() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "db2")
        @ConfigurationProperties(prefix = "spring.datasource.db2") // application.properteis中对应属性的前缀
        public DataSource dataSource2() {
            return DataSourceBuilder.create().build();
        }
    }

    采用spring注解方式注入数据源,数据源名称分别为db1,db2

    注入sessionFactory,sessionTemplate

    MybatisDBAConfig.java
    package com.bxw.configuration;
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.sql.DataSource;
    
    @Configuration
    @MapperScan(basePackages = {"com.bxw.mapperB"},sqlSessionFactoryRef = "sqlSessionFactory1")
    public class MybatisDBAConfig {
    
        @Autowired
        @Qualifier("db1")
        private DataSource db1;
    
        @Bean
        public SqlSessionFactory sqlSessionFactory1() throws Exception {
            SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
            factoryBean.setDataSource(db1); // 使用db1数据源, 连接hibernate库
    
            return factoryBean.getObject();
    
        }
    
        @Bean
        public SqlSessionTemplate sqlSessionTemplate1() throws Exception {
            SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory1()); // 使用上面配置的Factory
            return template;
        }
    }
    MybatisDBBConfig.java
    package com.bxw.configuration;
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.sql.DataSource;
    
    @Configuration
    @MapperScan(basePackages = {"com.bxw.mapperA"},sqlSessionFactoryRef = "sqlSessionFactory2")
    public class MybatisDBBConfig {
        @Autowired
        @Qualifier("db2")
        private DataSource db2;
    
        @Bean
        public SqlSessionFactory sqlSessionFactory2() throws Exception {
            SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
            factoryBean.setDataSource(db2); // 使用db1数据源, 连接hibernate库
    
            return factoryBean.getObject();
    
        }
    
        @Bean
        public SqlSessionTemplate sqlSessionTemplate2() throws Exception {
            SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory2()); // 使用上面配置的Factory
            return template;
        }
    }

    该配置配置过后,在com.bxw.mapperA和com.bxw.mapperB两个包中的mapper分别使用不同的数据源。

     ==================================sprIngboot动态数据源=============================================

    DBConfig1.java:

    package com.bxw.configuration;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    public class DBConfig1 {
        private String url;
        private String password;
        private String username;
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    }

    通过@ConfigurationProperties注入数据源的属性值。

    DBConfig2.java:

    package com.bxw.configuration;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public class DBConfig2 {
        private String url;
        private String password;
        private String username;
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    }

    DatasourceContextHolder.java:

    package com.bxw.configuration;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    public class DatasourceContextHolder {
        public static final Logger log = LoggerFactory.getLogger(DatasourceContextHolder.class);
    
        public static final String primary_DB = "db1";
    
        private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
        //设置数据源名
        public static void setDB(String dbType){
            log.debug("切换到{}数据源",dbType);
            contextHolder.set(dbType);
        }
    
        //获取数据源名
        public static String getDB(){
            return contextHolder.get();
        }
    
        //清除数据源名
        public static void clearDB(){
            contextHolder.remove();
        }
    }

    自定义数据源管理类。

    DynamicDatasource.java:

    package com.bxw.configuration;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
    
    public class DynamicDatasource extends AbstractRoutingDataSource {
    
        private static Logger log = LoggerFactory.getLogger(DynamicDatasource.class);
    
        @Override
        protected Object determineCurrentLookupKey() {
            log.debug("数据源为{}",DatasourceContextHolder.getDB());
            return DatasourceContextHolder.getDB();
        }
    }

    DatasourceConfigure.java

    package com.bxw.configuration;
    
    import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
    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 javax.sql.DataSource;
    import java.util.HashMap;
    import java.util.Map;
    
    @Configuration
    public class DataSourceConfigure {
        //动态数据源
        @Bean(name="dynamicDB1")
        public DataSource dataSource(){
            DynamicDatasource dynamicDatasource = new DynamicDatasource();
            //默认数据源
            dynamicDatasource.setDefaultTargetDataSource(dataSource1());
    
            Map<Object,Object> dbMap = new HashMap(5);
            dbMap.put("db1",dataSource1());
            dbMap.put("db2",dataSource2());
            dynamicDatasource.setTargetDataSources(dbMap);
            return dynamicDatasource;
        }
    }

    配置动态数据源。

    MybatisDBCConfig.java:

    package com.bxw.configuration;
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.sql.DataSource;
    
    /**
     * 动态数据源
     */
    @Configuration
    @MapperScan(basePackages = {"com.bxw.mapperDynamic"},sqlSessionFactoryRef = "sqlSessionFactory3")
    public class MybatisDBCConfig {
        @Autowired
        @Qualifier("dynamicDB1")
        private DataSource dynamicDB1;
    
        @Bean
        public SqlSessionFactory sqlSessionFactory3() throws Exception {
            SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
            factoryBean.setDataSource(dynamicDB1); // 使用db1数据源, 连接hibernate库
    
            return factoryBean.getObject();
    
        }
    
        @Bean
        public SqlSessionTemplate sqlSessionTemplate3() throws Exception {
            SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory3()); // 使用上面配置的Factory
            return template;
        }
    }

    自定义注解DB.java:

    package com.bxw.annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target({
            ElementType.METHOD
    })
    public @interface DB {
        String value() default "db1";
    }

    StudentService.java

    package com.bxw.service;
    
    import com.bxw.annotation.DB;
    import com.bxw.entity.Student;
    import com.bxw.mapperTA.StudentMapperTA;
    import com.bxw.mapperTB.StudentMapperTB;
    import com.bxw.mapperDynamic.StudentMapperC;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.stereotype.Service;
    
    import javax.transaction.Transactional;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.List;
    
    @Service
    public class StudentService {
        @Autowired
        private StudentMapperC studentMapperC;
    
        /**
         * 动态数据源
         */
        @DB
        public List<Student> db1(){
            return studentMapperC.findAll();
        }
    
        @DB("db2")
        public List<Student> db2(){
            return studentMapperC.findAll();
        }
    }

    @DB根据不同值切换数据源。

  • 相关阅读:
    Socket接口(基于 Linux-2.4.0已更新)
    IP协议源码分析(基于linux-2.4.0已更新)
    udp_sendmsg源码完整分析(基于linux5.12.13版本内核)
    UDP详细理解(实现部分基于linux5.12.12版本内核)
    IP地址分配(静态分配+动态分配+零配置)
    计算机网络由哪些硬件设备组成?(基础收录)
    浅析C语言定义时赋值、定义后赋值、定义时不赋值
    《C指针全解》让你不再害怕指针
    makdown文字图片居中字体颜色表格列宽
    (C语言内存二十一)C语言变量的存储类别和生存期
  • 原文地址:https://www.cnblogs.com/popcornya/p/9031433.html
Copyright © 2011-2022 走看看