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));
+ }
+
+
}