Spring Boot JDBC + Mybatis 配置多數(shù)據(jù)源 以及 采用Durid 作為連接池

1 配置文件

在配置文件中配置兩個(gè)數(shù)據(jù)源配置,以及mybatis xml配置文件路徑

# mybatis  多數(shù)據(jù)源配置
mybatis.config-location = classpath:mapper/config/mybatis-config.xml

#################  mysql  數(shù)據(jù)源1 #################
spring.datasource.one.jdbc-url=jdbc:mysql://localhost:3306/user?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.one.username=root
spring.datasource.one.password=root
#spring.datasource.one.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.one.driver-class-name=com.mysql.jdbc.Driver
#################  mysql  數(shù)據(jù)源1 #################

#################  mysql  數(shù)據(jù)源2 ################
spring.datasource.second.jdbc-url=jdbc:mysql://xxxxxxxxxx:3306/user?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.second.username=root
spring.datasource.second.password=root
#spring.datasource.second.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.second.driver-class-name=com.mysql.jdbc.Driver
#################  mysql  數(shù)據(jù)源1 #################

2 數(shù)據(jù)庫(kù)配置代碼:

1 步驟

1 首先加載配置的數(shù)據(jù)源:手動(dòng)將數(shù)據(jù)配置文件信息注入到數(shù)據(jù)源實(shí)例對(duì)象中。
2 根據(jù)創(chuàng)建的數(shù)據(jù)源,配置數(shù)據(jù)庫(kù)實(shí)例對(duì)象注入到SqlSessionFactory 中,構(gòu)建對(duì)應(yīng)的 SqlSessionFactory。
3 配置數(shù)據(jù)庫(kù)事務(wù):將數(shù)據(jù)源添加到事務(wù)中。
4 將SqlSessionFactory 注入到SqlSessionTemplate 模板中
5 最后將上面創(chuàng)建的 SqlSessionTemplate 注入到對(duì)應(yīng)的 Mapper 包路徑下,這樣這個(gè)包下面的 Mapper 都會(huì)使用第一個(gè)數(shù)據(jù)源來進(jìn)行數(shù)據(jù)庫(kù)操作。

basePackages   指明 Mapper 地址。
sqlSessionTemplateRef    指定 Mapper 路徑下注入的 sqlSessionTemplate。

在多數(shù)據(jù)源的情況下,不需要在啟動(dòng)類添加:@MapperScan("com.xxx.mapper") 的注解。

2 項(xiàng)目結(jié)構(gòu):
在這里插入圖片描述
在這里插入圖片描述
3 第一個(gè)數(shù)據(jù)源

@Api("SqlSessionTemplate 注入到對(duì)應(yīng)的 Mapper 包路徑下")
@Configuration
@MapperScan(basePackages = "com.example.demo.mapper.one", sqlSessionTemplateRef  = "oneSqlSessionTemplate")
public class OneDataSourceConfig {

    //------------------                 1 加載配置的數(shù)據(jù)源:   -------------------------------
    @Bean("oneDatasource")
    @ConfigurationProperties(prefix = "spring.datasource.one")
    @Primary //默認(rèn)是這個(gè)庫(kù)
    public DataSource DataSource1Config(){
        return DataSourceBuilder.create().build();
    }





    //---------------------- 2 創(chuàng)建的數(shù)據(jù)源 構(gòu)建對(duì)應(yīng)的 SqlSessionFactory。  ----------------------

