From 47964228a864e4afd48bd625bce0edea04b0cd0e Mon Sep 17 00:00:00 2001
From: YunaiV <>
Date: Wed, 6 Nov 2019 19:44:17 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=9A=E6=95=B0=E6=8D=AE?=
=?UTF-8?q?=E6=BA=90=E7=A4=BA=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../pom.xml | 56 ++++++++++
.../lab17/dynamicdatasource/Application.java | 11 ++
.../constant/DBConstants.java | 18 +++
.../dynamicdatasource/dataobject/OrderDO.java | 43 ++++++++
.../dynamicdatasource/dataobject/UserDO.java | 43 ++++++++
.../dynamicdatasource/mapper/OrderMapper.java | 15 +++
.../dynamicdatasource/mapper/UserMapper.java | 15 +++
.../service/OrderService.java | 103 ++++++++++++++++++
.../src/main/resources/application.yaml | 24 ++++
.../src/main/resources/mapper/OrderMapper.xml | 16 +++
.../src/main/resources/mapper/UserMapper.xml | 16 +++
.../src/main/resources/mybatis-config.xml | 19 ++++
.../src/main/resources/sql/db.sql | 13 +++
.../mapper/OrderMapperTest.java | 24 ++++
.../mapper/UserMapperTest.java | 24 ++++
.../service/OrderServiceTest.java | 42 +++++++
.../pom.xml | 15 +++
.../lab-17-dynamic-datasource-mybatis/pom.xml | 49 +++++++++
.../lab17/dynamicdatasource/Application.java | 9 ++
.../config/MyBatisOrdersConfig.java | 64 +++++++++++
.../config/MyBatisUsersConfig.java | 64 +++++++++++
.../constant/DBConstants.java | 18 +++
.../dynamicdatasource/dataobject/OrderDO.java | 43 ++++++++
.../dynamicdatasource/dataobject/UserDO.java | 43 ++++++++
.../mapper/orders/OrderMapper.java | 12 ++
.../mapper/users/UserMapper.java | 12 ++
.../service/OrderService.java | 80 ++++++++++++++
.../src/main/resources/application.yaml | 20 ++++
.../resources/mapper/orders/OrderMapper.xml | 16 +++
.../resources/mapper/users/UserMapper.xml | 16 +++
.../src/main/resources/mybatis-config.xml | 19 ++++
.../src/main/resources/sql/db.sql | 13 +++
.../mapper/orders/OrderMapperTest.java | 24 ++++
.../mapper/users/UserMapperTest.java | 24 ++++
.../lab17/dynamicdatasource/package-info.java | 1 +
.../service/OrderServiceTest.java | 37 +++++++
lab-17/pom.xml | 21 ++++
pom.xml | 1 +
38 files changed, 1083 insertions(+)
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/pom.xml
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/constant/DBConstants.java
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/UserDO.java
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapper.java
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/UserMapper.java
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/application.yaml
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/mapper/OrderMapper.xml
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/mapper/UserMapper.xml
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/mybatis-config.xml
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/sql/db.sql
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapperTest.java
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/UserMapperTest.java
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderServiceTest.java
create mode 100644 lab-17/lab-17-dynamic-datasource-baomidou-02/pom.xml
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/pom.xml
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/MyBatisOrdersConfig.java
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/MyBatisUsersConfig.java
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/constant/DBConstants.java
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/UserDO.java
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/orders/OrderMapper.java
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/users/UserMapper.java
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/application.yaml
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/mapper/orders/OrderMapper.xml
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/mapper/users/UserMapper.xml
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/mybatis-config.xml
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/sql/db.sql
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/orders/OrderMapperTest.java
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/users/UserMapperTest.java
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/package-info.java
create mode 100644 lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderServiceTest.java
create mode 100644 lab-17/pom.xml
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/pom.xml b/lab-17/lab-17-dynamic-datasource-baomidou-01/pom.xml
new file mode 100644
index 00000000..ffe4bde7
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/pom.xml
@@ -0,0 +1,56 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.3.RELEASE
+
+
+ 4.0.0
+
+ lab-17-dynamic-datasource-baomidou-01
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+ mysql
+ mysql-connector-java
+ 5.1.48
+
+
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 2.1.1
+
+
+
+
+ com.baomidou
+ dynamic-datasource-spring-boot-starter
+ 2.5.7
+
+
+
+
+ org.springframework.boot
+ spring-boot-actuator
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java
new file mode 100644
index 00000000..639d1514
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java
@@ -0,0 +1,11 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+
+@SpringBootApplication
+@MapperScan(basePackages = "cn.iocoder.springboot.lab17.dynamicdatasource.mapper")
+@EnableAspectJAutoProxy(exposeProxy = true) // http://www.voidcn.com/article/p-zddcuyii-bpt.html
+public class Application {
+}
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/constant/DBConstants.java b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/constant/DBConstants.java
new file mode 100644
index 00000000..bb36b150
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/constant/DBConstants.java
@@ -0,0 +1,18 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.constant;
+
+/**
+ * 数据库枚举类
+ */
+public class DBConstants {
+
+ /**
+ * 数据源分组 - 订单库
+ */
+ public static final String DATASOURCE_ORDERS = "orders";
+
+ /**
+ * 数据源分组 - 用户库
+ */
+ public static final String DATASOURCE_USERS = "users";
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java
new file mode 100644
index 00000000..b6cf79f9
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java
@@ -0,0 +1,43 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.dataobject;
+
+/**
+ * 订单 DO
+ */
+public class OrderDO {
+
+ /**
+ * 订单编号
+ */
+ private Integer id;
+ /**
+ * 用户编号
+ */
+ private Integer userId;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public OrderDO setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public OrderDO setUserId(Integer userId) {
+ this.userId = userId;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "OrderDO{" +
+ "id=" + id +
+ ", userId=" + userId +
+ '}';
+ }
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/UserDO.java b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/UserDO.java
new file mode 100644
index 00000000..e154db26
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/UserDO.java
@@ -0,0 +1,43 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.dataobject;
+
+/**
+ * 用户 DO
+ */
+public class UserDO {
+
+ /**
+ * 用户编号
+ */
+ private Integer id;
+ /**
+ * 账号
+ */
+ private String username;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserDO setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public UserDO setUsername(String username) {
+ this.username = username;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "UserDO{" +
+ "id=" + id +
+ ", username='" + username + '\'' +
+ '}';
+ }
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapper.java b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapper.java
new file mode 100644
index 00000000..992ac21d
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapper.java
@@ -0,0 +1,15 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.mapper;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.constant.DBConstants;
+import cn.iocoder.springboot.lab17.dynamicdatasource.dataobject.OrderDO;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+@DS(DBConstants.DATASOURCE_ORDERS)
+public interface OrderMapper {
+
+ OrderDO selectById(@Param("id") Integer id);
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/UserMapper.java b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/UserMapper.java
new file mode 100644
index 00000000..8e0b2601
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/UserMapper.java
@@ -0,0 +1,15 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.mapper;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.constant.DBConstants;
+import cn.iocoder.springboot.lab17.dynamicdatasource.dataobject.UserDO;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+@DS(DBConstants.DATASOURCE_USERS)
+public interface UserMapper {
+
+ UserDO selectById(@Param("id") Integer id);
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java
new file mode 100644
index 00000000..e8ce1fd6
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java
@@ -0,0 +1,103 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.service;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.constant.DBConstants;
+import cn.iocoder.springboot.lab17.dynamicdatasource.dataobject.OrderDO;
+import cn.iocoder.springboot.lab17.dynamicdatasource.dataobject.UserDO;
+import cn.iocoder.springboot.lab17.dynamicdatasource.mapper.OrderMapper;
+import cn.iocoder.springboot.lab17.dynamicdatasource.mapper.UserMapper;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class OrderService {
+
+ @Autowired
+ private OrderMapper orderMapper;
+ @Autowired
+ private UserMapper userMapper;
+
+ private OrderService self() {
+ return (OrderService) AopContext.currentProxy();
+ }
+
+ public void method01() {
+ // 查询订单
+ OrderDO order = orderMapper.selectById(1);
+ System.out.println(order);
+ // 查询用户
+ UserDO user = userMapper.selectById(1);
+ System.out.println(user);
+ }
+
+ @Transactional
+ public void method02() {
+ // 查询订单
+ OrderDO order = orderMapper.selectById(1);
+ System.out.println(order);
+ // 查询用户
+ UserDO user = userMapper.selectById(1);
+ System.out.println(user);
+ }
+
+ public void method03() {
+ // 查询订单
+ self().method031();
+ // 查询用户
+ self().method032();
+ }
+
+ @Transactional // 报错,因为此时获取的是 primary 对应的 DataSource ,即 users 。
+ public void method031() {
+ OrderDO order = orderMapper.selectById(1);
+ System.out.println(order);
+ }
+
+ @Transactional
+ public void method032() {
+ UserDO user = userMapper.selectById(1);
+ System.out.println(user);
+ }
+
+ public void method04() {
+ // 查询订单
+ self().method041();
+ // 查询用户
+ self().method042();
+ }
+
+ @Transactional
+ @DS(DBConstants.DATASOURCE_ORDERS)
+ public void method041() {
+ OrderDO order = orderMapper.selectById(1);
+ System.out.println(order);
+ }
+
+ @Transactional
+ @DS(DBConstants.DATASOURCE_USERS)
+ public void method042() {
+ UserDO user = userMapper.selectById(1);
+ System.out.println(user);
+ }
+
+ @Transactional
+ @DS(DBConstants.DATASOURCE_ORDERS)
+ public void method05() {
+ // 查询订单
+ OrderDO order = orderMapper.selectById(1);
+ System.out.println(order);
+ // 查询用户
+ self().method052();
+ }
+
+ @Transactional(propagation = Propagation.REQUIRES_NEW)
+ @DS(DBConstants.DATASOURCE_USERS)
+ public void method052() {
+ UserDO user = userMapper.selectById(1);
+ System.out.println(user);
+ }
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/application.yaml b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/application.yaml
new file mode 100644
index 00000000..97387c49
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/application.yaml
@@ -0,0 +1,24 @@
+spring:
+ datasource:
+ # datasource 数据源配置内容
+ dynamic:
+ primary: users # TODO 注释
+ datasource:
+ # 订单数据源配置
+ orders:
+ url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8
+ driver-class-name: com.mysql.jdbc.Driver
+ username: root
+ password:
+ # 用户数据源配置
+ users:
+ url: jdbc:mysql://127.0.0.1:3306/test_users?useSSL=false&useUnicode=true&characterEncoding=UTF-8
+ driver-class-name: com.mysql.jdbc.Driver
+ username: root
+ password:
+
+# mybatis 配置内容
+mybatis:
+ config-location: classpath:mybatis-config.xml # 配置 MyBatis 配置文件路径
+ mapper-locations: classpath:mapper/*.xml # 配置 Mapper XML 地址
+ type-aliases-package: cn.iocoder.springboot.lab17.dynamicdatasource.dataobject # 配置数据库实体包路径
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/mapper/OrderMapper.xml b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/mapper/OrderMapper.xml
new file mode 100644
index 00000000..4f436f20
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/mapper/OrderMapper.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ id, user_id
+
+
+
+
+
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/mapper/UserMapper.xml b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/mapper/UserMapper.xml
new file mode 100644
index 00000000..78e5a415
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/mapper/UserMapper.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ id, username
+
+
+
+
+
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/mybatis-config.xml b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/mybatis-config.xml
new file mode 100644
index 00000000..725aa31a
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/mybatis-config.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/sql/db.sql b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/sql/db.sql
new file mode 100644
index 00000000..caad40dd
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/main/resources/sql/db.sql
@@ -0,0 +1,13 @@
+CREATE TABLE `users` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
+ `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `idx_username` (`username`)
+) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
+
+
+
+CREATE TABLE `orders` (
+ `id` int(11) DEFAULT NULL COMMENT '订单编号',
+ `user_id` int(16) DEFAULT NULL COMMENT '用户编号'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表';
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapperTest.java b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapperTest.java
new file mode 100644
index 00000000..6158cf45
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/OrderMapperTest.java
@@ -0,0 +1,24 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.mapper;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.Application;
+import cn.iocoder.springboot.lab17.dynamicdatasource.dataobject.OrderDO;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class OrderMapperTest {
+
+ @Autowired
+ private OrderMapper orderMapper;
+
+ @Test
+ public void testSelectById() {
+ OrderDO order = orderMapper.selectById(1);
+ System.out.println(order);
+ }
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/UserMapperTest.java b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/UserMapperTest.java
new file mode 100644
index 00000000..0c643024
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/UserMapperTest.java
@@ -0,0 +1,24 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.mapper;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.Application;
+import cn.iocoder.springboot.lab17.dynamicdatasource.dataobject.UserDO;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class UserMapperTest {
+
+ @Autowired
+ private UserMapper userMapper;
+
+ @Test
+ public void testSelectById() {
+ UserDO user = userMapper.selectById(1);
+ System.out.println(user);
+ }
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderServiceTest.java b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderServiceTest.java
new file mode 100644
index 00000000..f40f748a
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-01/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderServiceTest.java
@@ -0,0 +1,42 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.service;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.Application;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class OrderServiceTest {
+
+ @Autowired
+ private OrderService orderService;
+
+ @Test
+ public void testMethod01() {
+ orderService.method01();
+ }
+
+ @Test
+ public void testMethod02() {
+ orderService.method02();
+ }
+
+ @Test
+ public void testMethod03() {
+ orderService.method03();
+ }
+
+ @Test
+ public void testMethod04() {
+ orderService.method04();
+ }
+
+ @Test
+ public void testMethod05() {
+ orderService.method05();
+ }
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-02/pom.xml b/lab-17/lab-17-dynamic-datasource-baomidou-02/pom.xml
new file mode 100644
index 00000000..37e324a3
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-baomidou-02/pom.xml
@@ -0,0 +1,15 @@
+
+
+
+ lab-17
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-17-dynamic-datasource-baomidou-02
+
+
+
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/pom.xml b/lab-17/lab-17-dynamic-datasource-mybatis/pom.xml
new file mode 100644
index 00000000..8acdc02a
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/pom.xml
@@ -0,0 +1,49 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.3.RELEASE
+
+
+ 4.0.0
+
+ lab-17-dynamic-datasource-mybatis
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+ mysql
+ mysql-connector-java
+ 5.1.48
+
+
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 2.1.1
+
+
+
+
+ org.springframework
+ spring-aspects
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java
new file mode 100644
index 00000000..f87769aa
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/Application.java
@@ -0,0 +1,9 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+
+@SpringBootApplication
+@EnableAspectJAutoProxy(exposeProxy = true) // http://www.voidcn.com/article/p-zddcuyii-bpt.html
+public class Application {
+}
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/MyBatisOrdersConfig.java b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/MyBatisOrdersConfig.java
new file mode 100644
index 00000000..c1f2964a
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/MyBatisOrdersConfig.java
@@ -0,0 +1,64 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.config;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.constant.DBConstants;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.transaction.PlatformTransactionManager;
+
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan(basePackages = "cn.iocoder.springboot.lab17.dynamicdatasource.mapper.orders", sqlSessionTemplateRef = "ordersSqlSessionTemplate")
+public class MyBatisOrdersConfig {
+
+ /**
+ * 创建 orders 数据源
+ */
+ @Bean(name = "ordersDataSource")
+ @ConfigurationProperties(prefix = "spring.datasource.orders")
+ public DataSource dataSource() {
+ return DataSourceBuilder.create().build();
+ }
+
+ /**
+ * 创建 MyBatis SqlSessionFactory
+ */
+ @Bean(name = "ordersSqlSessionFactory")
+ public SqlSessionFactory sqlSessionFactory() throws Exception {
+ SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
+ // 设置 orders 数据源
+ bean.setDataSource(this.dataSource());
+ // 设置 entity 所在包
+ bean.setTypeAliasesPackage("cn.iocoder.springboot.lab17.dynamicdatasource.dataobject");
+ // 设置 config 路径
+ bean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml"));
+ // 设置 mapper 路径
+ bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/orders/*.xml"));
+ return bean.getObject();
+ }
+
+ /**
+ * 创建 MyBatis SqlSessionTemplate
+ */
+ @Bean(name = "ordersSqlSessionTemplate")
+ public SqlSessionTemplate sqlSessionTemplate() throws Exception {
+ return new SqlSessionTemplate(this.sqlSessionFactory());
+ }
+
+ /**
+ * 创建 orders 数据源的 TransactionManager 事务管理器
+ */
+ @Bean(name = DBConstants.TX_MANAGER_ORDERS)
+ public PlatformTransactionManager usersTransactionManager() {
+ return new DataSourceTransactionManager(this.dataSource());
+ }
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/MyBatisUsersConfig.java b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/MyBatisUsersConfig.java
new file mode 100644
index 00000000..d6f95bc5
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/config/MyBatisUsersConfig.java
@@ -0,0 +1,64 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.config;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.constant.DBConstants;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.SqlSessionTemplate;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.transaction.PlatformTransactionManager;
+
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan(basePackages = "cn.iocoder.springboot.lab17.dynamicdatasource.mapper.users", sqlSessionTemplateRef = "usersSqlSessionTemplate")
+public class MyBatisUsersConfig {
+
+ /**
+ * 创建 users 数据源
+ */
+ @Bean(name = "usersDataSource")
+ @ConfigurationProperties(prefix = "spring.datasource.users")
+ public DataSource dataSource() {
+ return DataSourceBuilder.create().build();
+ }
+
+ /**
+ * 创建 MyBatis SqlSessionFactory
+ */
+ @Bean(name = "sqlSessionFactory")
+ public SqlSessionFactory sqlSessionFactory() throws Exception {
+ SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
+ // 设置 users 数据源
+ bean.setDataSource(this.dataSource());
+ // 设置 entity 所在包
+ bean.setTypeAliasesPackage("cn.iocoder.springboot.lab17.dynamicdatasource.dataobject");
+ // 设置 config 路径
+ bean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml"));
+ // 设置 mapper 路径
+ bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/users/*.xml"));
+ return bean.getObject();
+ }
+
+ /**
+ * 创建 MyBatis SqlSessionTemplate
+ */
+ @Bean(name = "usersSqlSessionTemplate")
+ public SqlSessionTemplate sqlSessionTemplate() throws Exception {
+ return new SqlSessionTemplate(this.sqlSessionFactory());
+ }
+
+ /**
+ * 创建 users 数据源的 TransactionManager 事务管理器
+ */
+ @Bean(name = DBConstants.TX_MANAGER_USERS)
+ public PlatformTransactionManager ordersTransactionManager() {
+ return new DataSourceTransactionManager(this.dataSource());
+ }
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/constant/DBConstants.java b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/constant/DBConstants.java
new file mode 100644
index 00000000..39251add
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/constant/DBConstants.java
@@ -0,0 +1,18 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.constant;
+
+/**
+ * 数据库枚举类
+ */
+public class DBConstants {
+
+ /**
+ * 事务管理器 - 订单库
+ */
+ public static final String TX_MANAGER_ORDERS = "ordersTransactionManager";
+
+ /**
+ * 事务管理器 - 用户库
+ */
+ public static final String TX_MANAGER_USERS = "usersTransactionManager";
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java
new file mode 100644
index 00000000..b6cf79f9
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/OrderDO.java
@@ -0,0 +1,43 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.dataobject;
+
+/**
+ * 订单 DO
+ */
+public class OrderDO {
+
+ /**
+ * 订单编号
+ */
+ private Integer id;
+ /**
+ * 用户编号
+ */
+ private Integer userId;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public OrderDO setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public Integer getUserId() {
+ return userId;
+ }
+
+ public OrderDO setUserId(Integer userId) {
+ this.userId = userId;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "OrderDO{" +
+ "id=" + id +
+ ", userId=" + userId +
+ '}';
+ }
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/UserDO.java b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/UserDO.java
new file mode 100644
index 00000000..e154db26
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/dataobject/UserDO.java
@@ -0,0 +1,43 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.dataobject;
+
+/**
+ * 用户 DO
+ */
+public class UserDO {
+
+ /**
+ * 用户编号
+ */
+ private Integer id;
+ /**
+ * 账号
+ */
+ private String username;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserDO setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public UserDO setUsername(String username) {
+ this.username = username;
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return "UserDO{" +
+ "id=" + id +
+ ", username='" + username + '\'' +
+ '}';
+ }
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/orders/OrderMapper.java b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/orders/OrderMapper.java
new file mode 100644
index 00000000..0c8708e8
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/orders/OrderMapper.java
@@ -0,0 +1,12 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.mapper.orders;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.dataobject.OrderDO;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface OrderMapper {
+
+ OrderDO selectById(@Param("id") Integer id);
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/users/UserMapper.java b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/users/UserMapper.java
new file mode 100644
index 00000000..e58cc38d
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/users/UserMapper.java
@@ -0,0 +1,12 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.mapper.users;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.dataobject.UserDO;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface UserMapper {
+
+ UserDO selectById(@Param("id") Integer id);
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java
new file mode 100644
index 00000000..199803c4
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderService.java
@@ -0,0 +1,80 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.service;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.constant.DBConstants;
+import cn.iocoder.springboot.lab17.dynamicdatasource.dataobject.OrderDO;
+import cn.iocoder.springboot.lab17.dynamicdatasource.dataobject.UserDO;
+import cn.iocoder.springboot.lab17.dynamicdatasource.mapper.orders.OrderMapper;
+import cn.iocoder.springboot.lab17.dynamicdatasource.mapper.users.UserMapper;
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class OrderService {
+
+ @Autowired
+ private OrderMapper orderMapper;
+ @Autowired
+ private UserMapper userMapper;
+
+ private OrderService self() {
+ return (OrderService) AopContext.currentProxy();
+ }
+
+ public void method01() {
+ // 查询订单
+ OrderDO order = orderMapper.selectById(1);
+ System.out.println(order);
+ // 查询用户
+ UserDO user = userMapper.selectById(1);
+ System.out.println(user);
+ }
+
+ @Transactional // 报错,找不到事务管理器
+ public void method02() {
+ // 查询订单
+ OrderDO order = orderMapper.selectById(1);
+ System.out.println(order);
+ // 查询用户
+ UserDO user = userMapper.selectById(1);
+ System.out.println(user);
+ }
+
+ public void method03() {
+ // 查询订单
+ self().method031();
+ // 查询用户
+ self().method032();
+ }
+
+ @Transactional(transactionManager = DBConstants.TX_MANAGER_ORDERS)
+ public void method031() {
+ OrderDO order = orderMapper.selectById(1);
+ System.out.println(order);
+ }
+
+ @Transactional(transactionManager = DBConstants.TX_MANAGER_USERS)
+ public void method032() {
+ UserDO user = userMapper.selectById(1);
+ System.out.println(user);
+ }
+
+ @Transactional(transactionManager = DBConstants.TX_MANAGER_ORDERS)
+ public void method05() {
+ // 查询订单
+ OrderDO order = orderMapper.selectById(1);
+ System.out.println(order);
+ // 查询用户
+ self().method052();
+ }
+
+ @Transactional(transactionManager = DBConstants.TX_MANAGER_USERS,
+ propagation = Propagation.REQUIRES_NEW)
+ public void method052() {
+ UserDO user = userMapper.selectById(1);
+ System.out.println(user);
+ }
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/application.yaml b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/application.yaml
new file mode 100644
index 00000000..7033b791
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/application.yaml
@@ -0,0 +1,20 @@
+spring:
+ # datasource 数据源配置内容
+ datasource:
+ # 订单数据源配置
+ orders:
+ jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8
+ driver-class-name: com.mysql.jdbc.Driver
+ username: root
+ password:
+ # 用户数据源配置
+ users:
+ jdbc-url: jdbc:mysql://127.0.0.1:3306/test_users?useSSL=false&useUnicode=true&characterEncoding=UTF-8
+ driver-class-name: com.mysql.jdbc.Driver
+ username: root
+ password:
+
+# mybatis 配置内容
+#mybatis:
+# config-location: classpath:mybatis-config.xml # 配置 MyBatis 配置文件路径
+# type-aliases-package: cn.iocoder.springboot.lab17.dynamicdatasource.dataobject # 配置数据库实体包路径
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/mapper/orders/OrderMapper.xml b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/mapper/orders/OrderMapper.xml
new file mode 100644
index 00000000..f1ea09f9
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/mapper/orders/OrderMapper.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ id, user_id
+
+
+
+
+
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/mapper/users/UserMapper.xml b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/mapper/users/UserMapper.xml
new file mode 100644
index 00000000..9079fad9
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/mapper/users/UserMapper.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ id, username
+
+
+
+
+
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/mybatis-config.xml b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/mybatis-config.xml
new file mode 100644
index 00000000..725aa31a
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/mybatis-config.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/sql/db.sql b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/sql/db.sql
new file mode 100644
index 00000000..caad40dd
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/main/resources/sql/db.sql
@@ -0,0 +1,13 @@
+CREATE TABLE `users` (
+ `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
+ `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `idx_username` (`username`)
+) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
+
+
+
+CREATE TABLE `orders` (
+ `id` int(11) DEFAULT NULL COMMENT '订单编号',
+ `user_id` int(16) DEFAULT NULL COMMENT '用户编号'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表';
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/orders/OrderMapperTest.java b/lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/orders/OrderMapperTest.java
new file mode 100644
index 00000000..445673f5
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/orders/OrderMapperTest.java
@@ -0,0 +1,24 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.mapper.orders;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.Application;
+import cn.iocoder.springboot.lab17.dynamicdatasource.dataobject.OrderDO;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class OrderMapperTest {
+
+ @Autowired
+ private OrderMapper orderMapper;
+
+ @Test
+ public void testSelectById() {
+ OrderDO order = orderMapper.selectById(1);
+ System.out.println(order);
+ }
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/users/UserMapperTest.java b/lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/users/UserMapperTest.java
new file mode 100644
index 00000000..6d72e2b9
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/mapper/users/UserMapperTest.java
@@ -0,0 +1,24 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.mapper.users;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.Application;
+import cn.iocoder.springboot.lab17.dynamicdatasource.dataobject.UserDO;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class UserMapperTest {
+
+ @Autowired
+ private UserMapper userMapper;
+
+ @Test
+ public void testSelectById() {
+ UserDO user = userMapper.selectById(1);
+ System.out.println(user);
+ }
+
+}
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/package-info.java b/lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/package-info.java
new file mode 100644
index 00000000..d2a8f33d
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/package-info.java
@@ -0,0 +1 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource;
diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderServiceTest.java b/lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderServiceTest.java
new file mode 100644
index 00000000..672aba38
--- /dev/null
+++ b/lab-17/lab-17-dynamic-datasource-mybatis/src/test/java/cn/iocoder/springboot/lab17/dynamicdatasource/service/OrderServiceTest.java
@@ -0,0 +1,37 @@
+package cn.iocoder.springboot.lab17.dynamicdatasource.service;
+
+import cn.iocoder.springboot.lab17.dynamicdatasource.Application;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class OrderServiceTest {
+
+ @Autowired
+ private OrderService orderService;
+
+ @Test
+ public void testMethod01() {
+ orderService.method01();
+ }
+
+ @Test
+ public void testMethod02() {
+ orderService.method02();
+ }
+
+ @Test
+ public void testMethod03() {
+ orderService.method03();
+ }
+
+ @Test
+ public void testMethod05() {
+ orderService.method05();
+ }
+
+}
diff --git a/lab-17/pom.xml b/lab-17/pom.xml
new file mode 100644
index 00000000..8678e13c
--- /dev/null
+++ b/lab-17/pom.xml
@@ -0,0 +1,21 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-17
+ pom
+
+ lab-17-dynamic-datasource-baomidou-01
+ lab-17-dynamic-datasource-baomidou-02
+ lab-17-dynamic-datasource-mybatis
+
+
+
+
diff --git a/pom.xml b/pom.xml
index 8e6f6ad0..101945ce 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,6 +25,7 @@
lab-14
lab-15
lab-16
+ lab-17