diff --git a/spring-boot/sjdemo/logs/xa_tx.lck b/spring-boot/sjdemo/logs/xa_tx.lck
deleted file mode 100644
index e69de29..0000000
diff --git a/spring-boot/sjdemo/pom.xml b/spring-boot/sjdemo/pom.xml
index 8b0edd9..48c4ae9 100644
--- a/spring-boot/sjdemo/pom.xml
+++ b/spring-boot/sjdemo/pom.xml
@@ -29,6 +29,12 @@
2.0.0
+
+
+ org.projectlombok
+ lombok
+
+
mysql
@@ -40,18 +46,11 @@
sharding-jdbc-spring-boot-starter
3.1.0
-
com.alibaba
druid
1.1.14
-
- org.projectlombok
- lombok
-
-
-
com.alibaba
fastjson
diff --git a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/OrderDao.java b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/OrderDao.java
index 9067c4f..9dabfdf 100644
--- a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/OrderDao.java
+++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/OrderDao.java
@@ -42,6 +42,6 @@ public interface OrderDao {
* @author fanxb
* @date 2019/3/25 14:24
*/
- List getOrderByUserId(int id);
+ List getOrderByUserId(long id);
}
diff --git a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/OrderItemDao.java b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/OrderItemDao.java
index 2bcdea7..574f67e 100644
--- a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/OrderItemDao.java
+++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/OrderItemDao.java
@@ -31,4 +31,15 @@ public interface OrderItemDao {
*/
List getByOrderId(int id);
+ /**
+ * Description: 根据订单金额连表查询
+ *
+ * @author fanxb
+ * @date 2019/3/26 16:55
+ * @param price
+ * @return java.util.List
+ */
+ List getOrderItemByPrice(int price);
+
+
}
diff --git a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/OtherTableDao.java b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/OtherTableDao.java
new file mode 100644
index 0000000..8108ae5
--- /dev/null
+++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/OtherTableDao.java
@@ -0,0 +1,37 @@
+package com.fanxb.sjdemo.dao;
+
+import com.fanxb.sjdemo.entity.Dictionary;
+import com.fanxb.sjdemo.entity.OtherTable;
+
+import java.util.List;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/3/22 16:25
+ */
+public interface OtherTableDao {
+
+ /**
+ * Description:
+ *
+ * @author fanxb
+ * @date 2019/3/26 10:16
+ * @param dictionary dictionary
+ * @return long
+ */
+ long addOne(OtherTable table);
+
+ /**
+ * Description:
+ *
+ * @author fanxb
+ * @date 2019/3/26 16:31
+ * @return java.util.List
+ */
+ List getAll();
+
+
+}
diff --git a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/OrderItem.java b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/OrderItem.java
index 517ebe3..a4861c9 100644
--- a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/OrderItem.java
+++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/OrderItem.java
@@ -6,7 +6,7 @@ import lombok.Data;
@Data
public class OrderItem {
-// private long userId;
+ private long userId;
private long orderItemId;
private long orderId;
private String name;
diff --git a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/OtherTable.java b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/OtherTable.java
new file mode 100644
index 0000000..194c9f1
--- /dev/null
+++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/OtherTable.java
@@ -0,0 +1,16 @@
+package com.fanxb.sjdemo.entity;
+
+import lombok.Data;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/3/26 16:27
+ */
+@Data
+public class OtherTable {
+ private Long id;
+ private String name;
+}
diff --git a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/service/UserService.java b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/service/UserService.java
index 4cd22f9..721b1ac 100644
--- a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/service/UserService.java
+++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/service/UserService.java
@@ -11,7 +11,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import java.util.logging.ConsoleHandler;
/**
* 类功能简述:
@@ -41,7 +40,7 @@ public class UserService {
* 测试跨库事务
*/
@ShardingTransactionType(TransactionType.XA)
- @Transactional
+ @Transactional(rollbackFor = Exception.class)
public void testTransactional() {
User user1 = new User(123, "988", 12);
logger.info("user1已经插入");
diff --git a/spring-boot/sjdemo/src/main/resources/application-sharding.yml b/spring-boot/sjdemo/src/main/resources/application-sharding.yml
index f6d892b..961051b 100644
--- a/spring-boot/sjdemo/src/main/resources/application-sharding.yml
+++ b/spring-boot/sjdemo/src/main/resources/application-sharding.yml
@@ -1,7 +1,8 @@
sharding:
jdbc:
datasource:
- names: ds0,ds1
+ # 配置数据源
+ names: ds0,ds1,ds2
ds0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
@@ -14,28 +15,30 @@ sharding:
url: jdbc:mysql://10.82.27.177:3306/ds1
username: root
password: 123456
-# ds2:
-# type: com.alibaba.druid.pool.DruidDataSource
-# driver-class-name: com.mysql.jdbc.Driver
-# url: jdbc:mysql://10.82.27.177:3306/ds2
-# username: root
-# password: 123456
+ ds2:
+ type: com.alibaba.druid.pool.DruidDataSource
+ driver-class-name: com.mysql.jdbc.Driver
+ url: jdbc:mysql://10.82.27.177:3306/ds2
+ username: root
+ password: 123456
config:
sharding:
- # 默认数据源,可以将不分库分表的数据表放在这里(此处的表需与已经分库分表的表完全没有关联,不会产生联表查询操作,因为跨库连表查询是没办法实现的),3.1.0版本dql查询存在bug,不使用默认库
-# default-data-source-name: ds2
- # 默认分库策略
+ # 默认数据源,可以将不分库分表的数据表放在这里(此处的表需与已经分库分表的表完全没有关联,不会产生联表查询操作,因为跨库连表查询是没办法实现的)
+ # 3.1.0版本中dql查询存在bug,不使用默认库.会在下个版本中修复
+ default-data-source-name: ds2
+ # 默认分库策略,根据userId对2取余确定库
default-database-strategy:
inline:
sharding-column: userId
algorithm-expression: ds$->{userId % 2}
# 配置表策略
tables:
- # 公共表(比如字典表,角色表,权限表等),不分库或者分表,数据将发送到所有库中,方便联表查询
+ # 公共表(比如字典表,角色表,权限表等),不分库分表,数据将发送到所有库中,方便联表查询
dictionary:
+ # 配置主键,以便sharding-jdbc生成主键
key-generator-column-name: dictionaryId
actual-data-nodes: ds$->{0..1}.dictionary
- # user 前面已经根据uId分库,因此user表不进行分表
+ # user 已经根据userId分库,因此user表不进行分表
user:
key-generator-column-name: userId
actual-data-nodes: ds$->{0..1}.user
@@ -44,7 +47,9 @@ sharding:
actual-data-nodes: ds$->{0..1}.order$->{0..1}
table-strategy:
inline:
+ # 设置分片键,相同分片键的连表查询不会出现笛卡儿积
sharding-column: orderId
+ # 设置分表规则,根据订单id对2取余分两个表
algorithm-expression: order$->{orderId%2}
order_item:
key-generator-column-name: orderItemId
@@ -52,6 +57,8 @@ sharding:
table-strategy:
inline:
sharding-column: orderId
+ # 设置分表规则,根据订单id对2取余分两个表
algorithm-expression: order_item$->{orderId%2}
+ # 打印sql解析过程
props:
sql.show: true
\ No newline at end of file
diff --git a/spring-boot/sjdemo/src/main/resources/mapper/OrderItemMapper.xml b/spring-boot/sjdemo/src/main/resources/mapper/OrderItemMapper.xml
index b78247d..eb43754 100644
--- a/spring-boot/sjdemo/src/main/resources/mapper/OrderItemMapper.xml
+++ b/spring-boot/sjdemo/src/main/resources/mapper/OrderItemMapper.xml
@@ -3,11 +3,15 @@
- insert into order_item(orderId,name,price) values(#{orderId},#{name},#{price})
+ insert into order_item(userId,orderId,name,price) values(#{userId},#{orderId},#{name},#{price})
+
+
\ No newline at end of file
diff --git a/spring-boot/sjdemo/src/main/resources/mapper/OtherTableMapper.xml b/spring-boot/sjdemo/src/main/resources/mapper/OtherTableMapper.xml
new file mode 100644
index 0000000..d004b1c
--- /dev/null
+++ b/spring-boot/sjdemo/src/main/resources/mapper/OtherTableMapper.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+ insert into other_table(name) values(#{name})
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/MainTest.java b/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/MainTest.java
new file mode 100644
index 0000000..82b03cf
--- /dev/null
+++ b/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/MainTest.java
@@ -0,0 +1,161 @@
+package com.fanxb.sjdemo;
+
+import com.fanxb.sjdemo.dao.*;
+import com.fanxb.sjdemo.entity.*;
+import com.fanxb.sjdemo.service.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.internal.matchers.Or;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@Slf4j
+public class MainTest {
+
+ @Autowired
+ private OrderDao orderDao;
+
+ @Autowired
+ private UserDao userDao;
+
+ @Autowired
+ private OrderItemDao orderItemDao;
+
+ @Autowired
+ private DictionaryDao dictionaryDao;
+
+ @Autowired
+ private OtherTableDao otherTableDao;
+
+ @Autowired
+ private UserService userService;
+
+ //固定用户id
+ private long userId = 8009821;
+
+ //固定订单金额
+ private int orderPrice = 300;
+
+ /**
+ * Description: 分库分表插入数据测试
+ *
+ * @return void
+ * @author fanxb
+ * @date 2019/3/26 16:35
+ */
+ @Test
+ public void insert1() throws Exception {
+ //插入用户
+ User user = new User();
+ user.setUserId(userId);
+ user.setName("test");
+ user.setAge(12);
+ this.userDao.addOne(user);
+ log.info("插入用户id:{}", user.getUserId());
+ //插入订单
+ Order order = new Order();
+ order.setUserId(user.getUserId());
+ order.setTotalPrice(orderPrice);
+ order.setCreateTime(new Date());
+ this.orderDao.addOne(order);
+ log.info("插入订单id:{}", order.getOrderId());
+ //插入订单详细项
+ OrderItem item = new OrderItem();
+ item.setOrderId(order.getOrderId());
+ item.setName("apple");
+ item.setPrice(10);
+ //要根据用户id判断属于哪个库
+ item.setUserId(user.getUserId());
+ this.orderItemDao.addOne(item);
+ log.info("插入订单项id:{}", item.getOrderItemId());
+ }
+
+ /**
+ * Description:查询用户订单,能根据用户id确定表,不会出现笛卡儿积
+ *
+ * @return void
+ * @author fanxb
+ * @date 2019/3/26 16:52
+ */
+ @Test
+ public void selectOrder() {
+ List orders = this.orderDao.getOrderByUserId(userId);
+ log.info("查询用户订单结果为:{}", Arrays.toString(orders.toArray()));
+ }
+
+ /**
+ * Description:根据订单金额连表查询订单项,会产生笛卡儿积查询,没有关键字确定库或者表
+ *
+ * @return void
+ * @author fanxb
+ * @date 2019/3/26 16:54
+ */
+ @Test
+ public void selectOrderItem() {
+ List orderItems = this.orderItemDao.getOrderItemByPrice(orderPrice);
+ log.info("查询到结果为:{}", Arrays.toString(orderItems.toArray()));
+ }
+
+ /**
+ * Description: 公共表插入测试
+ *
+ * @return void
+ * @author fanxb
+ * @date 2019/3/26 16:59
+ */
+ @Test
+ public void insertDictionary() {
+ Dictionary dictionary = new Dictionary();
+ dictionary.setName("key");
+ dictionary.setValue("value");
+ this.dictionaryDao.addOne(dictionary);
+ log.info("字典表插入id为:{}", dictionary.getDictionaryId());
+ }
+
+ /**
+ * Description: 其他表插入测试
+ *
+ * @author fanxb
+ * @date 2019/3/26 17:00
+ */
+ @Test
+ public void insertOtherTable() {
+ OtherTable table = new OtherTable();
+ table.setName("test");
+ this.otherTableDao.addOne(table);
+ log.info("其它表插入id为:{}", table.getId());
+ }
+
+ /**
+ * Description:其它表查询测试,会报错
+ *
+ * @return void
+ * @author fanxb
+ * @date 2019/3/26 17:02
+ */
+ @Test
+ public void selectOtherTable() {
+ this.otherTableDao.getAll();
+ }
+
+ /**
+ * Description: 事务测试
+ *
+ * @author fanxb
+ * @date 2019/3/26 17:03
+ */
+ @Test
+ public void transTest() {
+ this.userService.testTransactional();
+ }
+
+}
+
diff --git a/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/SjdemoApplicationTests.java b/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/SjdemoApplicationTests.java
deleted file mode 100644
index 23b1462..0000000
--- a/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/SjdemoApplicationTests.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.fanxb.sjdemo;
-
-import com.fanxb.sjdemo.dao.OrderDao;
-import com.fanxb.sjdemo.entity.Order;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.internal.matchers.Or;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import javax.annotation.Resource;
-import javax.sql.DataSource;
-import java.io.*;
-import java.sql.Connection;
-import java.sql.Statement;
-import java.util.Arrays;
-import java.util.List;
-import java.util.logging.ConsoleHandler;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class SjdemoApplicationTests {
-
- private Logger logger = LoggerFactory.getLogger(this.getClass());
-
- @Resource
- private DataSource dataSource;
-
- @Autowired
- private OrderDao orderDao;
-
- @Test
- public void contextLoads() throws Exception {
- try (
- Connection conn = dataSource.getConnection();
- Statement statement = conn.createStatement();
- ) {
- statement.execute("insert into user(name,age) value('2012-12-12 12:12:12',1212)");
- statement.execute("select * from user");
- }
- }
-}
-
diff --git a/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/serviceTest/OrderServiceTest.java b/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/serviceTest/OrderServiceTest.java
deleted file mode 100644
index 71c0fff..0000000
--- a/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/serviceTest/OrderServiceTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.fanxb.sjdemo.serviceTest;
-
-import com.fanxb.sjdemo.entity.Order;
-import com.fanxb.sjdemo.service.OrderService;
-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.Date;
-
-/**
- * 类功能简述:
- * 类功能详述:
- *
- * @author fanxb
- * @date 2019/3/22 15:47
- */
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class OrderServiceTest {
-
- @Autowired
- private OrderService orderService;
-
- @Test
- public void addOrderTest() {
- Order order = new Order();
- order.setUserId(12);
- order.setCreateTime(new Date());
- order.setTotalPrice(12);
- orderService.insertOne(order);
- }
-}
diff --git a/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/serviceTest/UserServiceTest.java b/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/serviceTest/UserServiceTest.java
deleted file mode 100644
index a0ffd9b..0000000
--- a/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/serviceTest/UserServiceTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.fanxb.sjdemo.serviceTest;
-
-import com.fanxb.sjdemo.service.UserService;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-/**
- * 类功能简述:
- * 类功能详述:
- *
- * @author fanxb
- * @date 2019/3/22 15:47
- */
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class UserServiceTest {
-
- private Logger logger = LoggerFactory.getLogger(UserServiceTest.class);
-
- @Autowired
- private UserService userService;
-
- @Test
- public void addUserTest(){
- }
-
- @Test
- public void getOneTest(){
- logger.info(userService.getOne(1).toString());
- }
-}