SpringBoot:整合Mybatis;操作多个数据源

郎家岭伯爵 2022年03月10日 570次浏览

背景

使用SpringBoot整合Mybatis,同时需要连接多个数据源进行操作。

实现

单个数据源

创建实体类

注:

  • 只有查询方法需要用到实体类,因为查询到数据之后一般会进行其它操作,而这需要将数据获取到List<E>中进行操作。
  • 增删改操作不需要实体类,直接创建Mapper接口即可。
package com.example.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private String sex;
}

创建Mapper接口

注:

  • 如果需要执行附带有多个条件的SQL语句,需要在接口方法中使用@Param("varName")来为Spring指明变量。
package com.example.mapper;

import com.example.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface Db1Mapper {
    List<User> queryAllUsers();
}

创建Mybatis的xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper:根标签,namespace:命名空间,随便写,一般保证命名空间唯一 -->
<mapper namespace="com.example.mapper.Db1Mapper">
    <!-- statement,内容:sql语句。id:唯一标识,随便写,在同一个命名空间下保持唯一
       resultType:sql语句查询结果集的封装类型,tb_user即为数据库中的表
     -->

    <!--resultType的路径要与项目文件的路径保持一致,否则同样会报错!!-->
    <select id="queryAllUsers" resultType="User">

        SELECT name,sex  FROM TestTable

    </select>
</mapper>

properties配置文件

# 应用名称
spring.application.name=mybatis-demo


# 数据库db1
spring.datasource.username=root
spring.datasource.password=654321
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/ITAM?serverTimezone=UTC


#下面这些内容是为了让MyBatis映射
#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mybatis/mapper/*xml
#指定Mybatis的实体目录
mybatis.type-aliases-package=com.example.pojo

创建Service测试类

package com.example.service;

import com.example.mapper.Db1Mapper;
import com.example.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@Service
@RestController
public class Db1Service {
    @Autowired
    private Db1Mapper db1Mapper;

    @GetMapping("/db1")
    public List<User> Db1Test(){

        return db1Mapper.queryAllUsers();
    }
}

项目目录

测试结果

注:

  • 此处推荐一个Google插件:JSONVue,可自动解析JSON格式的数据。

多个数据源

本章节基于单个数据源新增第二个数据源进行演示。

引入依赖

使用组件dynamic-datasource来实现多数据源支持,在pom.xml文件中插入如下依赖。

<!-- https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring-boot-starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>

创建第二个实体类

注:

  • 同上一章节。只有查询操作需要用到实体类,增删改不需要实体类。
package com.example.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Fdid {
    private String FD_ID;
    private String FD_FACT_NODE_ID;
}

创建第二个Mapper接口

注:

  • 同上一章节。如果需要执行附带有多个条件的SQL语句,需要在接口方法中使用@Param("varName")来为Spring指明变量。
package com.example.mapper;

import com.example.pojo.Fdid;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface Db2Mapper {
    List<Fdid> queryAllFdid();
}

创建第二个Mybatis的xml文件

注:

  • xml文件也可使用同一个,此处建立两个便于区分业务。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper:根标签,namespace:命名空间,随便写,一般保证命名空间唯一 -->
<mapper namespace="com.example.mapper.Db2Mapper">
    <!-- statement,内容:sql语句。id:唯一标识,随便写,在同一个命名空间下保持唯一
       resultType:sql语句查询结果集的封装类型,tb_user即为数据库中的表
     -->

    <!--resultType的路径要与项目文件的路径保持一致,否则同样会报错!!-->
    <select id="queryAllFdid" resultType="Fdid">

        select FD_ID,FD_FACT_NODE_ID
        from table
        WHERE  FD_PROCESS_ID = 'f1'

    </select>
</mapper>

properties配置文件中新增第二个数据源配置

需要在配置文件里使用 dynamic-datasource 进行配置。

# 应用名称
spring.application.name=mybatis-demo

#下面这些内容是为了让MyBatis映射
#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mybatis/mapper/*xml
#指定Mybatis的实体目录
mybatis.type-aliases-package=com.example.pojo

#设置默认的数据源
spring.datasource.dynamic.primary=db1
#设置严格模式,默认false不启动。启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源
spring.datasource.dynamic.strict=false
#Ekp数据库信息
spring.datasource.dynamic.datasource.db1.username=root
spring.datasource.dynamic.datasource.db1.password=reader!234
spring.datasource.dynamic.datasource.db1.url=jdbc:oracle:thin:@127.0.0.1:1521/db?serverTimezone=UTC&Unicode=true&characterEncoding=utf-8
spring.datasource.dynamic.datasource.db1.driver-class-name=oracle.jdbc.driver.OracleDriver

#ITAM_BI数据库
spring.datasource.dynamic.datasource.db2.username=root
spring.datasource.dynamic.datasource.db2.password=654321
spring.datasource.dynamic.datasource.db2.url=jdbc:mysql://127.0.0.1:3306/ITAM?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false
spring.datasource.dynamic.datasource.db2.driver-class-name=com.mysql.cj.jdbc.Driver

修改第一个Service测试类

package com.example.service;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.example.mapper.Db1Mapper;
import com.example.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@Service
@RestController
public class Db1Service {
    @Autowired
    private Db1Mapper db1Mapper;

    @GetMapping("/db1")
    @DS("db1")
    public List<User> Db1Test(){

        return db1Mapper.queryAllUsers();
    }
}

创建第二个Service测试类

package com.example.service;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.example.mapper.Db2Mapper;
import com.example.pojo.Fdid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@Service
public class Db2Service {

    @Autowired
    private Db2Mapper db2Mapper;

    @GetMapping("/db2")
    @DS("db2")
    public List<Fdid> Db2Test(){
        return db2Mapper.queryAllFdid();
    }
}

项目目录

测试结果

总结

SpringBoot整合单个数据源的Mybatis相信没有任何问题,整合多个数据源的步骤总结一下:

  1. 引入依赖:dynamic-datasource;
  2. 创建第二个数据源的实体类、mapper类、xml文件以及测试的Service类,实际上完全复刻第一个数据源的操作即可;
  3. 依据dynamic-datasource来配置properties文件中的数据源。配置时要注意层次结构与单个数据源时多了一层datasource,千万别搞错;
  4. 使用时在mapper的实例化方法前加@DS("ds1")注解来区分所要操作的数据源;
  5. 测试。

简单总结:引入依赖 - 配置properties文件 - @DS()注解区分数据源

SpringBoot整和多数据源的Mybatis仍有更多的方式,大家如有更好的方式欢迎在评论区沟通学习。