SpringBoot根据包名进行区分使用多数据源

就是让一个项目应用并使用多个数据库,这里采用的是SpringBoot2.0、MySql5.7,使用两个两个MySql数据库

1、建立两个数据库

2、建立一个SpringBoot项目

3、Pom文件


 
 
  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. <groupId>czs </groupId>
  6. <artifactId>springboot-manyDatasource </artifactId>
  7. <version>0.0.1-SNAPSHOT </version>
  8. <packaging>jar </packaging>
  9. <name>springboot-manyDatasource </name>
  10. <description>springboot使用多个数据源(多个数据库) </description>
  11. <parent>
  12. <groupId>org.springframework.boot </groupId>
  13. <artifactId>spring-boot-starter-parent </artifactId>
  14. <version>2.0.0.RELEASE </version>
  15. <relativePath/> <!-- lookup parent from repository -->
  16. </parent>
  17. <properties>
  18. <project.build.sourceEncoding>UTF-8 </project.build.sourceEncoding>
  19. <project.reporting.outputEncoding>UTF-8 </project.reporting.outputEncoding>
  20. <java.version>1.8 </java.version>
  21. </properties>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.boot </groupId>
  25. <artifactId>spring-boot-starter-jdbc </artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot </groupId>
  29. <artifactId>spring-boot-starter-web </artifactId>
  30. </dependency>
  31. <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
  32. <dependency>
  33. <groupId>org.mybatis.spring.boot </groupId>
  34. <artifactId>mybatis-spring-boot-starter </artifactId>
  35. <version>1.3.0 </version> <!-- 1.3.0以上的版本没有@MapperScan以及@Select注解 -->
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework.boot </groupId>
  39. <artifactId>spring-boot-devtools </artifactId>
  40. <scope>runtime </scope>
  41. </dependency>
  42. <dependency>
  43. <groupId>mysql </groupId>
  44. <artifactId>mysql-connector-java </artifactId>
  45. <scope>runtime </scope>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.projectlombok </groupId>
  49. <artifactId>lombok </artifactId>
  50. <optional>true </optional>
  51. <version>1.18.2 </version>
  52. </dependency>
  53. <dependency>
  54. <groupId>org.springframework.boot </groupId>
  55. <artifactId>spring-boot-starter-test </artifactId>
  56. <scope>test </scope>
  57. </dependency>
  58. <dependency>
  59. <groupId>org.springframework.boot </groupId>
  60. <artifactId>spring-boot-configuration-processor </artifactId>
  61. <optional>true </optional>
  62. </dependency>
  63. </dependencies>
  64. <build>
  65. <plugins>
  66. <plugin>
  67. <groupId>org.springframework.boot </groupId>
  68. <artifactId>spring-boot-maven-plugin </artifactId>
  69. </plugin>
  70. </plugins>
  71. </build>
  72. </project>

4、书写application.properties文件,配置两个数据库连接


 
 
  1. ###datasource1
  2. spring.datasource.test1.driver- class- name = com.mysql.jdbc.Driver
  3. spring.datasource.test1.jdbc-url = jdbc:mysql: //192.168.25.11:3306/18-08-12-manyDatasource1?useUnicode=true&characterEncoding=utf-8
  4. spring.datasource.test1.username = root
  5. spring.datasource.test1.password =
  6. ###datasource2
  7. spring.datasource.test2.driver- class- name = com.mysql.jdbc.Driver
  8. spring.datasource.test2.jdbc-url = jdbc:mysql: //192.168.25.11:3306/18-08-12-manyDatasource2?useUnicode=true&characterEncoding=utf-8
  9. spring.datasource.test2.username = root
  10. spring.datasource.test2.password =

 发现前缀的不同没有?

数据源一是:spring.datasource.test1.   数据源二是:spring.datasource.test2.

这里记着配置文件中配置数据源是有前缀的,第七步记得有这个前缀

5、书写对应数据库的实体类文件-------此处应用了lombok注解,不懂自行百度学习....


 
 
  1. package czs.entity;
  2. import lombok.Data;
  3. /**
  4. * @author czs
  5. * @version 创建时间:2018年8月12日 下午2:30:46
  6. */
  7. @Data
  8. public class User {
  9. private String name;
  10. private long age;
  11. }

6、书写第一个Dao层的Mapper文件以及Service层

Mapper 


 
 
  1. package czs.mapper1;
  2. import org.apache.ibatis.annotations.Insert;
  3. import org.apache.ibatis.annotations.Param;
  4. import org.apache.ibatis.annotations.Select;
  5. import czs.entity.User;
  6. public interface UserMapper1 {
  7. // 查询语句
  8. @Select( "SELECT * FROM users WHERE NAME = #{name}")
  9. User findByName(@Param("name") String name);
  10. // 添加
  11. @Insert( "INSERT INTO users(NAME, AGE) VALUES(#{name}, #{age})")
  12. int insert(@Param("name") String name, @Param("age") Integer age);
  13. }

 Service


 
 
  1. package czs.mapper1;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Service;
  4. /**
  5. * @author czs
  6. * @version 创建时间:2018年8月12日 下午7:28:07
  7. */
  8. @Service
  9. public class ManyService1 {
  10. @Autowired
  11. private UserMapper1 userMapper1;
  12. public int insert(String name, Integer age) {
  13. return userMapper1.insert(name, age);
  14. }
  15. }

