From 2c481c9982ad7003240ad32f26aebae576286980 Mon Sep 17 00:00:00 2001 From: fanxb Date: Fri, 22 Mar 2019 17:26:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9Eshardingsphere?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring-boot/sjdemo/.gitignore | 29 ++++++++ spring-boot/sjdemo/pom.xml | 69 +++++++++++++++++++ .../com/fanxb/sjdemo/SjdemoApplication.java | 15 ++++ .../com/fanxb/sjdemo/dao/BaseOperate.java | 12 ++++ .../java/com/fanxb/sjdemo/dao/OrderDao.java | 15 ++++ .../java/com/fanxb/sjdemo/dao/UserDao.java | 19 +++++ .../java/com/fanxb/sjdemo/entity/Order.java | 15 ++++ .../com/fanxb/sjdemo/entity/OrderItem.java | 14 ++++ .../java/com/fanxb/sjdemo/entity/User.java | 33 +++++++++ .../fanxb/sjdemo/service/OrderService.java | 28 ++++++++ .../com/fanxb/sjdemo/service/UserService.java | 35 ++++++++++ .../main/resources/application-sharding.yml | 47 +++++++++++++ .../sjdemo/src/main/resources/application.yml | 8 +++ .../src/main/resources/mapper/OrderMapper.xml | 9 +++ .../src/main/resources/mapper/UserMapper.xml | 13 ++++ .../fanxb/sjdemo/SjdemoApplicationTests.java | 36 ++++++++++ .../sjdemo/serviceTest/OrderServiceTest.java | 35 ++++++++++ .../sjdemo/serviceTest/UserServiceTest.java | 37 ++++++++++ 18 files changed, 469 insertions(+) create mode 100644 spring-boot/sjdemo/.gitignore create mode 100644 spring-boot/sjdemo/pom.xml create mode 100644 spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/SjdemoApplication.java create mode 100644 spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/BaseOperate.java create mode 100644 spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/OrderDao.java create mode 100644 spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/UserDao.java create mode 100644 spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/Order.java create mode 100644 spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/OrderItem.java create mode 100644 spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/User.java create mode 100644 spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/service/OrderService.java create mode 100644 spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/service/UserService.java create mode 100644 spring-boot/sjdemo/src/main/resources/application-sharding.yml create mode 100644 spring-boot/sjdemo/src/main/resources/application.yml create mode 100644 spring-boot/sjdemo/src/main/resources/mapper/OrderMapper.xml create mode 100644 spring-boot/sjdemo/src/main/resources/mapper/UserMapper.xml create mode 100644 spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/SjdemoApplicationTests.java create mode 100644 spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/serviceTest/OrderServiceTest.java create mode 100644 spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/serviceTest/UserServiceTest.java diff --git a/spring-boot/sjdemo/.gitignore b/spring-boot/sjdemo/.gitignore new file mode 100644 index 0000000..153c933 --- /dev/null +++ b/spring-boot/sjdemo/.gitignore @@ -0,0 +1,29 @@ +HELP.md +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +### VS Code ### +.vscode/ diff --git a/spring-boot/sjdemo/pom.xml b/spring-boot/sjdemo/pom.xml new file mode 100644 index 0000000..e28662e --- /dev/null +++ b/spring-boot/sjdemo/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + com.fanxb + sjdemo + 0.0.1-SNAPSHOT + sjdemo + sharding-jdbc分库分表demo + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.0.0 + + + + mysql + mysql-connector-java + runtime + + + io.shardingsphere + sharding-jdbc-spring-boot-starter + 3.1.0 + + + + com.alibaba + druid + 1.1.14 + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/SjdemoApplication.java b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/SjdemoApplication.java new file mode 100644 index 0000000..3113d73 --- /dev/null +++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/SjdemoApplication.java @@ -0,0 +1,15 @@ +package com.fanxb.sjdemo; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@MapperScan(basePackages = "com.fanxb.sjdemo.dao") +public class SjdemoApplication { + + public static void main(String[] args) { + SpringApplication.run(SjdemoApplication.class, args); + } + +} diff --git a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/BaseOperate.java b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/BaseOperate.java new file mode 100644 index 0000000..c7bda50 --- /dev/null +++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/BaseOperate.java @@ -0,0 +1,12 @@ +package com.fanxb.sjdemo.dao; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/3/22 15:21 + */ +public interface BaseOperate { + long addOne(T t); +} 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 new file mode 100644 index 0000000..bc773b0 --- /dev/null +++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/OrderDao.java @@ -0,0 +1,15 @@ +package com.fanxb.sjdemo.dao; + +import com.fanxb.sjdemo.entity.Order; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/3/22 16:25 + */ +public interface OrderDao { + long addOne(Order order); + +} diff --git a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/UserDao.java b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/UserDao.java new file mode 100644 index 0000000..57c1361 --- /dev/null +++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/dao/UserDao.java @@ -0,0 +1,19 @@ +package com.fanxb.sjdemo.dao; + +import com.fanxb.sjdemo.entity.User; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/3/22 15:29 + */ +public interface UserDao { + long addOne(User user); + + User getOneById(int id); +} diff --git a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/Order.java b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/Order.java new file mode 100644 index 0000000..a638266 --- /dev/null +++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/Order.java @@ -0,0 +1,15 @@ +package com.fanxb.sjdemo.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class Order { + + private long orderId; + private long uId; + private Date createTime; + private long totalPrice; + +} 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 new file mode 100644 index 0000000..0132f38 --- /dev/null +++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/OrderItem.java @@ -0,0 +1,14 @@ +package com.fanxb.sjdemo.entity; + + +import lombok.Data; + +@Data +public class OrderItem { + + private long orderItemId; + private long orderId; + private String name; + private long price; + +} diff --git a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/User.java b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/User.java new file mode 100644 index 0000000..2048655 --- /dev/null +++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/entity/User.java @@ -0,0 +1,33 @@ +package com.fanxb.sjdemo.entity; + + +public class User { + + private long uId; + private String name; + private long age; + + public long getuId() { + return uId; + } + + public void setuId(long uId) { + this.uId = uId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public long getAge() { + return age; + } + + public void setAge(long age) { + this.age = age; + } +} diff --git a/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/service/OrderService.java b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/service/OrderService.java new file mode 100644 index 0000000..3c4f3f0 --- /dev/null +++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/service/OrderService.java @@ -0,0 +1,28 @@ +package com.fanxb.sjdemo.service; + +import com.fanxb.sjdemo.dao.OrderDao; +import com.fanxb.sjdemo.entity.Order; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/3/22 16:44 + */ +@Service +public class OrderService { + private Logger logger = LoggerFactory.getLogger(OrderService.class); + + @Autowired + private OrderDao orderDao; + + public void insertOne(Order order) { + long id = orderDao.addOne(order); + logger.info("订单插入id:{}", order.getOrderId()); + } +} 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 new file mode 100644 index 0000000..64aff94 --- /dev/null +++ b/spring-boot/sjdemo/src/main/java/com/fanxb/sjdemo/service/UserService.java @@ -0,0 +1,35 @@ +package com.fanxb.sjdemo.service; + +import com.fanxb.sjdemo.dao.UserDao; +import com.fanxb.sjdemo.entity.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 类功能简述: + * 类功能详述: + * + * @author fanxb + * @date 2019/3/22 15:36 + */ +@Service +public class UserService { + Logger logger = LoggerFactory.getLogger(UserService.class); + + @Autowired + private UserDao dao; + + public void addOne(String name, int age) { + User user = new User(); + user.setName(name); + user.setAge(age); + long id= dao.addOne(user); + logger.info("插入id:{}", user.getuId()); + } + + public User getOne(int id){ + return dao.getOneById(id); + } +} diff --git a/spring-boot/sjdemo/src/main/resources/application-sharding.yml b/spring-boot/sjdemo/src/main/resources/application-sharding.yml new file mode 100644 index 0000000..8d0c0ce --- /dev/null +++ b/spring-boot/sjdemo/src/main/resources/application-sharding.yml @@ -0,0 +1,47 @@ +sharding: + jdbc: + datasource: + names: ds0,ds1,ds2 + ds0: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://10.82.27.177:3306/ds0 + username: root + password: 123456 + ds1: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver + 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 + config: + sharding: + # 默认数据源,可以将不分库分表的数据表放在这里 + default-data-source-name: ds2 + default-database-strategy: + inline: + sharding-column: uId + algorithm-expression: ds$->{uId % 2} + tables: + order: + key-generator-column-name: orderId + actual-data-nodes: ds$->{0..1}.order$->{0..1} + table-strategy: + inline: + sharding-column: orderId + algorithm-expression: order$->{orderId%2} + order_item: + key-generator-column-name: orderItemId + actual-data-nodes: ds$->{0..1}.order_item$->{0..1} + table-strategy: + inline: + sharding-column: orderId + algorithm-expression: orderItemId$->{orderId%2} + props: + sql.show: true \ No newline at end of file diff --git a/spring-boot/sjdemo/src/main/resources/application.yml b/spring-boot/sjdemo/src/main/resources/application.yml new file mode 100644 index 0000000..3d90360 --- /dev/null +++ b/spring-boot/sjdemo/src/main/resources/application.yml @@ -0,0 +1,8 @@ +spring: + profiles: + active: sharding +mybatis: + mapper-locations: classpath:mapper/*.xml + type-aliases-package: com.fanxb.sjdemo.entity + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl diff --git a/spring-boot/sjdemo/src/main/resources/mapper/OrderMapper.xml b/spring-boot/sjdemo/src/main/resources/mapper/OrderMapper.xml new file mode 100644 index 0000000..27f814b --- /dev/null +++ b/spring-boot/sjdemo/src/main/resources/mapper/OrderMapper.xml @@ -0,0 +1,9 @@ + + + + + + insert into order(uId,createTime,totalPrice) values(#{uId},#{createTime},#{totalPrice}) + + + \ No newline at end of file diff --git a/spring-boot/sjdemo/src/main/resources/mapper/UserMapper.xml b/spring-boot/sjdemo/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..35dd78f --- /dev/null +++ b/spring-boot/sjdemo/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,13 @@ + + + + + + insert into user(name,age) values(#{name},#{age}) + + + + + \ No newline at end of file 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 new file mode 100644 index 0000000..7f3fa1e --- /dev/null +++ b/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/SjdemoApplicationTests.java @@ -0,0 +1,36 @@ +package com.fanxb.sjdemo; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.Statement; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SjdemoApplicationTests { + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Resource + private DataSource dataSource; + + @Test + public void contextLoads() throws Exception { + String sql = "SELECT i.* FROM order o JOIN order_item i ON o.orderId=i.orderId WHERE o.uId=? AND o.orderId=?"; + try ( + Connection conn = dataSource.getConnection(); + Statement statement = conn.createStatement(); + ) { + Boolean res = statement.execute("insert into user(name,age) value('2012-12-12 12:12:12',1212)"); + logger.info(res.toString()); + } + } +} + 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 new file mode 100644 index 0000000..ec23d75 --- /dev/null +++ b/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/serviceTest/OrderServiceTest.java @@ -0,0 +1,35 @@ +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.setUId(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 new file mode 100644 index 0000000..2cf4fc9 --- /dev/null +++ b/spring-boot/sjdemo/src/test/java/com/fanxb/sjdemo/serviceTest/UserServiceTest.java @@ -0,0 +1,37 @@ +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(){ + userService.addOne("xiaoming",12); + } + + @Test + public void getOneTest(){ + logger.info(userService.getOne(1).toString()); + } +}