• 五、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, '三国演义', '罗贯中');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-webartifactId>
    dependency>
    <dependency>
      <groupId>org.mybatis.spring.bootgroupId>
      <artifactId>mybatis-spring-boot-starterartifactId>
      <version>1.3.2version>
    dependency>
    <dependency>
      <groupId>com.alibabagroupId>
      <artifactId>druid-spring-boot-starterartifactId>
      <version>1.1.10version>
    dependency>
    <dependency>
      <groupId>mysqlgroupId>
      <artifactId>mysql-connector-javaartifactId>
      <scope>runtimescope>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    数据源配置 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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    实体类 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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    静态资源配置 pom.xml

    <build>
      <resources>
        <resource>
          <directory>src/main/javadirectory>
          <includes>
            <include>**/*.xmlinclude>
          includes>
        resource>
        <resource>
          <directory>src/main/resourcesdirectory>
        resource>
      resources>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    代码解释:

    • 在 @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());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3. 创建 Mapper

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

    public interface BookMapper {
        List<Book> getAllBooks();
    }
    
    • 1
    • 2
    • 3
    
    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    mapper2 下

    public interface BookMapper2 {
        List<Book> getAllBooks();
    }
    
    • 1
    • 2
    • 3
    
    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这两个不同的 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    5. 测试

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

    books1:[Book{id=1, name='水浒传', author='施耐庵'}]
    books2:[Book{id=1, name='三国演义', author='罗贯中'}]
    
    • 1
    • 2
  • 相关阅读:
    Git - 版本控制系统
    Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用
    5.SpringMVC的视图
    为什么国外10年开发者退出 Android 开发以及他现在打算做什么
    org.apache.commons.lang3.StringUtils工具类使用大全
    Springboot-‘@Getter‘ not applicable to type,报错是因为没有引用lombok依赖
    身份安全的零信任方法
    java计算机毕业设计vue架构云餐厅美食订餐系统MyBatis+系统+LW文档+源码+调试部署
    语音信号处理基础知识之频谱、相位谱、幅度谱、功率谱及语谱图
    适合短期内想快速上手数字孪生系统的人使用的数字孪生软件推荐
  • 原文地址:https://blog.csdn.net/GXL_1012/article/details/125990692