多數據源配置springboot+Mybatis

多數據源用到的場景很多,所以就寫了本篇文章進行演示如何配置多數據源。項目源碼地址點擊此處查看

項目依賴springboot2+mybatis+mysql

首先在mysql中創建數據庫db1和db2,然後分別在兩個數據庫中創建表test1和test2並插入演示數據

create DATABASE test1;
use test1;
create table test1(
	id int not null,
    name varchar(50)
);
insert into test1(id,name) values(2,'李四');

create DATABASE test2;
use test2;
create table test2(
	id int not null,
    name varchar(50)
);
insert into test2(id,name) values(1,'張三');

創建springboot項目並導入mybatis和mysql依賴

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

項目結構
在這裏插入圖片描述
application.properties配置數據源

spring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.test1.username=root
spring.datasource.test1.password=root
spring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.test2.username=root
spring.datasource.test2.password=root
spring.datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver

MybatisTest1Config.java主數據源

package com.example.mybatis.config;

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.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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.example.mybatis.mapper.test1", sqlSessionTemplateRef = "test1SessionTemplate")
public class MybatisTest1Config {
    @Bean(name = "test1")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    public DataSource test1() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    public SqlSessionFactory test1SessionFactory(@Qualifier("test1") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //添加XML目錄
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/mapper/test1/**/*Mapper.xml"));
        return bean.getObject();
    }

    @Bean
    @Primary
    public DataSourceTransactionManager test1TransactionManager(@Qualifier("test1") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    @Primary
    public SqlSessionTemplate test1SessionTemplate(@Qualifier("test1SessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

MybatisTest2Config.java

package com.example.mybatis.config;

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.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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.example.mybatis.mapper.test2", sqlSessionTemplateRef = "test2SessionTemplate")
public class MybatisTest2Config {
    @Bean(name = "test2")
    @ConfigurationProperties(prefix = "spring.datasource.test2")
    public DataSource test2() {
        return DataSourceBuilder.create().build();
    }

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

    @Bean
    public DataSourceTransactionManager test2TransactionManager(@Qualifier("test2") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public SqlSessionTemplate test2SessionTemplate(@Qualifier("test2SessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

這裏用了兩個數據庫進行演示,如果還要其它的可以繼續按上面示例增加類和application.properties數據庫配置,@Primary只需指定其中一個數據庫就行

Test1.java

package com.example.mybatis.entity;

public class Test1 {
    private int id;
    private String name;

    @Override
    public String toString() {
        return "Test1{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Test2.java

package com.example.mybatis.entity;

public class Test2 {
    private int id;
    private String name;

    @Override
    public String toString() {
        return "Test2{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Test1Mapper.java

package com.example.mybatis.mapper.test1;

import com.example.mybatis.entity.Test1;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface Test1Mapper {
    @Select("select * from test1")
    List<Test1> getAll();
}

Test2Mapper.java

package com.example.mybatis.mapper.test2;

import com.example.mybatis.entity.Test2;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface Test2Mapper {
    @Select("select * from test2")
    List<Test2> getAll();
}

TestService.java

package com.example.mybatis.service;

import com.example.mybatis.entity.Test1;
import com.example.mybatis.entity.Test2;
import com.example.mybatis.mapper.test1.Test1Mapper;
import com.example.mybatis.mapper.test2.Test2Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TestService {
    @Autowired
    private Test1Mapper test1Mapper;

    @Autowired
    private Test2Mapper test2Mapper;

    public void getStudents() {
        List<Test1> test1 = test1Mapper.getAll();
        List<Test2> test2 = test2Mapper.getAll();

        System.out.println("數據源DB1:" + test1);
        System.out.println("數據源DB2:" + test2);
    }
}

TestController.java

package com.example.mybatis.controller;

import com.example.mybatis.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @Autowired
    private TestService testService;

    @RequestMapping("/test")
    public void getStudents() {
        testService.getStudents();
    }
}

最後啓動項目,瀏覽器訪問http://localhost:8080/test看控制檯打印結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章