From 00b9bb88aef66dfdea25c4ec8664ac9bc1e539c9 Mon Sep 17 00:00:00 2001 From: YunaiV <> Date: Mon, 11 Nov 2019 21:34:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=86=E5=BA=93=E5=88=86?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lab18/shardingdatasource/Application.java | 4 +- .../dataobject/OrderConfigDO.java | 37 ++++++++++++ .../dataobject/OrderDO.java | 6 +- .../mapper/OrderConfigMapper.java | 12 ++++ .../mapper/OrderMapper.java | 6 ++ .../src/main/resources/application.yaml | 28 ++++++---- .../{UserMapper.xml => OrderConfigMapper.xml} | 8 +-- .../src/main/resources/mapper/OrderMapper.xml | 17 +++++- .../src/main/resources/sql/db.sql | 13 ----- .../src/main/resources/sql/lab18_orders_0.sql | 56 +++++++++++++++++++ .../src/main/resources/sql/lab18_orders_1.sql | 44 +++++++++++++++ .../mapper/OrderConfigMapperTest.java | 24 ++++++++ .../mapper/OrderMapperTest.java | 15 +++++ lab-18/lab-18-sharding-datasource-02/pom.xml | 50 +++++++++++++++++ .../lab18/shardingdatasource/Application.java | 9 +++ .../dataobject/OrderDO.java | 46 +++++++++++++++ .../mapper/OrderMapper.java | 10 ++++ .../service/OrderService.java | 33 +++++++++++ .../src/main/resources/application.yaml | 49 ++++++++++++++++ .../mapper/OrderMapperTest.java | 45 +++++++++++++++ .../service/OrderServiceTest.java | 31 ++++++++++ lab-18/pom.xml | 1 + 22 files changed, 510 insertions(+), 34 deletions(-) create mode 100644 lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderConfigDO.java create mode 100644 lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderConfigMapper.java rename lab-18/lab-18-sharding-datasource-01/src/main/resources/mapper/{UserMapper.xml => OrderConfigMapper.xml} (68%) delete mode 100644 lab-18/lab-18-sharding-datasource-01/src/main/resources/sql/db.sql create mode 100644 lab-18/lab-18-sharding-datasource-01/src/main/resources/sql/lab18_orders_0.sql create mode 100644 lab-18/lab-18-sharding-datasource-01/src/main/resources/sql/lab18_orders_1.sql create mode 100644 lab-18/lab-18-sharding-datasource-01/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderConfigMapperTest.java create mode 100644 lab-18/lab-18-sharding-datasource-02/pom.xml create mode 100644 lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/Application.java create mode 100644 lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderDO.java create mode 100644 lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapper.java create mode 100644 lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/service/OrderService.java create mode 100644 lab-18/lab-18-sharding-datasource-02/src/main/resources/application.yaml create mode 100644 lab-18/lab-18-sharding-datasource-02/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapperTest.java create mode 100644 lab-18/lab-18-sharding-datasource-02/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/service/OrderServiceTest.java diff --git a/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/Application.java b/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/Application.java index a8ef1f05..2902e76f 100644 --- a/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/Application.java +++ b/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/Application.java @@ -2,10 +2,8 @@ package cn.iocoder.springboot.lab18.shardingdatasource; 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 +@MapperScan(basePackages = "cn.iocoder.springboot.lab18.shardingdatasource.mapper") public class Application { } diff --git a/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderConfigDO.java b/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderConfigDO.java new file mode 100644 index 00000000..bd42cea8 --- /dev/null +++ b/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderConfigDO.java @@ -0,0 +1,37 @@ +package cn.iocoder.springboot.lab18.shardingdatasource.dataobject; + +/** + * 订单配置 DO + */ +public class OrderConfigDO { + + /** + * 编号 + */ + private Integer id; + /** + * 支付超时时间 + * + * 单位:分钟 + */ + private Integer payTimeout; + + public Integer getId() { + return id; + } + + public OrderConfigDO setId(Integer id) { + this.id = id; + return this; + } + + public Integer getPayTimeout() { + return payTimeout; + } + + public OrderConfigDO setPayTimeout(Integer payTimeout) { + this.payTimeout = payTimeout; + return this; + } + +} diff --git a/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderDO.java b/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderDO.java index 649806df..c53325ab 100644 --- a/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderDO.java +++ b/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderDO.java @@ -8,17 +8,17 @@ public class OrderDO { /** * 订单编号 */ - private Integer id; + private Long id; /** * 用户编号 */ private Integer userId; - public Integer getId() { + public Long getId() { return id; } - public OrderDO setId(Integer id) { + public OrderDO setId(Long id) { this.id = id; return this; } diff --git a/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderConfigMapper.java b/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderConfigMapper.java new file mode 100644 index 00000000..5e0af183 --- /dev/null +++ b/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderConfigMapper.java @@ -0,0 +1,12 @@ +package cn.iocoder.springboot.lab18.shardingdatasource.mapper; + +import cn.iocoder.springboot.lab18.shardingdatasource.dataobject.OrderConfigDO; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface OrderConfigMapper { + + OrderConfigDO selectById(@Param("id") Integer id); + +} diff --git a/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapper.java b/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapper.java index 7bbf3e99..79b4d835 100644 --- a/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapper.java +++ b/lab-18/lab-18-sharding-datasource-01/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapper.java @@ -4,9 +4,15 @@ import cn.iocoder.springboot.lab18.shardingdatasource.dataobject.OrderDO; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface OrderMapper { OrderDO selectById(@Param("id") Integer id); + List selectListByUserId(@Param("userId") Integer userId); + + void insert(OrderDO order); + } diff --git a/lab-18/lab-18-sharding-datasource-01/src/main/resources/application.yaml b/lab-18/lab-18-sharding-datasource-01/src/main/resources/application.yaml index 7e7c216e..2ce79394 100644 --- a/lab-18/lab-18-sharding-datasource-01/src/main/resources/application.yaml +++ b/lab-18/lab-18-sharding-datasource-01/src/main/resources/application.yaml @@ -3,39 +3,47 @@ spring: shardingsphere: datasource: # 所有数据源的名字 - names: ds-orders-00, ds-orders-01 + names: ds-orders-0, ds-orders-1 # 订单 orders 数据源配置 00 - ds-orders-00: + ds-orders-0: type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 driver-class-name: com.mysql.jdbc.Driver - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8 + jdbc-url: jdbc:mysql://127.0.0.1:3306/lab18_orders_0?useSSL=false&useUnicode=true&characterEncoding=UTF-8 username: root password: # 订单 orders 数据源配置 01 - ds-orders-01: + ds-orders-1: type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 driver-class-name: com.mysql.jdbc.Driver - jdbc-url: jdbc:mysql://47.112.193.81:3306/testb5f4?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - username: testb5f4 - password: F4df4db0ed86@11 + jdbc-url: jdbc:mysql://127.0.0.1:3306/lab18_orders_1?useSSL=false&useUnicode=true&characterEncoding=UTF-8 + username: root + password: # 分片规则 sharding: tables: # orders 表配置 orders: - actualDataNodes: ds-$->{0..1}.orders_$->{0..7} # 映射到 ds-orders 数据源的 orders 表 +# actualDataNodes: ds-orders-$->{0..1}.orders_$->{0..4} # 映射到 ds-orders 数据源的 orders 表 +# actualDataNodes: ds-orders-0.orders_0, ds-orders-0.orders_2, ds-orders-0.orders_4, ds-orders-0.orders_6, ds-orders-1.orders_1, ds-orders-1.orders_3, ds-orders-1.orders_5, ds-orders-1.orders_7 + actualDataNodes: ds-orders-0.orders_$->{[0,2,4,6]}, ds-orders-1.orders_$->{[1,3,5,7]} # 映射到 ds-orders-0 和 ds-orders-1 数据源的 orders 表们 key-generator: # 主键生成策略 column: id type: SNOWFLAKE database-strategy: inline: - algorithm-expression: orders_$->{user_id % 2} + algorithm-expression: ds-orders-$->{user_id % 2} sharding-column: user_id table-strategy: inline: algorithm-expression: orders_$->{user_id % 8} sharding-column: user_id - + # order_config 表配置 + order_config: + actualDataNodes: ds-orders-0.order_config # 仅映射到 ds-orders-0 数据源的 order_config 表 + # 拓展属性配置 + props: + sql: + show: true # 打印 SQL # mybatis 配置内容 mybatis: diff --git a/lab-18/lab-18-sharding-datasource-01/src/main/resources/mapper/UserMapper.xml b/lab-18/lab-18-sharding-datasource-01/src/main/resources/mapper/OrderConfigMapper.xml similarity index 68% rename from lab-18/lab-18-sharding-datasource-01/src/main/resources/mapper/UserMapper.xml rename to lab-18/lab-18-sharding-datasource-01/src/main/resources/mapper/OrderConfigMapper.xml index 78e5a415..9a8e9ee3 100644 --- a/lab-18/lab-18-sharding-datasource-01/src/main/resources/mapper/UserMapper.xml +++ b/lab-18/lab-18-sharding-datasource-01/src/main/resources/mapper/OrderConfigMapper.xml @@ -1,15 +1,15 @@ - + - id, username + id, pay_timeout - SELECT - FROM users + FROM order_config WHERE id = #{id} diff --git a/lab-18/lab-18-sharding-datasource-01/src/main/resources/mapper/OrderMapper.xml b/lab-18/lab-18-sharding-datasource-01/src/main/resources/mapper/OrderMapper.xml index 4f436f20..f4fc92bd 100644 --- a/lab-18/lab-18-sharding-datasource-01/src/main/resources/mapper/OrderMapper.xml +++ b/lab-18/lab-18-sharding-datasource-01/src/main/resources/mapper/OrderMapper.xml @@ -1,6 +1,6 @@ - + id, user_id @@ -13,4 +13,19 @@ WHERE id = #{id} + + + + INSERT INTO orders ( + user_id + ) VALUES ( + #{userId} + ) + + diff --git a/lab-18/lab-18-sharding-datasource-01/src/main/resources/sql/db.sql b/lab-18/lab-18-sharding-datasource-01/src/main/resources/sql/db.sql deleted file mode 100644 index caad40dd..00000000 --- a/lab-18/lab-18-sharding-datasource-01/src/main/resources/sql/db.sql +++ /dev/null @@ -1,13 +0,0 @@ -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-18/lab-18-sharding-datasource-01/src/main/resources/sql/lab18_orders_0.sql b/lab-18/lab-18-sharding-datasource-01/src/main/resources/sql/lab18_orders_0.sql new file mode 100644 index 00000000..925e53b1 --- /dev/null +++ b/lab-18/lab-18-sharding-datasource-01/src/main/resources/sql/lab18_orders_0.sql @@ -0,0 +1,56 @@ +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for orders_0 +-- ---------------------------- +DROP TABLE IF EXISTS `orders_0`; +CREATE TABLE `orders_0` ( + `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', + `user_id` int(16) DEFAULT NULL COMMENT '用户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; + +-- ---------------------------- +-- Table structure for orders_2 +-- ---------------------------- +DROP TABLE IF EXISTS `orders_2`; +CREATE TABLE `orders_2` ( + `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', + `user_id` int(16) DEFAULT NULL COMMENT '用户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; + +-- ---------------------------- +-- Table structure for orders_4 +-- ---------------------------- +DROP TABLE IF EXISTS `orders_4`; +CREATE TABLE `orders_4` ( + `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', + `user_id` int(16) DEFAULT NULL COMMENT '用户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; + +-- ---------------------------- +-- Table structure for orders_6 +-- ---------------------------- +DROP TABLE IF EXISTS `orders_6`; +CREATE TABLE `orders_6` ( + `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', + `user_id` int(16) DEFAULT NULL COMMENT '用户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; + + +-- ---------------------------- +-- Table structure for order_config +-- ---------------------------- +DROP TABLE IF EXISTS `order_config`; +CREATE TABLE `order_config` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号', + `pay_timeout` int(11) DEFAULT NULL COMMENT '支付超时时间;单位:分钟', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4; + +SET FOREIGN_KEY_CHECKS = 1; + diff --git a/lab-18/lab-18-sharding-datasource-01/src/main/resources/sql/lab18_orders_1.sql b/lab-18/lab-18-sharding-datasource-01/src/main/resources/sql/lab18_orders_1.sql new file mode 100644 index 00000000..10d77a68 --- /dev/null +++ b/lab-18/lab-18-sharding-datasource-01/src/main/resources/sql/lab18_orders_1.sql @@ -0,0 +1,44 @@ +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for orders_1 +-- ---------------------------- +DROP TABLE IF EXISTS `orders_1`; +CREATE TABLE `orders_1` ( + `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', + `user_id` int(16) DEFAULT NULL COMMENT '用户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=400675304294580226 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; + +-- ---------------------------- +-- Table structure for orders_3 +-- ---------------------------- +DROP TABLE IF EXISTS `orders_3`; +CREATE TABLE `orders_3` ( + `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', + `user_id` int(16) DEFAULT NULL COMMENT '用户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; + +-- ---------------------------- +-- Table structure for orders_5 +-- ---------------------------- +DROP TABLE IF EXISTS `orders_5`; +CREATE TABLE `orders_5` ( + `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', + `user_id` int(16) DEFAULT NULL COMMENT '用户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; + +-- ---------------------------- +-- Table structure for orders_7 +-- ---------------------------- +DROP TABLE IF EXISTS `orders_7`; +CREATE TABLE `orders_7` ( + `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', + `user_id` int(16) DEFAULT NULL COMMENT '用户编号', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/lab-18/lab-18-sharding-datasource-01/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderConfigMapperTest.java b/lab-18/lab-18-sharding-datasource-01/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderConfigMapperTest.java new file mode 100644 index 00000000..25c756bb --- /dev/null +++ b/lab-18/lab-18-sharding-datasource-01/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderConfigMapperTest.java @@ -0,0 +1,24 @@ +package cn.iocoder.springboot.lab18.shardingdatasource.mapper; + +import cn.iocoder.springboot.lab18.shardingdatasource.Application; +import cn.iocoder.springboot.lab18.shardingdatasource.dataobject.OrderConfigDO; +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 OrderConfigMapperTest { + + @Autowired + private OrderConfigMapper orderConfigMapper; + + @Test + public void testSelectById() { + OrderConfigDO orderConfig = orderConfigMapper.selectById(1); + System.out.println(orderConfig); + } + +} diff --git a/lab-18/lab-18-sharding-datasource-01/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapperTest.java b/lab-18/lab-18-sharding-datasource-01/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapperTest.java index 7cd7a705..6d3018bc 100644 --- a/lab-18/lab-18-sharding-datasource-01/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapperTest.java +++ b/lab-18/lab-18-sharding-datasource-01/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapperTest.java @@ -8,6 +8,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import java.util.List; + @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class OrderMapperTest { @@ -21,4 +23,17 @@ public class OrderMapperTest { System.out.println(order); } + @Test + public void testSelectListByUserId() { + List orders = orderMapper.selectListByUserId(1); + System.out.println(orders.size()); + } + + @Test + public void testInsert() { + OrderDO order = new OrderDO(); + order.setUserId(1); + orderMapper.insert(order); + } + } diff --git a/lab-18/lab-18-sharding-datasource-02/pom.xml b/lab-18/lab-18-sharding-datasource-02/pom.xml new file mode 100644 index 00000000..8349bf23 --- /dev/null +++ b/lab-18/lab-18-sharding-datasource-02/pom.xml @@ -0,0 +1,50 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + 4.0.0 + + lab-18-sharding-datasource-02 + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + mysql + mysql-connector-java + 5.1.48 + + + + + org.apache.shardingsphere + sharding-jdbc-spring-boot-starter + 4.0.0-RC2 + + + + + com.baomidou + mybatis-plus-boot-starter + 3.2.0 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + diff --git a/lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/Application.java b/lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/Application.java new file mode 100644 index 00000000..2902e76f --- /dev/null +++ b/lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/Application.java @@ -0,0 +1,9 @@ +package cn.iocoder.springboot.lab18.shardingdatasource; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@MapperScan(basePackages = "cn.iocoder.springboot.lab18.shardingdatasource.mapper") +public class Application { +} diff --git a/lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderDO.java b/lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderDO.java new file mode 100644 index 00000000..f7254ed6 --- /dev/null +++ b/lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/dataobject/OrderDO.java @@ -0,0 +1,46 @@ +package cn.iocoder.springboot.lab18.shardingdatasource.dataobject; + +import com.baomidou.mybatisplus.annotation.TableName; + +/** + * 订单 DO + */ +@TableName(value = "orders") +public class OrderDO { + + /** + * 订单编号 + */ + private Long id; + /** + * 用户编号 + */ + private Integer userId; + + public Long getId() { + return id; + } + + public OrderDO setId(Long 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-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapper.java b/lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapper.java new file mode 100644 index 00000000..ef172279 --- /dev/null +++ b/lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapper.java @@ -0,0 +1,10 @@ +package cn.iocoder.springboot.lab18.shardingdatasource.mapper; + +import cn.iocoder.springboot.lab18.shardingdatasource.dataobject.OrderDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springframework.stereotype.Repository; + +@Repository +public interface OrderMapper extends BaseMapper { + +} diff --git a/lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/service/OrderService.java b/lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/service/OrderService.java new file mode 100644 index 00000000..21667f70 --- /dev/null +++ b/lab-18/lab-18-sharding-datasource-02/src/main/java/cn/iocoder/springboot/lab18/shardingdatasource/service/OrderService.java @@ -0,0 +1,33 @@ +package cn.iocoder.springboot.lab18.shardingdatasource.service; + +import cn.iocoder.springboot.lab18.shardingdatasource.dataobject.OrderDO; +import cn.iocoder.springboot.lab18.shardingdatasource.mapper.OrderMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class OrderService { + + @Autowired + private OrderMapper orderMapper; + + @Transactional + public void add(OrderDO order) { + // 这里先假模假样的读取一下。读取从库 + OrderDO exists = orderMapper.selectById(1); + System.out.println(exists); + + // 插入订单 + orderMapper.insert(order); + + // 这里先假模假样的读取一下。读取主库 + exists = orderMapper.selectById(1); + System.out.println(exists); + } + + public OrderDO findById(Integer id) { + return orderMapper.selectById(id); + } + +} diff --git a/lab-18/lab-18-sharding-datasource-02/src/main/resources/application.yaml b/lab-18/lab-18-sharding-datasource-02/src/main/resources/application.yaml new file mode 100644 index 00000000..f70792b4 --- /dev/null +++ b/lab-18/lab-18-sharding-datasource-02/src/main/resources/application.yaml @@ -0,0 +1,49 @@ +spring: + # ShardingSphere 配置项 + shardingsphere: + # 数据源配置 + datasource: + # 所有数据源的名字 + names: ds-master, ds-slave-1, ds-slave-2 + # 订单 orders 主库的数据源配置 + ds-master: + type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 + driver-class-name: com.mysql.jdbc.Driver + jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8 + username: root + password: + # 订单 orders 从库数据源配置 + ds-slave-1: + type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 + driver-class-name: com.mysql.jdbc.Driver + jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders_01?useSSL=false&useUnicode=true&characterEncoding=UTF-8 + username: root + password: + # 订单 orders 从库数据源配置 + ds-slave-2: + type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 + driver-class-name: com.mysql.jdbc.Driver + jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders_02?useSSL=false&useUnicode=true&characterEncoding=UTF-8 + username: root + password: + # 读写分离配置,对应 YamlMasterSlaveRuleConfiguration 配置类 + masterslave: + name: ms # 名字,任意,需要保证唯一 + master-data-source-name: ds-master # 主库数据源 + slave-data-source-names: ds-slave-1, ds-slave-2 # 从库数据源 + # 拓展属性配置 + props: + sql: + show: true # 打印 SQL + +# mybatis-plus 配置内容 +mybatis-plus: + configuration: + map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 + global-config: + db-config: + id-type: none # 虽然 MyBatis Plus 也提供 ID 生成策略,但是还是使用 Sharding-JDBC 的 + logic-delete-value: 1 # 逻辑已删除值(默认为 1) + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) + mapper-locations: classpath*:mapper/*.xml + type-aliases-package: cn.iocoder.springboot.lab18.shardingdatasource.dataobject diff --git a/lab-18/lab-18-sharding-datasource-02/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapperTest.java b/lab-18/lab-18-sharding-datasource-02/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapperTest.java new file mode 100644 index 00000000..61734be0 --- /dev/null +++ b/lab-18/lab-18-sharding-datasource-02/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/mapper/OrderMapperTest.java @@ -0,0 +1,45 @@ +package cn.iocoder.springboot.lab18.shardingdatasource.mapper; + +import cn.iocoder.springboot.lab18.shardingdatasource.Application; +import cn.iocoder.springboot.lab18.shardingdatasource.dataobject.OrderDO; +import org.apache.shardingsphere.api.hint.HintManager; +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() { // 测试从库的负载均衡 + for (int i = 0; i < 10; i++) { + OrderDO order = orderMapper.selectById(1); + System.out.println(order); + } + } + + @Test + public void testSelectById02() { // 测试强制访问主库 + try (HintManager hintManager = HintManager.getInstance()) { + // 设置强制访问主库 + hintManager.setMasterRouteOnly(); + // 执行查询 + OrderDO order = orderMapper.selectById(1); + System.out.println(order); + } + } + + @Test + public void testInsert() { // 插入 + OrderDO order = new OrderDO(); + order.setUserId(10); + orderMapper.insert(order); + } + +} diff --git a/lab-18/lab-18-sharding-datasource-02/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/service/OrderServiceTest.java b/lab-18/lab-18-sharding-datasource-02/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/service/OrderServiceTest.java new file mode 100644 index 00000000..cc00c2fa --- /dev/null +++ b/lab-18/lab-18-sharding-datasource-02/src/test/java/cn/iocoder/springboot/lab18/shardingdatasource/service/OrderServiceTest.java @@ -0,0 +1,31 @@ +package cn.iocoder.springboot.lab18.shardingdatasource.service; + +import cn.iocoder.springboot.lab18.shardingdatasource.Application; +import cn.iocoder.springboot.lab18.shardingdatasource.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 OrderServiceTest { + + @Autowired + private OrderService orderService; + + @Test + public void testAdd() { + OrderDO order = new OrderDO(); + order.setUserId(20); + orderService.add(order); + } + + @Test + public void testFindById() { + OrderDO order = orderService.findById(1); + System.out.println(order); + } + +} diff --git a/lab-18/pom.xml b/lab-18/pom.xml index aaa57a5c..cff2478e 100644 --- a/lab-18/pom.xml +++ b/lab-18/pom.xml @@ -13,6 +13,7 @@ pom lab-18-sharding-datasource-01 + lab-18-sharding-datasource-02