6、书写第二个Dao层的Mapper文件--------------其实和上面那个想相比就是包名和类名以及Service层中的Mapper引用不同

Mapper 


 
 
  1. package czs.mapper2;
  2. import org.apache.ibatis.annotations.Insert;
  3. import org.apache.ibatis.annotations.Param;
  4. import org.apache.ibatis.annotations.Select;
  5. import czs.entity.User;
  6. public interface UserMapper2 {
  7. // 查询语句
  8. @Select( "SELECT * FROM users WHERE NAME = #{name}")
  9. User findByName(@Param("name") String name);
  10. // 添加
  11. @Insert( "INSERT INTO users(NAME, AGE) VALUES(#{name}, #{age})")
  12. int insert(@Param("name") String name, @Param("age") Integer age);
  13. }

 Service


 
 
  1. package czs.mapper2;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Service;
  4. /**
  5. * @author czs
  6. * @version 创建时间:2018年8月12日 下午7:28:07
  7. */
  8. @Service
  9. public class ManyService2 {
  10. @Autowired
  11. private UserMapper2 userMapper2;
  12. public int insert(String name, Integer age) {
  13. return userMapper2.insert(name, age);
  14. }
  15. }

7、配置数据源、事务管理器。。。非常重要的一步,也是这个来分配数据源给哪些类包的

注意类中@MapperScan注解中的basePackages的内容!

第4步说过注意前缀,就是在下面的@ConfigurationProperties(prefix = "spring.datasource.test1")中,是根据这个来选择数据源的


 
 
  1. package czs.datasource;
  2. import javax.sql.DataSource;
  3. import org.apache.ibatis.session.SqlSessionFactory;
  4. import org.mybatis.spring.SqlSessionFactoryBean;
  5. import org.mybatis.spring.SqlSessionTemplate;
  6. import org.mybatis.spring.annotation.MapperScan;
  7. import org.springframework.beans.factory.annotation.Qualifier;
  8. import org.springframework.boot.context.properties.ConfigurationProperties;
  9. import org.springframework.boot.jdbc.DataSourceBuilder;
  10. import org.springframework.context.annotation.Bean;
  11. import org.springframework.context.annotation.Configuration;
  12. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  13. /**
  14. * 读取DataSource01数据源<br>
  15. */
  16. // DataSource01
  17. @Configuration // 注册到springboot容器中
  18. @MapperScan(basePackages = "czs.mapper1", sqlSessionFactoryRef = "test1SqlSessionFactory")
  19. public class DataSource1Config {
  20. /**
  21. * @methodDesc: 功能描述:(配置test01数据库)
  22. */
  23. @Bean(name = "test1DataSource")
  24. @ConfigurationProperties(prefix = "spring.datasource.test1")
  25. public DataSource testDataSource() {
  26. return DataSourceBuilder.create().build();
  27. }
  28. /**
  29. * @methodDesc: 功能描述:(test1 sql会话工厂)
  30. */
  31. @Bean(name = "test1SqlSessionFactory")
  32. public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource)
  33. throws Exception {
  34. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  35. bean.setDataSource(dataSource);
  36. // bean.setMapperLocations(
  37. // new
  38. // PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
  39. return bean.getObject();
  40. }
  41. /**
  42. * @methodDesc: 功能描述:(test1 事物管理)
  43. */
  44. @Bean(name = "test1TransactionManager")
  45. public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
  46. return new DataSourceTransactionManager(dataSource);
  47. }
  48. @Bean(name = "test1SqlSessionTemplate")
  49. public SqlSessionTemplate testSqlSessionTemplate(
  50. @Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
  51. return new SqlSessionTemplate(sqlSessionFactory);
  52. }
  53. }

8、还是非常重要的一步,也是这个来分配数据源给哪些类包的

就是复制上面那步的类,将@MapperScan注解中的basePackages改为放另一个Mapper接口的包名就好!

以下是两个类中不同的部分。。。。。。。。。。。

@MapperScan(basePackages = "czs.mapper1", sqlSessionFactoryRef = "test1SqlSessionFactory")

@ConfigurationProperties(prefix = "spring.datasource.test1")

@MapperScan(basePackages = "czs.mapper2", sqlSessionFactoryRef = "test1SqlSessionFactory")

@ConfigurationProperties(prefix = "spring.datasource.test2")

 

9、Controller层


 
 
  1. package czs;
  2. import javax.annotation.Resource;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import czs.mapper1.ManyService1;
  7. import czs.mapper2.ManyService2;
  8. /**
  9. * @author czs
  10. * @version 创建时间:2018年8月12日 下午9:03:02
  11. */
  12. @RestController
  13. public class ManyController {
  14. @Autowired
  15. private ManyService1 manyService1;
  16. @Resource
  17. private ManyService2 manyService2;
  18. @RequestMapping(value = "datasource1")
  19. public int datasource1(String name, Integer age) {
  20. return manyService1.insert(name, age);
  21. }
  22. @RequestMapping(value = "datasource2")
  23. public int datasource2(String name, Integer age) {
  24. return manyService2.insert(name, age);
  25. }
  26. }

                  1   注意要注入两个Service

                  2   注意有两个@RequestMapping,里面的映射路径不一样

 

10、尝试访问

 

11、查看数据库

    数据源一插入成功!

    数据源二插入成功!

 

最后,多数据源的事务可以参考我的下一篇文章:SpringBoot多数据源事务管理机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值