springboot干货——(十二)多数据源配置之mybatis

关于多数据源的配置之前有整合过jdbc和springdata,但是这两种情况在实际的项目中用的不是很多,主要原因是jdbc的sql语句需要自己来写,后期维护什么的不是很好;springdata这块国内用的不是很多,相对而言坑比较多,一般企业级开发不是很敢用。本篇博客主要讲基于整合mybatis的多数据源配置。在写这篇博客之前也大致在网上看了一些资料,综合了这些资料进行了一个取长补短的配置,保证了代码在能够运行的同时更加简单。

 

正文

1.老规矩,先来看下项目结构图

springboot干货——(十二)多数据源配置之mybatis

 

2.pom.xml如下:

 

 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  4. <modelVersion>4.0.0</modelVersion>

  5.  
  6. <groupId>spring-boot</groupId>

  7. <artifactId>spring-boot-mybatis</artifactId>

  8. <version>0.0.1-SNAPSHOT</version>

  9. <packaging>jar</packaging>

  10.  
  11. <name>spring-boot-mybatis</name>

  12. <description>Demo project for Spring Boot</description>

  13.  
  14. <parent>

  15. <groupId>org.springframework.boot</groupId>

  16. <artifactId>spring-boot-starter-parent</artifactId>

  17. <version>1.5.9.RELEASE</version>

  18. <relativePath/> <!-- lookup parent from repository -->

  19. </parent>

  20.  
  21. <properties>

  22. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  23. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

  24. <java.version>1.8</java.version>

  25. </properties>

  26.  
  27. <dependencies>

  28. <dependency>

  29. <groupId>org.mybatis.spring.boot</groupId>

  30. <artifactId>mybatis-spring-boot-starter</artifactId>

  31. <version>1.3.1</version>

  32. </dependency>

  33.  
  34. <dependency>

  35. <groupId>org.springframework.boot</groupId>

  36. <artifactId>spring-boot-starter-test</artifactId>

  37. <scope>test</scope>

  38. </dependency>

  39. <dependency>

  40. <groupId>mysql</groupId>

  41. <artifactId>mysql-connector-java</artifactId>

  42. </dependency>

  43. <dependency>

  44. <groupId>com.alibaba</groupId>

  45. <artifactId>druid</artifactId>

  46. <version>1.0.29</version>

  47. </dependency>

  48. <dependency>

  49. <groupId>org.springframework.boot</groupId>

  50. <artifactId>spring-boot-starter-web</artifactId>

  51. </dependency>

  52. </dependencies>

  53.  
  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. </project>


3.application.properties

 

 
  1. spring.datasource.primary.url=jdbc:mysql://localhost:3306/test

  2. spring.datasource.primary.username=root

  3. spring.datasource.primary.password=19940315

  4. spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver

  5.  
  6. spring.datasource.secondary.url=jdbc:mysql://localhost:3306/myweb

  7. spring.datasource.secondary.username=root

  8. spring.datasource.secondary.password=19940315

  9. spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver


4.DataSourceConfig

【注意】@ConfigurationProperties:把配置文件的信息,读取并自动封装成实体类,无需进行set

 

 
  1. package com.gwd.config;

  2.  
  3. import javax.sql.DataSource;

  4. import org.springframework.beans.factory.annotation.Qualifier;

  5. import org.springframework.boot.context.properties.ConfigurationProperties;

  6. import org.springframework.context.annotation.Bean;

  7. import org.springframework.context.annotation.Configuration;

  8. import org.springframework.context.annotation.Primary;

  9. /**

  10. * @ProjectName spring-boot-datas-jpa

  11. * @author JackHisen(gu.weidong)

  12. * @Date 2018年2月16日 下午1:49:13

  13. * @Version 1.0

  14. * @Description:

  15. */

  16. @Configuration

  17. public class DataSourceConfig {

  18.  
  19. @Bean(name = "primaryDataSource")

  20. @Qualifier("primaryDataSource")

  21. @ConfigurationProperties(prefix="spring.datasource.primary")

  22. public DataSource primaryDataSource() {

  23. DataSource dataSource = new com.alibaba.druid.pool.DruidDataSource();

  24. return dataSource;

  25. }

  26.  
  27. @Bean(name = "secondaryDataSource")

  28. @Qualifier("secondaryDataSource")

  29. @Primary

  30. @ConfigurationProperties(prefix="spring.datasource.secondary")

  31. public DataSource secondaryDataSource() {

  32. DataSource dataSource = new com.alibaba.druid.pool.DruidDataSource();

  33. return dataSource;

  34. }

  35. }


