• springboot多数据源配置-通过SqlSessionFactory指定的数据源来操作指定目录的XML文件的方式


    前言:

    本文使用application或yml+配置类的方式,进行多数据源配置,与传统的xml方式相比,原理一致,但该方式更简便,上手难度低,避免的繁琐的xml配置,企业级开发一般使用该方式

    springboot传统的xml方式配置多数据源_链接

    以MySQL和Oracle两个数据库为例

    1、准备工作

    1.1、项目中使用的基本清单

    • springboot 2.3.7.RELEASE
    • MySQL 5.7.38
    • Oracle 19
    • mybatis-plus

    1.2、两种数据库分别新建两个测试表

    建表如下:

    1.2.1、MySQL建表及初始化数据语句

    1. CREATE TABLE `user` (
    2. `id` bigint(20) NOT NULL AUTO_INCREMENT,
    3. `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
    4. `age` int(11) NULL DEFAULT NULL,
    5. PRIMARY KEY (`id`) USING BTREE
    6. ) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
    7. INSERT INTO `user` VALUES (1, '张三', 18);
    8. INSERT INTO `user` VALUES (2, '李四', 19);
    9. INSERT INTO `user` VALUES (3, '王五', 20);
    10. INSERT INTO `user` VALUES (4, '赵六', 19);
    11. INSERT INTO `user` VALUES (5, '老七', 17);
    12. INSERT INTO `user` VALUES (6, '芈八子', 18);
    13. INSERT INTO `user` VALUES (7, '久久', 99);

    1.2.2、Oracle建表及初始化数据语句

    1. --Oracle测试表
    2. CREATE TABLE city (
    3. id number(10) not null,
    4. name varchar2(40),
    5. parent varchar2(40)
    6. );
    7. insert into city(id,name,parent) values(1,'广州','广东');
    8. insert into city(id,name,parent) values(1,'深圳','广东');
    9. insert into city(id,name,parent) values(1,'厦门','福建');
    10. insert into city(id,name,parent) values(1,'长沙','湖南');
    11. commit;

    1.3、数据库基本信息如下

    数据库类型数据库名称账号密码
    MySQLdemorootroot
    Oracledemo2root123456

    2、搭建springboot项目

    这里我就略过了,我使用的版本为2.3.7.RELEASE

    这里附上项目所需的maven依赖,如下(注意Druid与mybatis的版本):

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-webartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>com.baomidougroupId>
    7. <artifactId>mybatis-plus-boot-starterartifactId>
    8. <version>3.3.0version>
    9. dependency>
    10. <dependency>
    11. <groupId>com.alibabagroupId>
    12. <artifactId>druidartifactId>
    13. <version>1.1.21version>
    14. dependency>
    15. <dependency>
    16. <groupId>com.alibabagroupId>
    17. <artifactId>fastjsonartifactId>
    18. <version>1.2.72version>
    19. dependency>
    20. <dependency>
    21. <groupId>com.google.code.gsongroupId>
    22. <artifactId>gsonartifactId>
    23. <version>2.8.5version>
    24. dependency>
    25. <dependency>
    26. <groupId>org.apache.commonsgroupId>
    27. <artifactId>commons-lang3artifactId>
    28. <version>3.1version>
    29. dependency>
    30. <dependency>
    31. <groupId>mysqlgroupId>
    32. <artifactId>mysql-connector-javaartifactId>
    33. <version>5.1.48version>
    34. <scope>runtimescope>
    35. dependency>
    36. <dependency>
    37. <groupId>com.oraclegroupId>
    38. <artifactId>ojdbc6artifactId>
    39. <version>11.2.0.4.0version>
    40. <scope>runtimescope>
    41. dependency>
    42. <dependency>
    43. <groupId>org.projectlombokgroupId>
    44. <artifactId>lombokartifactId>
    45. <optional>trueoptional>
    46. dependency>
    47. <dependency>
    48. <groupId>org.springframework.bootgroupId>
    49. <artifactId>spring-boot-starter-testartifactId>
    50. <scope>testscope>
    51. <exclusions>
    52. <exclusion>
    53. <groupId>org.junit.vintagegroupId>
    54. <artifactId>junit-vintage-engineartifactId>
    55. exclusion>
    56. exclusions>
    57. dependency>

    3、配置开始

    3.1、配置两个数据源的链接信息

    在resource目录下,新建application.yml文件,并配置两个数据源的链接信息:

    如下:

    1. spring:
    2. datasource:
    3. #使用Druid数据源连接池
    4. type: com.alibaba.druid.pool.DruidDataSource
    5. #数据源01的连接信息
    6. db1:
    7. #存在多个 url时,必须使用jdbc-url来定义,否则连接不到数据库
    8. jdbc-url: jdbc:mysql://127.0.0.1:3306/demo
    9. username: root
    10. password: root
    11. driver-class-name: com.mysql.jdbc.Driver
    12. #数据源02的连接信息
    13. db2:
    14. jdbc-url: jdbc:oracle:thin:@127.0.0.1:1521:salescdh
    15. username: root
    16. password: 123456
    17. driver-class-name: oracle.jdbc.OracleDriver

    3.2、生成配置类

    在与controller同层中,新建一个包,存放两个数据源对应的配置类

    如下:

     内容如下:


    3.2.1、DataSource01配置类:

    1. package com.shuizhu.config;
    2. import org.apache.ibatis.session.SqlSessionFactory;
    3. import org.mybatis.spring.SqlSessionFactoryBean;
    4. import org.mybatis.spring.annotation.MapperScan;
    5. import org.springframework.beans.factory.annotation.Qualifier;
    6. import org.springframework.boot.context.properties.ConfigurationProperties;
    7. import org.springframework.boot.jdbc.DataSourceBuilder;
    8. import org.springframework.context.annotation.Bean;
    9. import org.springframework.context.annotation.Configuration;
    10. import org.springframework.context.annotation.Primary;
    11. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    12. import javax.sql.DataSource;
    13. /**
    14. * 数据源01的配置类
    15. *
    16. * @author 睡竹
    17. * @date 2022/9/19
    18. */
    19. @Configuration
    20. @MapperScan(basePackages = "com.shuizhu.dao.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")
    21. public class DataSource01 {
    22. @Primary
    23. @Bean(name = "db1DataSource")
    24. @ConfigurationProperties("spring.datasource.db1")
    25. public DataSource db1DataSource() {
    26. return DataSourceBuilder.create().build();
    27. }
    28. @Bean(name = "db1SqlSessionFactory")
    29. public SqlSessionFactory sqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
    30. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    31. bean.setDataSource(dataSource);
    32. //bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResource("classpath:mapper/db1/Demo.xml"));
    33. PathMatchingResourcePatternResolver resource = new PathMatchingResourcePatternResolver();
    34. bean.setMapperLocations(resource.getResources("classpath:mapper/db1/*.xml"));
    35. return bean.getObject();
    36. }
    37. }

    3.2.2、DataSource02配置类:

    1. package com.shuizhu.config;
    2. import org.apache.ibatis.session.SqlSessionFactory;
    3. import org.mybatis.spring.SqlSessionFactoryBean;
    4. import org.mybatis.spring.annotation.MapperScan;
    5. import org.springframework.beans.factory.annotation.Qualifier;
    6. import org.springframework.boot.context.properties.ConfigurationProperties;
    7. import org.springframework.boot.jdbc.DataSourceBuilder;
    8. import org.springframework.context.annotation.Bean;
    9. import org.springframework.context.annotation.Configuration;
    10. import org.springframework.context.annotation.Primary;
    11. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    12. import javax.sql.DataSource;
    13. /**
    14. * 数据源02的配置类
    15. *
    16. * @author 睡竹
    17. * @date 2022/9/19
    18. */
    19. @Configuration
    20. @MapperScan(basePackages = "com.shuizhu.dao.db2", sqlSessionFactoryRef = "db2SqlSessionFactory")
    21. public class DataSource02 {
    22. @Primary
    23. @Bean(name = "db2DataSource")
    24. @ConfigurationProperties("spring.datasource.db2")
    25. public DataSource db2DataSource() {
    26. return DataSourceBuilder.create().build();
    27. }
    28. @Bean(name = "db2SqlSessionFactory")
    29. public SqlSessionFactory sqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
    30. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    31. bean.setDataSource(dataSource);
    32. bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/*.xml"));
    33. return bean.getObject();
    34. }
    35. }

    3.3、生成xml映射文件

    如图所示:

    db1文件夹表示数据源1的映射xml文件存放地;

    db2文件夹表示数据源2的映射xml文件存放地。

    分别在文件夹下新建xml映射文件:

     手写测试的SQL代码:

    Demo.xml:

    1. "1.0" encoding="UTF-8"?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.shuizhu.dao.db1.DemoDao">
    4. <select id="getUsers" resultType="com.shuizhu.domain.User">
    5. select id,name,age from user
    6. select>
    7. mapper>

    Demo2.xml:

    1. "1.0" encoding="UTF-8"?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.shuizhu.dao.db2.DemoOracleDao">
    4. <select id="getCitys" resultType="com.shuizhu.domain.City">
    5. select id,name,parent from city
    6. select>
    7. mapper>

    3.4、生成DAO接口层代码

    如图所示:

    测试代码如下:

    DemoDao代码:

    1. package com.shuizhu.dao.db1;
    2. import com.shuizhu.domain.User;
    3. import org.springframework.stereotype.Repository;
    4. import java.util.List;
    5. /**
    6. * MySQL数据源的dao
    7. * @author 睡竹
    8. * @date 2022/9/15
    9. */
    10. @Repository
    11. public interface DemoDao {
    12. //@Select("select id,name,age from user")
    13. List getUsers();
    14. }

     DemoOracleDao代码:

    1. package com.shuizhu.dao.db2;
    2. import com.shuizhu.domain.City;
    3. import org.springframework.stereotype.Repository;
    4. import java.util.List;
    5. /**
    6. * Oracle数据源的dao
    7. * @author 睡竹
    8. * @date 2022/9/15
    9. */
    10. @Repository
    11. public interface DemoOracleDao {
    12. List getCitys();
    13. }

    3.5、在启动类上,添加注解属性

    如图所示:

    4、测试

     4.1、Controller层:

    1. package com.shuizhu.controller;
    2. import com.shuizhu.domain.City;
    3. import com.shuizhu.domain.User;
    4. import com.shuizhu.service.IDemoService;
    5. import org.springframework.web.bind.annotation.RequestMapping;
    6. import org.springframework.web.bind.annotation.RestController;
    7. import javax.annotation.Resource;
    8. import java.util.List;
    9. /**
    10. * @author 睡竹
    11. * @date 2022/9/15
    12. */
    13. @RestController
    14. public class DemoController {
    15. @Resource
    16. private IDemoService service;
    17. /**
    18. * 测试MySQL数据源是否生效
    19. * @return
    20. */
    21. @RequestMapping("testMySQL")
    22. public Object testMySQL(){
    23. List users = service.getUsers();
    24. return users;
    25. }
    26. /**
    27. * 测试Oracle数据源是否生效
    28. * @return
    29. */
    30. @RequestMapping("testOracle")
    31. public Object testOracle(){
    32. List users = service.getCitys();
    33. return users;
    34. }
    35. }

    4.2、Service接口层:

    1. package com.shuizhu.service;
    2. import com.shuizhu.domain.City;
    3. import com.shuizhu.domain.User;
    4. import java.util.List;
    5. /**
    6. * @author 睡竹
    7. * @date 2022/9/15
    8. */
    9. public interface IDemoService {
    10. List getUsers();
    11. List getCitys();
    12. }

    4.3、Service接口实现层:

    1. package com.shuizhu.service.impl;
    2. import com.shuizhu.dao.mysql.DemoDao;
    3. import com.shuizhu.dao.oracle.DemoOracleDao;
    4. import com.shuizhu.domain.City;
    5. import com.shuizhu.domain.User;
    6. import com.shuizhu.service.IDemoService;
    7. import lombok.RequiredArgsConstructor;
    8. import org.springframework.stereotype.Service;
    9. import java.util.List;
    10. /**
    11. * 偷懒了,直接写入到同一个service
    12. * @author 睡竹
    13. * @date 2022/9/15
    14. */
    15. @Service
    16. @RequiredArgsConstructor
    17. public class DemoService implements IDemoService {
    18. //MySQL的Dao构造器注入
    19. final DemoDao dao1;
    20. //Oracle的Dao构造器注入
    21. final DemoOracleDao dao2;
    22. @Override
    23. public List getUsers() {
    24. List users = dao1.getUsers();
    25. return users;
    26. }
    27. @Override
    28. public List getCitys() {
    29. List citys = dao2.getCitys();
    30. return citys;
    31. }
    32. }

    4.4、Domain实体类层:

    User实体类:

    1. package com.shuizhu.domain;
    2. import lombok.Data;
    3. import java.io.Serializable;
    4. /**
    5. * MySQL库user表实体类
    6. * @author 睡竹
    7. * @date 2022/9/15
    8. */
    9. @Data
    10. public class User implements Serializable {
    11. private static final long serialVersionUID = 1L;
    12. private Integer id;
    13. private String name;
    14. private Integer age;
    15. }

    City实体类:

    1. package com.shuizhu.domain;
    2. import lombok.Data;
    3. import java.io.Serializable;
    4. /**
    5. * Oracle库city表实体类
    6. * @author 睡竹
    7. * @date 2022/9/16
    8. */
    9. @Data
    10. public class City implements Serializable {
    11. private static final long serialVersionUID = 1L;
    12. private Integer id;
    13. private String name;
    14. private String parent;
    15. }

    至此,测试流程及代码都已实现

    附上整个springboot项目完整目录结构如:

     5、使用api工具测试接口

    使用api工具对接口进行测试,检验数据源是否生效

    5.1、测试MySQL数据的接口

    请求路径:http://127.0.0.1:9080/testMySQL

    5.2、 测试Oracle数据的接口

    请求路径:http://127.0.0.1:9080/testOracle

    测试成功,多数据源配置生效 

    案例代码:shuizhu-multiple-ds: 多数据源配置-通过SqlSessionFactory指定的数据源来操作指定目录的XML文件的方式https://gitee.com/ct668/shuizhu-multiple-ds

  • 相关阅读:
    [附源码]计算机毕业设计在线教育系统Springboot程序
    kafka入门教程,介绍全面
    【broadcast-service】一个轻量级Python发布订阅者框架
    illustrator插件-画板功能开发-全部页面加矩形-垂直两分-水平两分-AI插件
    基于三维GIS系统的智慧水库管理应用
    【踩坑日记】vue项目ie打不开报错SCRIPT1006:缺少‘)‘
    深入理解Redis集群模式、协议、元数据维护方式
    Vmware下的虚拟机NAT连接后仍然木有网络
    mv-lcd初始化
    PHP 数组学习资料
  • 原文地址:https://blog.csdn.net/weixin_42675423/article/details/126932977