From e3511cc00673ab2367446887c5194ed8614adccd Mon Sep 17 00:00:00 2001 From: "Yangkai.Shen" <237497819@qq.com> Date: Tue, 26 Mar 2019 16:28:31 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20spring-boot-demo-sharding-jdbc=20?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring-boot-demo-sharding-jdbc/pom.xml | 110 +++++++++++------- spring-boot-demo-sharding-jdbc/sql/schema.sql | 68 +++++++++++ ...SpringBootDemoShardingJdbcApplication.java | 5 + .../jdbc/config/DataSourceShardingConfig.java | 91 +++++++++++++++ .../sharding/jdbc/mapper/OrderMapper.java | 22 ++++ .../xkcoding/sharding/jdbc/model/Order.java | 45 +++++++ .../src/main/resources/application.properties | 0 .../src/main/resources/application.yml | 3 + ...gBootDemoShardingJdbcApplicationTests.java | 65 ++++++++++- 9 files changed, 367 insertions(+), 42 deletions(-) create mode 100644 spring-boot-demo-sharding-jdbc/sql/schema.sql create mode 100644 spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/config/DataSourceShardingConfig.java create mode 100644 spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/mapper/OrderMapper.java create mode 100644 spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/model/Order.java delete mode 100644 spring-boot-demo-sharding-jdbc/src/main/resources/application.properties create mode 100644 spring-boot-demo-sharding-jdbc/src/main/resources/application.yml diff --git a/spring-boot-demo-sharding-jdbc/pom.xml b/spring-boot-demo-sharding-jdbc/pom.xml index 414d37e..31ee384 100644 --- a/spring-boot-demo-sharding-jdbc/pom.xml +++ b/spring-boot-demo-sharding-jdbc/pom.xml @@ -1,48 +1,76 @@ - 4.0.0 + 4.0.0 - spring-boot-demo-sharding-jdbc + spring-boot-demo-sharding-jdbc + 1.0.0-SNAPSHOT + jar + + spring-boot-demo-sharding-jdbc + Demo project for Spring Boot + + + com.xkcoding + spring-boot-demo 1.0.0-SNAPSHOT - jar - - spring-boot-demo-sharding-jdbc - Demo project for Spring Boot - - - com.xkcoding - spring-boot-demo - 1.0.0-SNAPSHOT - - - - UTF-8 - UTF-8 - 1.8 - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - spring-boot-demo-sharding-jdbc - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.baomidou + mybatis-plus-boot-starter + 3.1.0 + + + + mysql + mysql-connector-java + + + + io.shardingsphere + sharding-jdbc-core + 3.1.0 + + + + cn.hutool + hutool-all + + + + org.projectlombok + lombok + true + + + + + spring-boot-demo-sharding-jdbc + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/spring-boot-demo-sharding-jdbc/sql/schema.sql b/spring-boot-demo-sharding-jdbc/sql/schema.sql new file mode 100644 index 0000000..626ecf2 --- /dev/null +++ b/spring-boot-demo-sharding-jdbc/sql/schema.sql @@ -0,0 +1,68 @@ +USE `spring-boot-demo`; +DROP TABLE IF EXISTS `t_order_0`; +CREATE TABLE `t_order_0` +( + `id` BIGINT NOT NULL COMMENT '主键', + `user_id` BIGINT NOT NULL COMMENT '用户id', + `order_id` BIGINT NOT NULL COMMENT '订单id', + `remark` VARCHAR(200) DEFAULT '' COMMENT '备注', + primary key (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8 COMMENT ='Spring Boot Demo 分库分表 系列示例表0'; + +DROP TABLE IF EXISTS `t_order_1`; +CREATE TABLE `t_order_1` +( + `id` BIGINT NOT NULL COMMENT '主键', + `user_id` BIGINT NOT NULL COMMENT '用户id', + `order_id` BIGINT NOT NULL COMMENT '订单id', + `remark` VARCHAR(200) DEFAULT '' COMMENT '备注', + primary key (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8 COMMENT ='Spring Boot Demo 分库分表 系列示例表1'; + +DROP TABLE IF EXISTS `t_order_2`; +CREATE TABLE `t_order_2` +( + `id` BIGINT NOT NULL COMMENT '主键', + `user_id` BIGINT NOT NULL COMMENT '用户id', + `order_id` BIGINT NOT NULL COMMENT '订单id', + `remark` VARCHAR(200) DEFAULT '' COMMENT '备注', + primary key (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8 COMMENT ='Spring Boot Demo 分库分表 系列示例表2'; + +USE `spring-boot-demo-2`; + +DROP TABLE IF EXISTS `t_order_0`; +CREATE TABLE `t_order_0` +( + `id` BIGINT NOT NULL COMMENT '主键', + `user_id` BIGINT NOT NULL COMMENT '用户id', + `order_id` BIGINT NOT NULL COMMENT '订单id', + `remark` VARCHAR(200) DEFAULT '' COMMENT '备注', + primary key (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8 COMMENT ='Spring Boot Demo 分库分表 系列示例表0'; + +DROP TABLE IF EXISTS `t_order_1`; +CREATE TABLE `t_order_1` +( + `id` BIGINT NOT NULL COMMENT '主键', + `user_id` BIGINT NOT NULL COMMENT '用户id', + `order_id` BIGINT NOT NULL COMMENT '订单id', + `remark` VARCHAR(200) DEFAULT '' COMMENT '备注', + primary key (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8 COMMENT ='Spring Boot Demo 分库分表 系列示例表1'; + +DROP TABLE IF EXISTS `t_order_2`; +CREATE TABLE `t_order_2` +( + `id` BIGINT NOT NULL COMMENT '主键', + `user_id` BIGINT NOT NULL COMMENT '用户id', + `order_id` BIGINT NOT NULL COMMENT '订单id', + `remark` VARCHAR(200) DEFAULT '' COMMENT '备注', + primary key (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8 COMMENT ='Spring Boot Demo 分库分表 系列示例表2'; \ No newline at end of file diff --git a/spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/SpringBootDemoShardingJdbcApplication.java b/spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/SpringBootDemoShardingJdbcApplication.java index 023c3d2..897d1f6 100644 --- a/spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/SpringBootDemoShardingJdbcApplication.java +++ b/spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/SpringBootDemoShardingJdbcApplication.java @@ -1,7 +1,10 @@ package com.xkcoding.sharding.jdbc; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.transaction.annotation.EnableTransactionManagement; /** *

@@ -17,6 +20,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @modified: yangkai.shen */ @SpringBootApplication +@EnableTransactionManagement(proxyTargetClass = true) +@MapperScan("com.xkcoding.sharding.jdbc.mapper") public class SpringBootDemoShardingJdbcApplication { public static void main(String[] args) { diff --git a/spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/config/DataSourceShardingConfig.java b/spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/config/DataSourceShardingConfig.java new file mode 100644 index 0000000..8f48680 --- /dev/null +++ b/spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/config/DataSourceShardingConfig.java @@ -0,0 +1,91 @@ +package com.xkcoding.sharding.jdbc.config; + +import com.zaxxer.hikari.HikariDataSource; +import io.shardingsphere.api.config.rule.ShardingRuleConfiguration; +import io.shardingsphere.api.config.rule.TableRuleConfiguration; +import io.shardingsphere.api.config.strategy.InlineShardingStrategyConfiguration; +import io.shardingsphere.api.config.strategy.NoneShardingStrategyConfiguration; +import io.shardingsphere.core.keygen.DefaultKeyGenerator; +import io.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; + +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + +/** + * datetime 2018/11/28 10:46 + * + * @author sin5 + */ +@Configuration +public class DataSourceShardingConfig { + /** + * 需要手动配置事务管理器 + */ + @Bean + public DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) { + return new DataSourceTransactionManager(dataSource); + } + + @Bean(name = "dataSource") + @Primary + public DataSource dataSource() throws SQLException { + ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); + // 设置分库策略 + shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "ds${user_id % 2}")); + // 设置规则适配的表 + shardingRuleConfig.getBindingTableGroups().add("t_order"); + // 设置分表策略 + shardingRuleConfig.getTableRuleConfigs().add(orderTableRule()); + shardingRuleConfig.setDefaultDataSourceName("ds0"); + shardingRuleConfig.setDefaultTableShardingStrategyConfig(new NoneShardingStrategyConfiguration()); + + Properties properties = new Properties(); + properties.setProperty("sql.show", "true"); + + return ShardingDataSourceFactory.createDataSource(dataSourceMap(), shardingRuleConfig, new ConcurrentHashMap<>(16), properties); + } + + private TableRuleConfiguration orderTableRule() { + TableRuleConfiguration tableRule = new TableRuleConfiguration(); + // 设置逻辑表名 + tableRule.setLogicTable("t_order"); + // ds${0..1}.t_order_${0..2} 也可以写成 ds$->{0..1}.t_order_$->{0..1} + tableRule.setActualDataNodes("ds${0..1}.t_order_${0..2}"); + tableRule.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order_$->{order_id % 3}")); + tableRule.setKeyGenerator(new DefaultKeyGenerator()); + tableRule.setKeyGeneratorColumnName("order_id"); + return tableRule; + } + + private Map dataSourceMap() { + Map dataSourceMap = new HashMap<>(16); + + // 配置第一个数据源 + HikariDataSource ds0 = new HikariDataSource(); + ds0.setDriverClassName("com.mysql.cj.jdbc.Driver"); + ds0.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8"); + ds0.setUsername("root"); + ds0.setPassword("root"); + + // 配置第二个数据源 + HikariDataSource ds1 = new HikariDataSource(); + ds1.setDriverClassName("com.mysql.cj.jdbc.Driver"); + ds1.setJdbcUrl("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"); + ds1.setUsername("root"); + ds1.setPassword("root"); + + dataSourceMap.put("ds0", ds0); + dataSourceMap.put("ds1", ds1); + return dataSourceMap; + } + +} diff --git a/spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/mapper/OrderMapper.java b/spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/mapper/OrderMapper.java new file mode 100644 index 0000000..d90027c --- /dev/null +++ b/spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/mapper/OrderMapper.java @@ -0,0 +1,22 @@ +package com.xkcoding.sharding.jdbc.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xkcoding.sharding.jdbc.model.Order; +import org.springframework.stereotype.Component; + +/** + *

+ * 订单表 Mapper + *

+ * + * @package: com.xkcoding.sharding.jdbc.mapper + * @description: 订单表 Mapper + * @author: yangkai.shen + * @date: Created in 2019-03-26 13:38 + * @copyright: Copyright (c) 2019 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Component +public interface OrderMapper extends BaseMapper { +} diff --git a/spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/model/Order.java b/spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/model/Order.java new file mode 100644 index 0000000..2429308 --- /dev/null +++ b/spring-boot-demo-sharding-jdbc/src/main/java/com/xkcoding/sharding/jdbc/model/Order.java @@ -0,0 +1,45 @@ +package com.xkcoding.sharding.jdbc.model; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

+ * 订单表 + *

+ * + * @package: com.xkcoding.sharding.jdbc.model + * @description: 订单表 + * @author: yangkai.shen + * @date: Created in 2019-03-26 13:35 + * @copyright: Copyright (c) 2019 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@TableName(value = "t_order") +public class Order { + /** + * 主键 + */ + private Long id; + /** + * 用户id + */ + private Long userId; + + /** + * 订单id + */ + private Long orderId; + /** + * 备注 + */ + private String remark; +} diff --git a/spring-boot-demo-sharding-jdbc/src/main/resources/application.properties b/spring-boot-demo-sharding-jdbc/src/main/resources/application.properties deleted file mode 100644 index e69de29..0000000 diff --git a/spring-boot-demo-sharding-jdbc/src/main/resources/application.yml b/spring-boot-demo-sharding-jdbc/src/main/resources/application.yml new file mode 100644 index 0000000..b3f55d8 --- /dev/null +++ b/spring-boot-demo-sharding-jdbc/src/main/resources/application.yml @@ -0,0 +1,3 @@ +mybatis-plus: + global-config: + banner: false diff --git a/spring-boot-demo-sharding-jdbc/src/test/java/com/xkcoding/sharding/jdbc/SpringBootDemoShardingJdbcApplicationTests.java b/spring-boot-demo-sharding-jdbc/src/test/java/com/xkcoding/sharding/jdbc/SpringBootDemoShardingJdbcApplicationTests.java index e5aa26c..e9bbcfa 100644 --- a/spring-boot-demo-sharding-jdbc/src/test/java/com/xkcoding/sharding/jdbc/SpringBootDemoShardingJdbcApplicationTests.java +++ b/spring-boot-demo-sharding-jdbc/src/test/java/com/xkcoding/sharding/jdbc/SpringBootDemoShardingJdbcApplicationTests.java @@ -1,17 +1,80 @@ package com.xkcoding.sharding.jdbc; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.xkcoding.sharding.jdbc.mapper.OrderMapper; +import com.xkcoding.sharding.jdbc.model.Order; +import lombok.extern.slf4j.Slf4j; 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; +import java.util.List; + +/** + *

+ * 测试sharding-jdbc分库分表 + *

+ * + * @package: com.xkcoding.sharding.jdbc + * @description: 测试sharding-jdbc分库分表 + * @author: yangkai.shen + * @date: Created in 2019-03-26 13:44 + * @copyright: Copyright (c) 2019 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Slf4j @RunWith(SpringRunner.class) @SpringBootTest public class SpringBootDemoShardingJdbcApplicationTests { + @Autowired + private OrderMapper orderMapper; + + /** + * 测试新增 + */ + @Test + public void testInsert() { + for (long i = 1; i < 10; i++) { + for (long j = 1; j < 20; j++) { + Order order = Order.builder().userId(i).orderId(j).remark(RandomUtil.randomString(20)).build(); + orderMapper.insert(order); + } + } + } + /** + * 测试更新 + */ @Test - public void contextLoads() { + public void testUpdate() { + Order update = new Order(); + update.setRemark("修改备注信息"); + orderMapper.update(update, Wrappers.update().lambda().eq(Order::getOrderId, 2).eq(Order::getUserId, 2)); } + /** + * 测试删除 + */ + @Test + public void testDelete() { + orderMapper.delete(new QueryWrapper<>()); + } + + /** + * 测试查询 + */ + @Test + public void testSelect() { + List orders = orderMapper.selectList(Wrappers.query().lambda().in(Order::getOrderId, 1, 2)); + log.info("【orders】= {}", JSONUtil.toJsonStr(orders)); + } + + }