PrimaryConfig:

【注意】这边设置了mapper的扫描路径,已经mapper.xml的位置

 

 
  1. package com.gwd.config;

  2.  
  3. import javax.sql.DataSource;

  4. import org.apache.ibatis.session.SqlSessionFactory;

  5. import org.mybatis.spring.SqlSessionFactoryBean;

  6. import org.mybatis.spring.annotation.MapperScan;

  7. import org.springframework.beans.factory.annotation.Autowired;

  8. import org.springframework.beans.factory.annotation.Qualifier;

  9. import org.springframework.context.annotation.Bean;

  10. import org.springframework.context.annotation.Configuration;

  11. import org.springframework.context.annotation.Primary;

  12. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

  13. import org.springframework.jdbc.datasource.DataSourceTransactionManager;

  14. /**

  15. * @ProjectName spring-boot-mybatis

  16. * @author JackHisen(gu.weidong)

  17. * @Date 2018年2月16日 下午9:52:48

  18. * @Version 1.0

  19. * @Description:

  20. */

  21. @Configuration

  22. //扫描 Mapper 接口并容器管理

  23. @MapperScan(basePackages = PrimaryConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")

  24. public class PrimaryConfig {

  25.  
  26. // 精确到 master 目录,以便跟其他数据源隔离

  27. static final String PACKAGE = "com.gwd.mapper.stu";

  28. static final String MAPPER_LOCATION = "classpath:mapper/stu/*.xml";

  29.  
  30. @Autowired

  31. @Qualifier("primaryDataSource")

  32. private DataSource primaryDataSource;

  33.  
  34.  
  35. @Bean(name = "masterTransactionManager")

  36. @Primary

  37. public DataSourceTransactionManager masterTransactionManager() {

  38. return new DataSourceTransactionManager(primaryDataSource);

  39. }

  40.  
  41. @Bean(name = "masterSqlSessionFactory")

  42. @Primary

  43. public SqlSessionFactory masterSqlSessionFactory(@Qualifier("primaryDataSource") DataSource primaryDataSource)

  44. throws Exception {

  45. final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

  46. sessionFactory.setDataSource(primaryDataSource);

  47. sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()

  48. .getResources(PrimaryConfig.MAPPER_LOCATION));

  49. return sessionFactory.getObject();

  50. }

  51. }

 

SecondaryConfig:

 
  1. package com.gwd.config;

  2.  
  3. import javax.sql.DataSource;

  4. import org.apache.ibatis.session.SqlSessionFactory;

  5. import org.mybatis.spring.SqlSessionFactoryBean;

  6. import org.mybatis.spring.annotation.MapperScan;

  7. import org.springframework.beans.factory.annotation.Autowired;

  8. import org.springframework.beans.factory.annotation.Qualifier;

  9. import org.springframework.context.annotation.Bean;

  10. import org.springframework.context.annotation.Configuration;

  11. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

  12. import org.springframework.jdbc.datasource.DataSourceTransactionManager;

  13. /**

  14. * @ProjectName spring-boot-mybatis

  15. * @author JackHisen(gu.weidong)

  16. * @Date 2018年2月16日 下午10:06:12

  17. * @Version 1.0

  18. * @Description:

  19. */

  20. @Configuration

  21. //扫描 Mapper 接口并容器管理

  22. @MapperScan(basePackages = SecondaryConfig.PACKAGE, sqlSessionFactoryRef = "clusterSqlSessionFactory")

  23. public class SecondaryConfig {

  24.  
  25. // 精确到 cluster 目录,以便跟其他数据源隔离

  26. static final String PACKAGE = "com.gwd.mapper.user";

  27. static final String MAPPER_LOCATION = "classpath:mapper/user/*.xml";

  28. @Autowired

  29. @Qualifier("secondaryDataSource")

  30. private DataSource secondaryDataSource;

  31.  
  32. @Bean(name = "clusterTransactionManager")

  33. public DataSourceTransactionManager clusterTransactionManager() {

  34. return new DataSourceTransactionManager(secondaryDataSource);

  35. }

  36.  
  37. @Bean(name = "clusterSqlSessionFactory")

  38. public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("secondaryDataSource") DataSource secondaryDataSource)

  39. throws Exception {

  40. final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

  41. sessionFactory.setDataSource(secondaryDataSource);

  42. sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()

  43. .getResources(SecondaryConfig.MAPPER_LOCATION));

  44. return sessionFactory.getObject();

  45. }

  46. }