    @Bean(name = "oneSqlSessionFactory" )
    @Primary
    public SqlSessionFactory oneSqlSessionFactory(@Qualifier("oneDatasource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/one/*.xml"));
        return bean.getObject();
    }


    //------------------------3  配置事務(wù) --------------------------
    @Bean(name = "oneTransactionManager")
    @Primary
    public DataSourceTransactionManager oneTransactionManager(@Qualifier("oneDatasource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }



    //------------------------------- 4 注入 SqlSessionFactory 到 SqlSessionTemplate 中---------------------------------
    @Bean(name = "oneSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate oneSqlSessionTemplate(@Qualifier("oneSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}
第二個(gè)數(shù)據(jù)源

@Api("SqlSessionTemplate 注入到對(duì)應(yīng)的 Mapper 包路徑下")
@Configuration
@MapperScan(basePackages = "com.example.demo.mapper.second", sqlSessionTemplateRef  = "secondSqlSessionTemplate")
public class SecondDataSourceConfig {


    //------------------                  加載配置的數(shù)據(jù)源:   -------------------------------


    @Bean("secondDatasource")
    @ConfigurationProperties(prefix = "spring.datasource.second")
    public DataSource DataSource2Config(){
        return DataSourceBuilder.create().build();
    }





    //---------------------- 創(chuàng)建的數(shù)據(jù)源 構(gòu)建對(duì)應(yīng)的 SqlSessionFactory。  ----------------------



    @Bean(name = "secondSqlSessionFactory")
    public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDatasource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/second/*.xml"));
        return bean.getObject();
    }

    //------------------------ 配置事務(wù) --------------------------


    @Bean(name = "secondTransactionManager")
    public DataSourceTransactionManager secondTransactionManager(@Qualifier("secondDatasource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }


    //------------------------------- 注入 SqlSessionFactory 到 SqlSessionTemplate 中---------------------------------


    @Bean(name = "secondSqlSessionTemplate")
    public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

3 xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>

4 mapper 類

public interface User1Mapper {
    public void inserts(User user);
}

public interface User2Mapper {
    public void inserts(User user);
}

5 mybatis mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<mapper namespace="com.example.demo.mapper.one.User1Mapper">
    <insert id="inserts" parameterType="com.example.demo.pojo.User" useGeneratedKeys="true" keyProperty="id">
        insert into user(`name`,age) VALUE (#{name},#{age})
    </insert>
  
</mapper>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<mapper namespace="com.example.demo.mapper.one.User2Mapper">
    <insert id="inserts" parameterType="com.example.demo.pojo.User" useGeneratedKeys="true" keyProperty="id">
        insert into user(`name`,age) VALUE (#{name},#{age})
    </insert>
  
</mapper>

3 啟動(dòng)成功
在這里插入圖片描述

表示數(shù)據(jù)源創(chuàng)建成功,這里連接池采用springboot默認(rèn)的Hikari數(shù)據(jù)庫(kù)連接池(不需要配置)

6 測(cè)試

    @Autowired
    User1Mapper user1Mapper;

    @Autowired
    User2Mapper user2Mapper;
    @Test
    public void test(){
        user1Mapper.inserts(new User(22L, "a123456",1));
        user1Mapper.inserts(new User(33L, "b123456", 1));
        user2Mapper.inserts(new User(44L, "b123456", 1));
    }

結(jié)果

在這里插入圖片描述

7 更換數(shù)據(jù)源配置

官方文檔 : https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

增加配置文件 , 更換為durid數(shù)據(jù)源

1 配置文件增加配置屬性

#  StatViewServlet 配置
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin

# 配置 StatFilter
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000

# Druid 數(shù)據(jù)源 1 配置
spring.datasource.druid.one.initial-size=3
spring.datasource.druid.one.min-idle=3
spring.datasource.druid.one.max-active=10
spring.datasource.druid.one.max-wait=60000

# Druid 數(shù)據(jù)源 2 配置
spring.datasource.druid.second.initial-size=6
spring.datasource.druid.second.min-idle=6
spring.datasource.druid.second.max-active=20
spring.datasource.druid.second.max-wait=120000

將上面數(shù)據(jù)庫(kù)配置文件前綴加上druid

如:


#  StatViewServlet 配置
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin

# 配置 StatFilter
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000

# Druid 數(shù)據(jù)源 1 配置
spring.datasource.druid.one.initial-size=3
spring.datasource.druid.one.min-idle=3
spring.datasource.druid.one.max-active=10
spring.datasource.druid.one.max-wait=60000

# Druid 數(shù)據(jù)源 2 配置
spring.datasource.druid.second.initial-size=6
spring.datasource.druid.second.min-idle=6
spring.datasource.druid.second.max-active=20
spring.datasource.druid.second.max-wait=120000

#mybatis.type-aliases-package = com.example.demo.pojo
#################  mysql  數(shù)據(jù)源1 #################
spring.datasource.druid.one.url=jdbc:mysql://localhost:3306/user?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.druid.one.username=root
spring.datasource.druid.one.password=root
spring.datasource.druid.one.driver-class-name=com.mysql.jdbc.Driver
#################  mysql  數(shù)據(jù)源1 #################

#################  mysql  數(shù)據(jù)源2 #################
spring.datasource.druid.second.url=jdbc:mysql://xxxxxxxxxxx:3306/user?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.druid.second.username=root
spring.datasource.druid.second.password=root
spring.datasource.druid.second.driver-class-name=com.mysql.jdbc.Driver
#################  mysql  數(shù)據(jù)源1 #################
2 引入依賴
    <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

然后在加載數(shù)據(jù)源配置哪兒讀取配置文件注解改為

@ConfigurationProperties(prefix = "spring.datasource.druid.one")
@ConfigurationProperties(prefix = "spring.datasource.druid.second")
啟動(dòng)后發(fā)現(xiàn)配置成功
在這里插入圖片描述
過程中可能會(huì)遇到問題

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class

原因是:url鏈接寫錯(cuò)了 , SpringBoot duridd無法配置到 數(shù)據(jù)源url

錯(cuò)誤:spring.datasource.druid.one.jdbc-url=jdbc:mysql://localhost:3306/user?   這是jdbc的url鏈接

正確 : spring.datasource.druid.one.url=jdbc:mysql://localhost:3306/user?   這是連接池用的url

源碼地址 傳送門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容