背景
使用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相信没有任何问题,整合多个数据源的步骤总结一下:
- 引入依赖:
dynamic-datasource
; - 创建第二个数据源的实体类、mapper类、xml文件以及测试的Service类,实际上完全复刻第一个数据源的操作即可;
- 依据
dynamic-datasource
来配置properties
文件中的数据源。配置时要注意层次结构与单个数据源时多了一层datasource
,千万别搞错; - 使用时在mapper的实例化方法前加
@DS("ds1")
注解来区分所要操作的数据源; - 测试。
简单总结:引入依赖 - 配置properties文件 - @DS()注解区分数据源
SpringBoot整和多数据源的Mybatis仍有更多的方式,大家如有更好的方式欢迎在评论区沟通学习。