• 【SpringBoot】SpringBoot 与 MyBatis 多数据源配置(二十九)


      本章介绍SpringBoot 与 MyBatis 多数据源配置,SpringBoot与Mybatis整合内容可以参考【SpringBoot】SpringBoot 与Mybatis整合(十三)

    数据库准备

      1、准备2个数据库,本例以mysql为例

        在第一个数据库test_mysql中,新建表user

     1 -- ----------------------------
     2 -- Table structure for user
     3 -- ----------------------------
     4 DROP TABLE IF EXISTS `user`;
     5 CREATE TABLE `user` (
     6   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
     7   `name` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '名称',
     8   PRIMARY KEY (`id`)
     9 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    10 
    11 -- ----------------------------
    12 -- Records of user
    13 -- ----------------------------
    14 BEGIN;
    15 INSERT INTO `user` VALUES (1, '张三');
    16 INSERT INTO `user` VALUES (2, '李四');
    17 INSERT INTO `user` VALUES (3, '王五');
    18 COMMIT;

        在第二个数据库test_mysql2中,新建表dog

     1 -- ----------------------------
     2 -- Table structure for dog
     3 -- ----------------------------
     4 DROP TABLE IF EXISTS `dog`;
     5 CREATE TABLE `dog` (
     6   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
     7   `dog_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '狗名',
     8   PRIMARY KEY (`id`)
     9 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    10 
    11 -- ----------------------------
    12 -- Records of dog
    13 -- ----------------------------
    14 BEGIN;
    15 INSERT INTO `dog` VALUES (1, '旺财');
    16 INSERT INTO `dog` VALUES (2, '二哈');
    17 INSERT INTO `dog` VALUES (3, '大黑');
    18 COMMIT;

    项目搭建

      1、新建一个SpringBoot Web项目

        完成pom文件如下:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     5     <modelVersion>4.0.0</modelVersion>
     6 
     7     <groupId>com.test</groupId>
     8     <artifactId>test-springboot-muldatasource</artifactId>
     9     <version>1.0-SNAPSHOT</version>
    10 
    11     <parent>
    12         <groupId>org.springframework.boot</groupId>
    13         <artifactId>spring-boot-starter-parent</artifactId>
    14         <version>2.1.8.RELEASE</version>
    15     </parent>
    16 
    17     <properties>
    18 
    19         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    20         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    21         <java.version>1.8</java.version>
    22     </properties>
    23 
    24     <dependencies>
    25 
    26         <dependency>
    27             <groupId>org.springframework.boot</groupId>
    28             <artifactId>spring-boot-starter-web</artifactId>
    29         </dependency>
    30 
    31         <dependency>
    32             <groupId>org.mybatis.spring.boot</groupId>
    33             <artifactId>mybatis-spring-boot-starter</artifactId>
    34             <version>2.0.1</version>
    35         </dependency>
    36 
    37         <!-- mysql -->
    38         <dependency>
    39             <groupId>mysql</groupId>
    40             <artifactId>mysql-connector-java</artifactId>
    41             <version>8.0.12</version>
    42         </dependency>
    43 
    44         <dependency>
    45             <groupId>org.springframework.boot</groupId>
    46             <artifactId>spring-boot-starter-test</artifactId>
    47             <scope>test</scope>
    48         </dependency>
    49 
    50     </dependencies>
    51 
    52 
    53     <!-- SpringBoot打包插件,可以将代码打包成一个可执行的jar包 -->
    54     <build>
    55         <plugins>
    56             <plugin>
    57                 <groupId>org.springframework.boot</groupId>
    58                 <artifactId>spring-boot-maven-plugin</artifactId>
    59             </plugin>
    60         </plugins>
    61     </build>
    62 
    63 </project>
    pom.xml

        项目目录:

          

      2、配置文件application.yml

     1 #master 数据源配置
     2 master:
     3   datasource:
     4     username: admin
     5     password: 123456
     6     # 默认HikariDataSource数据源没有url属性,有的是jdbcUrl属性
     7     # 写url会报错:jdbcUrl is required with driverClassName
     8     jdbc-url: jdbc:mysql://127.0.0.1:3306/test_mybatis?allowPublicKeyRetrieval=true&useSSL=true
     9     # url: jdbc:mysql://127.0.0.1:3306/test_mybatis?allowPublicKeyRetrieval=true&useSSL=true
    10     driver-class-name: com.mysql.jdbc.Driver
    11 
    12 #slave 数据源配置
    13 slave:
    14   datasource:
    15     username: admin
    16     password: 123456
    17     jdbc-url: jdbc:mysql://127.0.0.1:3306/test_mybatis2?allowPublicKeyRetrieval=true&useSSL=true
    18     driver-class-name: com.mysql.jdbc.Driver

      3、数据源配置

        编写2个数据配置类,masterDataSource对应test_mybatis数据库,slaveDataSource对应test_mybatis2数据库,

        MasterDataSourceConfig.java

     1 @Configuration
     2 @MapperScan(basePackages = "com.test.springboot.dao.master",
     3         sqlSessionFactoryRef = "masterSqlSessionFactory")
     4 public class MasterDataSourceConfig {
     5 
     6 
     7     @Bean(name = "masterDataSource")
     8     @Primary
     9     // @ConfigurationProperties给数据源(DataSource)赋值
    10     @ConfigurationProperties(prefix = "master.datasource")
    11     public DataSource masterDataSource() {
    12         DataSource dataSource = DataSourceBuilder.create().build();
    13         return dataSource;
    14     }
    15 
    16 
    17     @Bean(name = "masterSqlSessionFactory")
    18     @Primary
    19     public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
    20         SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    21         bean.setDataSource(dataSource);
    22         bean.setMapperLocations(
    23                 new PathMatchingResourcePatternResolver().getResources("classpath*:/mybatis/mapper/master/*Mapper.xml"));
    24         return bean.getObject();
    25     }
    26 
    27     @Bean(name = "masterTransactionManager")
    28     @Primary
    29     public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
    30         return new DataSourceTransactionManager(dataSource);
    31     }
    32 
    33     @Bean(name = "masterSqlSessionTemplate")
    34     @Primary
    35     public SqlSessionTemplate testSqlSessionTemplate(
    36             @Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
    37         return new SqlSessionTemplate(sqlSessionFactory);
    38     }
    39 }

        SlaveDataSourceConfig.java

     1 @Configuration
     2 @MapperScan(basePackages = "com.test.springboot.dao.slave",
     3         sqlSessionFactoryRef = "slaveSqlSessionFactory")
     4 public class SlaveDataSourceConfig {
     5 
     6     @Value("${slave.datasource.driver-class-name}")
     7     private String driverClassName;
     8 
     9     @Value("${slave.datasource.jdbc-url}")
    10     private String url;
    11 
    12     @Value("${slave.datasource.username}")
    13     private String username;
    14 
    15     @Value("${slave.datasource.password}")
    16     private String password;
    17 
    18     @Bean(name = "slaveDataSource")
    19     public DataSource slaveDataSource() {
    20         HikariDataSource dataSource = new HikariDataSource();
    21         dataSource.setUsername(username);
    22         dataSource.setPassword(password);
    23         dataSource.setJdbcUrl(url);
    24         dataSource.setDriverClassName(driverClassName);
    25         dataSource.setMaximumPoolSize(10);
    26         dataSource.setMinimumIdle(5);
    27         dataSource.setPoolName("slaveDataSourcePool");
    28         return dataSource;
    29     }
    30 
    31 
    32     @Bean(name = "slaveSqlSessionFactory")
    33     public SqlSessionFactory sqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
    34         SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    35         bean.setDataSource(dataSource);
    36         // 设置Mybatis全局配置路径
    37         bean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
    38         bean.setMapperLocations(
    39                 new PathMatchingResourcePatternResolver().getResources("classpath*:/mybatis/mapper/slave/*Mapper.xml"));
    40         return bean.getObject();
    41     }
    42 
    43     @Bean(name = "slaveTransactionManager")
    44     public DataSourceTransactionManager transactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
    45         return new DataSourceTransactionManager(dataSource);
    46     }
    47 
    48     @Bean(name = "slaveSqlSessionTemplate")
    49     public SqlSessionTemplate testSqlSessionTemplate(
    50             @Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
    51         return new SqlSessionTemplate(sqlSessionFactory);
    52     }
    53 }

      4、Dao层

        UserDao在com.test.springboot.dao.master包下

    1 public interface UserDao {
    2     List<User> getAll();
    3 }

        DogDao在com.test.springboot.dao.slave包下

    1 public interface DogDao {
    2 
    3     List<Dog> getAll();
    4 
    5     @Select("INSERT INTO dog (dog_name) VALUES (#{dogName})")
    6     void save(Dog dog);
    7 }

         Xml文件

        mybatis全局配置文件mybatis-config.xml,路径classpath:mybatis/mybatis-config.xml

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE configuration
     3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
     4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
     5 <configuration>
     6 
     7     <settings>
     8         <setting name="mapUnderscoreToCamelCase" value="true"/>
     9     </settings>
    10 </configuration>

        UserMapper.xml,文件路径classpath:mybatis/mapper/master/UserMapper.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.4//EN"
     3         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     4 <mapper namespace="com.test.springboot.dao.master.UserDao">
     5     <resultMap type="com.test.springboot.bean.User" id="user">
     6         <id property="id" column="id"/>
     7         <result property="name" column="name"/>
     8     </resultMap>
     9 
    10     <!-- 获取所有用户 -->
    11     <select id="getAll" resultMap="user">
    12         select * from user
    13     </select>
    14 
    15 </mapper>

        DogMapper.xml,文件路径classpath:mybatis/mapper/slave/DogMapper.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.4//EN"
     3         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     4 <mapper namespace="com.test.springboot.dao.slave.DogDao">
     5 
     6     <!-- 获取所有狗 -->
     7     <select id="getAll" resultType="com.test.springboot.bean.Dog">
     8         select * from dog
     9     </select>
    10 
    11 </mapper>

      5、Servcie层

     1 @Service
     2 public class DogService {
     3 
     4     @Autowired
     5     DogDao dogDao;
     6 
     7     /**
     8      * 在springboot中已经默认对jpa、jdbc、mybatis开启了事事务,引入它们依赖的时候,事物就默认开启。
     9      * springboot开启事务很简单,只需要一个注解@Transactional 就可以了。
    10      * @Transactional可以在在方法上和类上使用。
    11      * @return
    12      */
    13     @Transactional(value = "slaveTransactionManager")
    14     public Integer save() {
    15 
    16         Dog dog = new Dog();
    17         dog.setDogName("大黄");
    18         dogDao.save(dog);
    19 
    20         return 1/0;
    21     }
    22 }

      6、Controller层

     1 @RestController
     2 public class TestController {
     3 
     4     @Autowired
     5     UserDao userDao;
     6 
     7     @Autowired
     8     DogDao dogDao;
     9 
    10     @Autowired
    11     DogService dogService;
    12 
    13     @RequestMapping("/users")
    14     public List<User> users(){
    15         return userDao.getAll();
    16     }
    17 
    18 
    19     @RequestMapping("/dogs")
    20     public List<Dog> dogs(){
    21         return dogDao.getAll();
    22     }
    23 
    24     @RequestMapping("/dog/save")
    25     public Integer save(){
    26         return dogService.save();
    27     }
    28  

      7、实例

        User.java

     1 package com.test.springboot.bean;
     2 
     3 public class Dog {
     4     private Integer id;
     5     private String dogName;
     6 
     7     public Integer getId() {
     8         return id;
     9     }
    10 
    11     public void setId(Integer id) {
    12         this.id = id;
    13     }
    14 
    15     public String getDogName() {
    16         return dogName;
    17     }
    18 
    19     public void setDogName(String dogName) {
    20         this.dogName = dogName;
    21     }
    22 }
    View Code 

        Dog.java

     1 package com.test.springboot.bean;
     2 
     3 public class User {
     4 
     5     private Integer id;
     6     private String name;
     7 
     8     public Integer getId() {
     9         return id;
    10     }
    11 
    12     public void setId(Integer id) {
    13         this.id = id;
    14     }
    15 
    16     public String getName() {
    17         return name;
    18     }
    19 
    20     public void setName(String name) {
    21         this.name = name;
    22     }
    23 }
    View Code 

    项目测试

      1、启动项使用 http://localhost:8080/users 地址访问获取所有用户,由此说明masterDataSource能正常使用

        

      2、使用地址 http://localhost:8080/dogs 访问获取所有狗,由此说明slaveDataSource能正常使用

        

      3、使用地址 http://localhost:8080/dog/save,新增数据,查看数据库中数据是否增加,未增加,判断说明事务已生效。

  • 相关阅读:
    多线程爬取图片(生产者-消费者模式)
    数据结构1_C---单链表的逆转
    Java基础面试知识点总结
    Java工程师必备书单
    Java工程师修炼之路(校招总结)
    Java秋招面经大合集
    我的秋招经验分享(已拿BAT头条网易滴滴)
    听说go语言越来越火了?那么请收下这一份go语言书单吧!
    2020还是AI最火?推荐几本深度学习的书籍帮你入门!
    人工智能真的有那么神秘么,推荐一份机器学习入门书单搞定它!
  • 原文地址:https://www.cnblogs.com/h--d/p/12521577.html
Copyright © 2020-2023  润新知