From a4b63c31a40f3bc83663d9a8dc8fde87df045a78 Mon Sep 17 00:00:00 2001
From: "Yangkai.Shen" <237497819@qq.com>
Date: Mon, 21 Jan 2019 15:41:47 +0800
Subject: [PATCH] =?UTF-8?q?:sparkles:=20spring-boot-demo-multi-datasource-?=
=?UTF-8?q?mybatis=20=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../README.md | 382 ++++++++++++++++++
.../assets/image-20190121152825859.png | Bin 0 -> 144712 bytes
.../assets/image-20190121153211509.png | Bin 0 -> 196360 bytes
3 files changed, 382 insertions(+)
create mode 100644 spring-boot-demo-multi-datasource-mybatis/README.md
create mode 100644 spring-boot-demo-multi-datasource-mybatis/assets/image-20190121152825859.png
create mode 100644 spring-boot-demo-multi-datasource-mybatis/assets/image-20190121153211509.png
diff --git a/spring-boot-demo-multi-datasource-mybatis/README.md b/spring-boot-demo-multi-datasource-mybatis/README.md
new file mode 100644
index 0000000..9543ab2
--- /dev/null
+++ b/spring-boot-demo-multi-datasource-mybatis/README.md
@@ -0,0 +1,382 @@
+# spring-boot-demo-multi-datasource-mybatis
+
+> 此 demo 主要演示了 Spring Boot 如何集成 Mybatis 的多数据源。可以自己基于AOP实现多数据源,这里基于 Mybatis-Plus 提供的一个优雅的开源的解决方案来实现。
+
+## 准备工作
+
+准备两个数据源,分别执行如下建表语句
+
+```mysql
+DROP TABLE IF EXISTS `multi_user`;
+CREATE TABLE `multi_user`(
+ `id` bigint(64) NOT NULL,
+ `name` varchar(50) DEFAULT NULL,
+ `age` int(30) DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB
+ AUTO_INCREMENT = 1
+ CHARACTER SET = utf8
+ COLLATE = utf8_general_ci;
+```
+
+## 导入依赖
+
+```xml
+
+
+ * User实体类 + *
+ * + * @package: com.xkcoding.multi.datasource.mybatis.model + * @description: User实体类 + * @author: yangkai.shen + * @date: Created in 2019-01-21 14:19 + * @copyright: Copyright (c) 2019 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Data +@TableName("multi_user") +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class User implements Serializable { + private static final long serialVersionUID = -1923859222295750467L; + + /** + * 主键 + */ + @TableId(type = IdType.ID_WORKER) + private Long id; + + /** + * 姓名 + */ + private String name; + + /** + * 年龄 + */ + private Integer age; +} +``` + +## 数据访问层 + +`UserMapper.java` + +> 不需要建对应的xml,只需要继承 BaseMapper 就拥有了大部分单表操作的方法了。 + +```java +/** + *+ * 数据访问层 + *
+ * + * @package: com.xkcoding.multi.datasource.mybatis.mapper + * @description: 数据访问层 + * @author: yangkai.shen + * @date: Created in 2019-01-21 14:28 + * @copyright: Copyright (c) 2019 + * @version: V1.0 + * @modified: yangkai.shen + */ +public interface UserMapper extends BaseMapper+ * 数据服务层 + *
+ * + * @package: com.xkcoding.multi.datasource.mybatis.service + * @description: 数据服务层 + * @author: yangkai.shen + * @date: Created in 2019-01-21 14:31 + * @copyright: Copyright (c) 2019 + * @version: V1.0 + * @modified: yangkai.shen + */ +public interface UserService extends IService+ * 数据服务层 实现 + *
+ * + * @package: com.xkcoding.multi.datasource.mybatis.service.impl + * @description: 数据服务层 实现 + * @author: yangkai.shen + * @date: Created in 2019-01-21 14:37 + * @copyright: Copyright (c) 2019 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Service +@DS("slave") +public class UserServiceImpl extends ServiceImpl+ * 启动器 + *
+ * + * @package: com.xkcoding.multi.datasource.mybatis + * @description: 启动器 + * @author: yangkai.shen + * @date: Created in 2019-01-21 14:19 + * @copyright: Copyright (c) 2019 + * @version: V1.0 + * @modified: yangkai.shen + */ +@SpringBootApplication +@MapperScan(basePackages = "com.xkcoding.multi.datasource.mybatis.mapper") +public class SpringBootDemoMultiDatasourceMybatisApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootDemoMultiDatasourceMybatisApplication.class, args); + } + +} +``` + +## 配置文件 + +`application.yml` + +```yaml +spring: + datasource: + dynamic: + datasource: + master: + username: root + password: root + url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 + driver-class-name: com.mysql.cj.jdbc.Driver + slave: + username: root + password: root + url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo-2?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 + driver-class-name: com.mysql.cj.jdbc.Driver + mp-enabled: true +logging: + level: + com.xkcoding.multi.datasource.mybatis: debug +``` + +## 测试类 + +```java +/** + *+ * 测试主从数据源 + *
+ * + * @package: com.xkcoding.multi.datasource.mybatis.service.impl + * @description: 测试主从数据源 + * @author: yangkai.shen + * @date: Created in 2019-01-21 14:45 + * @copyright: Copyright (c) 2019 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Slf4j +public class UserServiceImplTest extends SpringBootDemoMultiDatasourceMybatisApplicationTests { + @Autowired + private UserService userService; + + /** + * 主从库添加 + */ + @Test + public void addUser() { + User userMaster = User.builder().name("主库添加").age(20).build(); + userService.addUser(userMaster); + + User userSlave = User.builder().name("从库添加").age(20).build(); + userService.save(userSlave); + } + + /** + * 从库查询 + */ + @Test + public void testListUser() { + ListqP{ZoH
zLoT9eQ2W{9*~_-(vypTUte)tZ?M=LF;~f2ra3p@55Kj{4v#=VjlA>C*1-uXzE>{BS
zSfSLKl@%+zq+jTzwIOnQ(lu~o0xI|D8gNYbRE7nQgZZ~sNLDW8!4159-8TK#xA4a3
zkQH_`8p%Gq-8V(k9(L<;4!>T(UG!IYlV9lK6aQYoi+d-Z!_SDfLtAP`b5P3~dn)jG
zfdl^=As&-x_mcoBZ9KPo-ByQ3cDy2W1Qh8O`_|XdVjiK1y@Sl(k;eK@Deevy`L@hn
z+sR=YS2uXVtY*GHx!a#log~rKwlI)QU(qf88O@RY&Fv0K`RXOV&a85j?(;9D*7XVw
z1F0TwMwa);bfj(w@iSQJeP-wI{U*W?XqzJafmFnl)&5&kTxQ{c8Cy~~w}Uj$M(pnI
zFt?PbuIY2hLu+u823qgSymdp^b&6Ua(|WKOn}!BpBkEOTH_x{_K;@rF8(b<7C*e$L
zDsHbCm0~rWbr*tf?K;%-;Pu{OyM8um@za`s3)j{e>i9H9$oHvF`Gt?jN1PS4liR7f
z1)koP^G#EIl>0!;H1hF%+R92M)E$iki4#k+@y=1g=snGM<}E$UB_u~|$$osFU#vZk
zV6c!cy(6e5p~TE55T&iV5n;E!&(#e%`X2d&Z27%#2R@0k=y$C+g6^Hbp}_r2KQ8?J
z_hi-ttgd7BVG6ncF>0R|gq+KipF $kIi_n34!j
zzu)3}B&u|4w6e`v%ds3xJG)gH>0=dy*lSjGMg)|&DKIev0edN6K*Z^68LxgDW<66S
z_eG}EpxJ=o_knBdv73y?<#C$F#!x0VVh _SN-!
z;E#ZhA3ktAQZo<+M3@o}EiEk>{}P|swA;FO&t7I^DOgSMq5~t^;9iwWHD}u7n&-A#
zJJK#}yDAiT5J`RaE;~eDV(QxO%55yf(!!ah7h-Kc`a8Fl!%9U65DslWUt3DOm#Ohn
zSy@?SQ-|16%CY4I8ynkNL@s6$8Y8E_e>x0nQ17$Xfy;mWSlnEDxXKqB1Tgnmhr6%#
zy*-M%%pnzRlfow;SQX >aBx%ObrYa=&r>n%nc;`@37PQzN+#jUv5FAZ6cV4|
zOZ1#yR>f3e?-f1)N4_xpe$CO-vQV2MO;^jTXSAg{Ur2n&Aj=U>d>HKYjG{!tgc9!X
z2JMhUgWRxb!l{+r&gIWzrt8DA;Fa-vEI7Q%4CyTfGKTQ(Ubu4_GtFU6OPEF4exeVD
z%L)#oaaDBgqG#+|@a1{21Ygv{%A6Jo)b3)ip>E>c3gFmV&epx@slnSj#(;UmXRX21
z!iz=*?vsY8=(2J~DgWl5!RNV!?X9n36tIA;#@lOQ-C) ko%br5dhJSXb8QNhpc3O0VjmVYrN?zopw6hyXDue{5&S@7
z+z4}|u!Q&|yg}4FOW#4xvg+x~7xgNi#Us(#qSWE&YZ{9FG5C{ZsZSU~M34-t=NYDA>q6=ogWU+oAEMQMd_<-#L}~%jQ%6KzsYX
zTWd(y?YR@is8Li^&`BK${Y{Pirr3HZ9C6%8ad$EMphwGnKJn|NORWO(6wD$a-l`YnDB-hNZ&Qy0+l-91#&0gG=#lu1Wb3h2NuP1pNav
zzla!n=grTV^uYhVOZ!{X3v($$O?J)?0|q>6y6;lQcm{5g+#vc*ZueP@*pZ6z4I)>+
zKS{WU?21*|-`L>8BtS?q;)3}3ex9@2^sEb`4Mc0)bl&x!mlS!-;n)CI8QB9g$OkHRj*2PO_)4QirSVHYjD
zygUvo)E+C|!}+P#sU44GAQ3^24tCI`uVIq`+;PSL9&o7pD2i;hrPEHyg8Hp)12o;z
z*yhca)O;Mwz0EB=EU=ojp3o7Ct9(O|L6Jp$+zWq`gDx%mlp{#=P5!$?aVBE)gx~nz
zniH#|0q@;wf>+ZrGc)(HvaB4+?9@}QAi93=K>=;vI(zd~pJ_FXi@Q;^wUP9zW@whp
z7(e`GOtjxzH%+x1RNMMC;5t)uRl|7o5uyC}E~u$a2v77F^Cb%P7d;nQXAF78f%av1
zNhkLyKllUxdtL+#E}s&$NLVP5%MjtF{MZvfb5lUGzWpZ{$E?(2RoCX5ttU38AZL}n
zf4J!*(WM*$B4l;59DBOOuHO=N^>$8L>~~UT3bEMTv_a1c-Ws>GusVFl`4<^xOr_Ro+l@Rd!G@VtQYZ@V@~;{H-Xn?
z$ScGDegIxu1e%GcAmHjj-!I~b