SpringBoot - 使用MyBatis操作数据库2(多数据源的配置与使用)

作者: hangge 发布时间: 2020-01-29 浏览: 1790 次 编辑

所谓多数据源,就是一个 Java EE 项目中采用了不同数据库实例中的多个库,或者同一个数据库实例中多个不同的库。MyBatis 也可以配置多数据源,下面通过样例进行演示。

三、多数据源的配置与使用

1,添加依赖

首先编辑 pom.xml 文件,添加相关依赖:

注意:跟前文相比,这里的数据库连接池依赖改用 druid-spring-boot-starterdruid-spring-boot-starter 可以帮助开发者在 Spring Boot 项目中轻松集成 Druid 数据库连接池和监控。

<!-- MyBatis依赖 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
 
<!-- 数据库驱动依赖 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
 
<!-- 数据库连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>

2,指明 xml 资源的位置

由于在 Maven 工程中,XML 配置文件建议写在 resources 目录下,但和前文一样我们 Mapper 映射文件写在包下,Maven 在运行时会忽略包下的 XML 文件。因此需要同样需要在 pom.xml 文件中重新指明资源文件位置,配置如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    <!-- 重新指明资源文件位置 -->
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>


3,配置数据库链接

(1)假设我们需要同时连接如下 hanggehangge2 这两个数据库。

原文:SpringBoot - 使用MyBatis操作数据库2(多数据源的配置与使用)

(2)在 application.properties 中配置数据库连接信息:

# 数据源 1
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.url=jdbc:mysql://localhost:3306/hangge
spring.datasource.one.username=root
spring.datasource.one.password=hangge1234
# 数据源 2
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.url=jdbc:mysql://localhost:3306/hangge2
spring.datasource.two.username=root
spring.datasource.two.password=hangge1234

4,配置数据源

创建 DataSourceConfig 配置数据源,根据 application.properties 中的配置生成两个数据源:

代码说明:

  • DataSourceConfig 中提供了两个数据源:dsOnedsTwo ,默认方法名即为实例名。
  • @ConfigurationProperties 注解表示使用不同前缀的配置文件来创建不同的 DataSource 实例。
@Configuration
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties("spring.datasource.one")
    DataSource dsOne() {
        return DruidDataSourceBuilder.create().build();
    }
 
    @Bean
    @ConfigurationProperties("spring.datasource.two")
    DataSource dsTwo() {
        return DruidDataSourceBuilder.create().build();
    }
}

5,配置 MyBatis

(1)配置 MyBatis,主要是提供 SqlSessionFactory 实例和 SqlSessionTemplate 实例。下面是第一个数据库的配置类:

代码说明:

  • @MapperScan 注解中指定 Mapper 接口所在的位置,同时指定 SqlSessionFactory 的实例名,则该位置下的 Mapper 将使用 SqlSessionFactory 实例。
  • 提供 SqlSessionFactory 的实例,直接创建出来,同时将 DataSource 的实例设置给 SqlSessionFactory,这里创建的 SqlSessionFactory 实例也就是 @MapperScan 注解中 sqlSessionFactoryRef 参数指定的实例。
  • 提供一个 SqlSessionTemplate 实例。这是一个线程安全类,主要用来管理 MyBatis 中的 SqlSession 操作。
@Configuration
@MapperScan(value = "com.example.demo.mapper1", sqlSessionFactoryRef = "sqlSessionFactoryBean1")
public class MyBatisConfigOne {
    @Autowired
    @Qualifier("dsOne")
    DataSource dsOne;
 
    @Bean
    SqlSessionFactory sqlSessionFactoryBean1() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dsOne);
        return factoryBean.getObject();
    }
 
    @Bean
    SqlSessionTemplate sqlSessionTemplate1() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryBean1());
    }
}

(2)下面是另一个数据库的配置类:

@Configuration
@MapperScan(value = "com.example.demo.mapper2", sqlSessionFactoryRef = "sqlSessionFactoryBean2")
public class MyBatisConfigTwo {
    @Autowired
    @Qualifier("dsTwo")
    DataSource dsTwo;
 
    @Bean
    SqlSessionFactory sqlSessionFactoryBean2() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dsTwo);
        return factoryBean.getObject();
    }
 
    @Bean
    SqlSessionTemplate sqlSessionTemplate2() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryBean2());
    }
}

6,创建实体类

(1)假设两个数据库中都要 Users 表,结构如下:

原文:SpringBoot - 使用MyBatis操作数据库2(多数据源的配置与使用)


(2)创建对应的 User 实体类:

@Setter
@Getter
@NoArgsConstructor
@ToString
public class User {
    private Integer id;
    private String userName;
    private String passWord;
}

7,创建数据库访问层

(1)首先分别在 com.example.demo.mapper1 com.example.demo.mapper2 包下创建两个不同的 Mapper

  • 下面是 com.example.demo.mapper1 下的 UserMapper1
public interface UserMapper1 {
    List getAllUsers();
}
  • 下面是 com.example.demo.mapper2 下的 UserMapper2
public interface UserMapper2 {
    List getAllUsers();
}

(2)接着需要分别在 com.example.demo.mapper1 com.example.demo.mapper2 包下创建相应的 Mapper 映射文件。

  • 下面是 com.example.demo.mapper1 下的 UserMapper1.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.mapper1.UserMapper1">
    <select id="getAllUsers" resultType="com.example.demo.bean.User">
        SELECT * FROM users
    </select>
</mapper>
  • 下面是 com.example.demo.mapper2 下的 UserMapper2.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.mapper2.UserMapper2">
    <select id="getAllUsers" resultType="com.example.demo.bean.User">
        SELECT * FROM users
    </select>
</mapper>

8,创建 Controller

为方便演示,这里直接将两个 Mapper 注入到了 Controller 中,然后分别查询两个数据库中的数据。

@RestController
public class HelloController {
 
    @Autowired
    UserMapper1 userMapper1;
 
    @Autowired
    UserMapper2 userMapper2;
 
    @RequestMapping("/test")
    public void test(){
        List users1 = userMapper1.getAllUsers();
        List users2 = userMapper2.getAllUsers();
        System.out.println("数据库1>>>users>>>" + users1);
        System.out.println("数据库2>>>users>>>" + users2);
 
        return;
    }

9,运行测试

在浏览器中访问 http://localhost:8080/test 地址,可以看到控制台打印出的日志如下:

原文:SpringBoot - 使用MyBatis操作数据库2(多数据源的配置与使用)