5.model层

model层是mybatis的逆向工具自动生成

 

6.dao层【均是自动生成】

stuMapper:

 

 
  1. package com.gwd.mapper.stu;

  2.  
  3. import com.gwd.model.stu.Stu;

  4. public interface StuMapper {

  5. Stu selectByPrimaryKey(Integer id);

  6. }

 

userMapper:

 

 
  1. package com.gwd.mapper.user;

  2.  
  3. import com.gwd.model.user.User;

  4.  
  5. public interface UserMapper {

  6. User selectByPrimaryKey(Integer id);

  7. }

 


7.service(忽略代码)和service实现类

【注意】不能忘了@service注解
stuServiceImpl:

 

 
  1. package com.gwd.service.impl;

  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;

  4. import org.springframework.stereotype.Service;

  5. import com.gwd.mapper.stu.StuMapper;

  6. import com.gwd.model.stu.Stu;

  7. import com.gwd.service.StuService;

  8. /**

  9. * @ProjectName spring-boot-mybatis

  10. * @author JackHisen(gu.weidong)

  11. * @Date 2018年2月16日 下午10:10:25

  12. * @Version 1.0

  13. * @Description:

  14. */

  15. @Service

  16. public class StuServiceImpl implements StuService{

  17. @Autowired

  18. StuMapper stuMapper;

  19. @Override

  20. public Stu getStuById(int id) {

  21. Stu stu = stuMapper.selectByPrimaryKey(id);

  22. return stu;

  23. }

  24. }

 

userServiceImpl:

 

 
  1. package com.gwd.service.impl;

  2. import org.springframework.beans.factory.annotation.Autowired;

  3. /**

  4. * @ProjectName spring-boot-mybatis

  5. * @author JackHisen(gu.weidong)

  6. * @Date 2018年2月16日 下午10:09:43

  7. * @Version 1.0

  8. * @Description:

  9. */

  10. import org.springframework.stereotype.Service;

  11. import com.gwd.mapper.user.UserMapper;

  12. import com.gwd.model.user.User;

  13. import com.gwd.service.UserService;

  14.  
  15. @Service

  16. public class UserServiceImpl implements UserService{

  17. @Autowired

  18. UserMapper userMapper;

  19. @Override

  20. public User getUserById(int id) {

  21. User user = userMapper.selectByPrimaryKey(id);

  22. return user;

  23. }

  24. }


8.controller

 

 

package com.gwd.controller;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.gwd.model.stu.Stu;
import com.gwd.model.user.User;
import com.gwd.service.StuService;
import com.gwd.service.UserService;
 
/** 
* @ProjectName spring-boot-mybatis
* @author JackHisen(gu.weidong) 
* @Date 2018年2月16日 下午9:54:52    
* @Version 1.0 
* @Description:
*/
@RestController
public class TestController {
    @Autowired
    UserService userService;
    
    @Autowired
    StuService stuService;
    
    @RequestMapping("getUser")
    public String getUser() {
        User user = userService.getUserById(6);
        return user.getUsername();
    }
    
    @RequestMapping("getStu")
    public String getStu() {
        Stu stu = stuService.getStuById(1);
        return stu.getName();
    }
}
 


 

9.结果:成功!!!

springboot干货——(十二)多数据源配置之mybatisspringboot干货——(十二)多数据源配置之mybatis
 

 

--------------------- 作者:东天里的冬天 来源:**** 原文:https://blog.****.net/gwd1154978352/article/details/79331176?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!