五、Spring Boot 整合持久层技术(5)

本章概要

  • MyBatis 多数据源

5.4.2 MyBatis 多数据源

项目目录结构
在这里插入图片描述

1. 准备工作

数据库

create database `chapter05-1` default character set utf8;
CREATE TABLE `chapter05-1`.`book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `author` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `chapter05-1`.`book`(`id`, `name`, `author`) VALUES (1, '水浒传', '施耐庵');
create database `chapter05-2` default character set utf8;
CREATE TABLE `chapter05-2`.`book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `author` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `chapter05-2`.`book`(`id`, `name`, `author`) VALUES (1, '三国演义', '罗贯中');

创建 Spring Boot Web 项目,添加如下依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>1.3.2</version>
</dependency>
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid-spring-boot-starter</artifactId>
  <version>1.1.10</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>

application.properties 配置

# 数据源1
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.url=jdbc:mysql://localhost:3306/chapter05-1?useUnicode=true&characterEncoding=utf8&useSSL=true
spring.datasource.one.username=root
spring.datasource.one.password=root
# 数据源2
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.url=jdbc:mysql://localhost:3306/chapter05-2?useUnicode=true&characterEncoding=utf8&useSSL=true
spring.datasource.two.username=root
spring.datasource.two.password=root

数据源配置 DataSourceConfig

@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();
    }
}

实体类 Book

public class Book {
    
    
    private Integer id;
    private String name;
    private String author;

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

    public Integer getId() {
    
    
        return id;
    }

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

    public String getName() {
    
    
        return name;
    }

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

    public String getAuthor() {
    
    
        return author;
    }

    public void setAuthor(String author) {
    
    
        this.author = author;
    }
}

静态资源配置 pom.xml

<build>
  <resources>
    <resource>
      <directory>src/main/java</directory>
      <includes>
        <include>**/*.xml</include>
      </includes>
    </resource>
    <resource>
      <directory>src/main/resources</directory>
    </resource>
  </resources>
</build>

2. 创建 MyBatis 配置

配置 MyBatis ,主要提供 SqlSessionFactory 实例和 SqlSessionTemplate 实例

@Configuration
@MapperScan(value = "com.sang.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());
    }
}

代码解释:

  • 在 @MapperScan 注解中指定 Mapper 接口所在的位置,同时指定 SqlSessionFactory 的实例名,则该位置下的 Mapper 将使用 SqlSessionFactory 实例
  • 提供 SqlSessionFactory 的实例,直接创建出来,同时将 DataSource 的实例设置给 SqlSessionFactory ,这里创建的 SqlSessionFactory 实例也就是 @MapperScan 注解中的 sqlSessionFactoryRef 参数指定的实例
  • 提供一个 SqlSessionTemplate 实例。这是一个线程安全类,主要用来管理 MyBatis 中的 SqlSession 操作

参考 MyBatisConfigOne 创建 MyBatisConfigTwo

@Configuration
@MapperScan(value = "com.sang.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());
    }
}

3. 创建 Mapper

分别在 com.sang.mapper1 和 com.sang.mapper2 包下创建两个不同的 Mapper 以及相应的 Mapper 映射文件
mapper1 下

public interface BookMapper {
    
    
    List<Book> getAllBooks();
}
<?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.sang.mapper1.BookMapper">
<select id="getAllBooks" resultType="com.sang.model.Book">
    select * from book;
</select>
</mapper>

mapper2 下

public interface BookMapper2 {
    
    
    List<Book> getAllBooks();
}
<?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.sang.mapper2.BookMapper2">
<select id="getAllBooks" resultType="com.sang.model.Book">
    select * from book;
</select>
</mapper>

这两个不同的 Mapper 将操作不同的数据源

4. 创建 Controller

简便起见,这里直接将 Mapper 注入 Controller 中

@RestController
public class BookController {
    
    
    @Autowired
    BookMapper bookMapper;
    @Autowired
    BookMapper2 bookMapper2;
    @GetMapping("/test1")
    public void test1() {
    
    
        List<Book> books1 = bookMapper.getAllBooks();
        List<Book> books2 = bookMapper2.getAllBooks();
        System.out.println("books1:"+books1);
        System.out.println("books2:"+books2);
    }
}

5. 测试

http://localhost:8081/test1,日志如下:

books1:[Book{id=1, name='水浒传', author='施耐庵'}]
books2:[Book{id=1, name='三国演义', author='罗贯中'}]

猜你喜欢

转载自blog.csdn.net/GXL_1012/article/details/125990692