yufeng 5 years ago
parent
commit
d71ab8bb1d

+ 18 - 14
.gitignore

@@ -1,14 +1,18 @@
1
-# ---> Java
2
-*.class
3
-
4
-# Mobile Tools for Java (J2ME)
5
-.mtj.tmp/
6
-
7
-# Package Files #
8
-*.jar
9
-*.war
10
-*.ear
11
-
12
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
13
-hs_err_pid*
14
-
1
+# ---> Java
2
+*.class
3
+
4
+# Mobile Tools for Java (J2ME)
5
+.mtj.tmp/
6
+
7
+# Package Files #
8
+*.jar
9
+*.war
10
+*.ear
11
+
12
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
13
+hs_err_pid*
14
+
15
+/target/
16
+.classpath
17
+.project
18
+.settings/

+ 108 - 0
pom.xml

@@ -0,0 +1,108 @@
1
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2
+    <modelVersion>4.0.0</modelVersion>
3
+    <groupId>io.shardingsphere</groupId>
4
+    <version>1.0.0</version>
5
+    <artifactId>data-mybatis-example</artifactId>
6
+    
7
+    <properties>
8
+        <java.version>1.8</java.version>
9
+        <maven.version.range>[3.0.4,)</maven.version.range>
10
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
11
+        <project.build.locale>zh_CN</project.build.locale>
12
+        
13
+        <sharding-sphere.version>3.0.0.M3</sharding-sphere.version>
14
+        
15
+        <spring-framework.version>4.3.6.RELEASE</spring-framework.version>
16
+        <spring-boot.version>1.5.0.RELEASE</spring-boot.version>
17
+        
18
+        <maven-compiler-plugin.version>3.3</maven-compiler-plugin.version>
19
+        <maven-resources-plugin.version>2.7</maven-resources-plugin.version>
20
+        <maven-jar-plugin.version>2.6</maven-jar-plugin.version>
21
+        <maven-source-plugin.version>2.4</maven-source-plugin.version>
22
+        <javadocExecutable>${java.home}/../bin/javadoc</javadocExecutable>
23
+    </properties>
24
+    
25
+    <dependencies>
26
+        <dependency>
27
+            <groupId>org.springframework.boot</groupId>
28
+            <artifactId>spring-boot-starter</artifactId>
29
+            <version>1.5.0.RELEASE</version>
30
+        </dependency>
31
+        <dependency>
32
+            <groupId>org.mybatis.spring.boot</groupId>
33
+            <artifactId>mybatis-spring-boot-starter</artifactId>
34
+            <version>1.3.0</version>
35
+        </dependency> 
36
+        <dependency>
37
+            <groupId>io.shardingsphere</groupId>
38
+            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
39
+            <version>3.0.0.M3</version>
40
+        </dependency>
41
+        <dependency>
42
+            <groupId>commons-pool</groupId>
43
+            <artifactId>commons-pool</artifactId>
44
+            <version>1.6</version>
45
+        </dependency>
46
+        
47
+        <dependency>
48
+            <groupId>commons-dbcp</groupId>
49
+            <artifactId>commons-dbcp</artifactId>
50
+            <version>1.4</version>
51
+        </dependency>
52
+        <dependency>
53
+            <groupId>mysql</groupId>
54
+            <artifactId>mysql-connector-java</artifactId>
55
+            <version>5.1.30</version>
56
+        </dependency>
57
+        <dependency>
58
+            <groupId>org.slf4j</groupId>
59
+            <artifactId>jcl-over-slf4j</artifactId>
60
+            <version>1.7.7</version>
61
+        </dependency>
62
+        <dependency>
63
+            <groupId>ch.qos.logback</groupId>
64
+            <artifactId>logback-classic</artifactId>
65
+            <version>1.1.6</version>
66
+        </dependency>
67
+    </dependencies>
68
+    
69
+    <build>
70
+        <plugins>
71
+            <plugin>
72
+                <groupId>org.apache.maven.plugins</groupId>
73
+                <artifactId>maven-compiler-plugin</artifactId>
74
+                <configuration>
75
+                    <source>${java.version}</source>
76
+                    <target>${java.version}</target>
77
+                    <testSource>${java.version}</testSource>
78
+                    <testTarget>${java.version}</testTarget>
79
+                </configuration>
80
+                <version>${maven-compiler-plugin.version}</version>
81
+            </plugin>
82
+            <plugin>
83
+                <groupId>org.apache.maven.plugins</groupId>
84
+                <artifactId>maven-resources-plugin</artifactId>
85
+                <version>${maven-resources-plugin.version}</version>
86
+            </plugin>
87
+            <plugin>
88
+                <groupId>org.apache.maven.plugins</groupId>
89
+                <artifactId>maven-jar-plugin</artifactId>
90
+                <version>${maven-jar-plugin.version}</version>
91
+            </plugin>
92
+            <plugin>
93
+            <groupId>org.apache.maven.plugins</groupId>
94
+                <artifactId>maven-source-plugin</artifactId>
95
+                <version>${maven-source-plugin.version}</version>
96
+                <executions>
97
+                    <execution>
98
+                        <id>attach-sources</id>
99
+                        <phase>verify</phase>
100
+                        <goals>
101
+                            <goal>jar-no-fork</goal>
102
+                        </goals>
103
+                    </execution>
104
+                </executions>
105
+            </plugin>
106
+        </plugins>
107
+    </build>
108
+</project>

+ 34 - 0
src/main/java/com/huojutech/sharding/SpringBootDataMain.java

@@ -0,0 +1,34 @@
1
+/*
2
+ * Copyright 2016-2018 shardingsphere.io.
3
+ * <p>
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ * </p>
16
+ */
17
+
18
+package com.huojutech.sharding;
19
+
20
+import org.springframework.boot.SpringApplication;
21
+import org.springframework.boot.autoconfigure.SpringBootApplication;
22
+import org.springframework.context.ConfigurableApplicationContext;
23
+
24
+import com.huojutech.sharding.service.DemoService;
25
+
26
+@SpringBootApplication
27
+public class SpringBootDataMain {
28
+    
29
+    public static void main(final String[] args) {
30
+        try (ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringBootDataMain.class, args)) {
31
+            applicationContext.getBean(DemoService.class).demo();
32
+        }
33
+    }
34
+}

+ 18 - 0
src/main/java/com/huojutech/sharding/algorithm/DatabaseShardingAlgorithm.java

@@ -0,0 +1,18 @@
1
+package com.huojutech.sharding.algorithm;
2
+
3
+import java.util.Collection;
4
+
5
+import io.shardingsphere.core.api.algorithm.sharding.ShardingValue;
6
+import io.shardingsphere.core.api.algorithm.sharding.complex.ComplexKeysShardingAlgorithm;
7
+
8
+public class DatabaseShardingAlgorithm implements ComplexKeysShardingAlgorithm {
9
+
10
+    @Override
11
+    public Collection<String> doSharding(Collection<String> availableTargetNames, Collection<ShardingValue> shardingValues) {
12
+        
13
+        return availableTargetNames;
14
+    }
15
+
16
+    
17
+
18
+}

+ 61 - 0
src/main/java/com/huojutech/sharding/algorithm/IDGenerator.java

@@ -0,0 +1,61 @@
1
+package com.huojutech.sharding.algorithm;
2
+
3
+import java.net.InetAddress;
4
+import java.net.UnknownHostException;
5
+import java.util.Random;
6
+
7
+import io.shardingsphere.core.keygen.DefaultKeyGenerator;
8
+import io.shardingsphere.core.keygen.KeyGenerator;
9
+
10
+public class IDGenerator implements KeyGenerator{
11
+    
12
+    public static long ipToLong(String strIp) {
13
+        String[]ip = strIp.split("\\.");
14
+        return (Long.parseLong(ip[0]) << 24) + (Long.parseLong(ip[1]) << 16) + (Long.parseLong(ip[2]) << 8) + Long.parseLong(ip[3]);
15
+    }
16
+
17
+    private static long seed = 0;
18
+
19
+    public static void main(String[] args) {
20
+
21
+        for (int i = 0; i < 202; i++) {
22
+            System.out.println(new IDGenerator().generateKey());
23
+        }
24
+        System.out.println((1&0x0001));
25
+        System.out.println((2&0x0001));
26
+        System.out.println((3&0x0001));
27
+        System.out.println((4&0x0001));
28
+    }
29
+    
30
+    /**
31
+     * 根据机器IP获取工作进程Id,如果线上机器的IP二进制表示的最后10位不重复,建议使用此种方式
32
+     * ,列如机器的IP为192.168.1.108,二进制表示:11000000 10101000 00000001 01101100
33
+     * ,截取最后10位 01 01101100,转为十进制364,设置workerId为364.
34
+     */
35
+    static {
36
+        InetAddress address;
37
+        try {
38
+            // 首先得到IP地址,例如192.168.1.108
39
+            address = InetAddress.getLocalHost();
40
+            seed = ipToLong(address.getHostAddress());
41
+        } catch (final UnknownHostException e) {
42
+            throw new IllegalStateException("Cannot get LocalHost InetAddress, please check your network!");
43
+        }
44
+        // IP地址byte[]数组形式,这个byte数组的长度是4,数组0~3下标对应的值分别是192,168,1,108
45
+        byte[] ipAddressByteArray = address.getAddress();
46
+        // 由这里计算workerId源码可知,workId由两部分组成:
47
+        // 第一部分(ipAddressByteArray[ipAddressByteArray.length - 2] & 0B11) << Byte.SIZE:ipAddressByteArray[ipAddressByteArray.length - 2]即取byte[]倒数第二个值,即1,然后&0B11,即只取最后2位(IP段倒数第二个段取2位,IP段最后一位取全部8位,总计10位),然后左移Byte.SIZE,即左移8位(因为这一部分取得的是IP段中倒数第二个段的值);
48
+        // 第二部分(ipAddressByteArray[ipAddressByteArray.length - 1] & 0xFF):ipAddressByteArray[ipAddressByteArray.length - 1]即取byte[]最后一位,即108,然后&0xFF,即通过位运算将byte转为int;
49
+        // 最后将第一部分得到的值加上第二部分得到的值就是最终的workId
50
+        DefaultKeyGenerator.setWorkerId((long) (((ipAddressByteArray[ipAddressByteArray.length - 2] & 0B11) << Byte.SIZE) + (ipAddressByteArray[ipAddressByteArray.length - 1] & 0xFF)));
51
+    }
52
+
53
+    /**
54
+     * 并发高了在换成默认的算法
55
+     */
56
+    @Override
57
+    public Number generateKey() {
58
+        return System.nanoTime() + new Random(seed + System.nanoTime()).nextInt(10) * 10 + new Random().nextInt(10) + System.currentTimeMillis() * 100;
59
+    }
60
+    
61
+}

+ 65 - 0
src/main/java/com/huojutech/sharding/algorithm/MyPreciseShardingAlgorithm.java

@@ -0,0 +1,65 @@
1
+package com.huojutech.sharding.algorithm;
2
+
3
+import java.sql.Timestamp;
4
+import java.util.ArrayList;
5
+import java.util.Calendar;
6
+import java.util.Collection;
7
+import java.util.Iterator;
8
+import java.util.List;
9
+
10
+import groovy.util.logging.Slf4j;
11
+import io.shardingsphere.core.api.algorithm.sharding.ListShardingValue;
12
+import io.shardingsphere.core.api.algorithm.sharding.ShardingValue;
13
+import io.shardingsphere.core.api.algorithm.sharding.complex.ComplexKeysShardingAlgorithm;
14
+
15
+@Slf4j
16
+public class MyPreciseShardingAlgorithm implements ComplexKeysShardingAlgorithm {
17
+    
18
+    @Override
19
+    public Collection<String> doSharding(Collection<String> availableTargetNames,
20
+            Collection<ShardingValue> shardingValues) {
21
+        
22
+        Collection<Object> orderCodeValues = getShardingValue(shardingValues, "order_code");
23
+        Collection<Object> dateValues = getShardingValue(shardingValues, "gmt_create");
24
+        List<String> shardingSuffix = new ArrayList<>();
25
+        
26
+        /**例如:根据user_id + order_id 双分片键来进行分表*/
27
+        //Set<List<Integer>> valueResult = Sets.cartesianProduct(userIdValues, orderIdValues);
28
+        for (Object orderCode : orderCodeValues) {
29
+            long code = Long.parseLong(((String)orderCode).substring(16, 20));
30
+            
31
+            for (Object date : dateValues) {                
32
+                Timestamp timestamp = (Timestamp)date;
33
+                Calendar calendar = Calendar.getInstance();
34
+                calendar.setTimeInMillis(timestamp.getTime());
35
+                int year = calendar.get(Calendar.YEAR);
36
+                String suffix = year + "_" + (code&0x001);
37
+                
38
+                availableTargetNames.forEach(x -> {
39
+                    if (x.endsWith(suffix)) {
40
+                        shardingSuffix.add(x);
41
+                    }
42
+                });
43
+            }
44
+        }
45
+                
46
+        return shardingSuffix;
47
+    }
48
+
49
+    private Collection<Object> getShardingValue(Collection<ShardingValue> shardingValues, final String key) {
50
+        Collection<Object> valueSet = new ArrayList<>();
51
+        Iterator<ShardingValue> iterator = shardingValues.iterator();
52
+        while (iterator.hasNext()) {
53
+            ShardingValue next = iterator.next();
54
+            if (next instanceof ListShardingValue) {
55
+                ListShardingValue value = (ListShardingValue) next;
56
+                /**例如:根据user_id + order_id 双分片键来进行分表*/
57
+                if (value.getColumnName().equals(key)) {
58
+                    return value.getValues();
59
+                }
60
+            }
61
+        }
62
+        return valueSet;
63
+    }
64
+
65
+}

+ 78 - 0
src/main/java/com/huojutech/sharding/entity/Order.java

@@ -0,0 +1,78 @@
1
+/*
2
+ * Copyright 2016-2018 shardingsphere.io.
3
+ * <p>
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ * </p>
16
+ */
17
+
18
+package com.huojutech.sharding.entity;
19
+
20
+import java.util.Date;
21
+
22
+public final class Order {
23
+    
24
+    private long orderId;
25
+    
26
+    private String orderCode;
27
+    
28
+    private int userId;
29
+    
30
+    private String status;
31
+    
32
+    private Date gmtCreate;
33
+    
34
+    public long getOrderId() {
35
+        return orderId;
36
+    }
37
+    
38
+    public void setOrderId(final long orderId) {
39
+        this.orderId = orderId;
40
+    }
41
+    
42
+    public int getUserId() {
43
+        return userId;
44
+    }
45
+    
46
+    public void setUserId(final int userId) {
47
+        this.userId = userId;
48
+    }
49
+    
50
+    public String getStatus() {
51
+        return status;
52
+    }
53
+    
54
+    public void setStatus(final String status) {
55
+        this.status = status;
56
+    }
57
+    
58
+    @Override
59
+    public String toString() {
60
+        return String.format("order_id: %s, user_id: %s, status: %s", orderId, userId, status);
61
+    }
62
+
63
+    public String getOrderCode() {
64
+        return orderCode;
65
+    }
66
+
67
+    public void setOrderCode(String orderCode) {
68
+        this.orderCode = orderCode;
69
+    }
70
+
71
+    public Date getGmtCreate() {
72
+        return gmtCreate;
73
+    }
74
+
75
+    public void setGmtCreate(Date gmtCreate) {
76
+        this.gmtCreate = gmtCreate;
77
+    }
78
+}

+ 66 - 0
src/main/java/com/huojutech/sharding/entity/OrderItem.java

@@ -0,0 +1,66 @@
1
+/*
2
+ * Copyright 2016-2018 shardingsphere.io.
3
+ * <p>
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ * </p>
16
+ */
17
+
18
+package com.huojutech.sharding.entity;
19
+
20
+public final class OrderItem {
21
+    
22
+    private long orderItemId;
23
+    
24
+    private long orderId;
25
+    
26
+    private int userId;
27
+    
28
+    private String status;
29
+    
30
+    public long getOrderItemId() {
31
+        return orderItemId;
32
+    }
33
+    
34
+    public void setOrderItemId(final long orderItemId) {
35
+        this.orderItemId = orderItemId;
36
+    }
37
+    
38
+    public long getOrderId() {
39
+        return orderId;
40
+    }
41
+    
42
+    public void setOrderId(final long orderId) {
43
+        this.orderId = orderId;
44
+    }
45
+    
46
+    public int getUserId() {
47
+        return userId;
48
+    }
49
+    
50
+    public void setUserId(final int userId) {
51
+        this.userId = userId;
52
+    }
53
+    
54
+    public String getStatus() {
55
+        return status;
56
+    }
57
+    
58
+    public void setStatus(final String status) {
59
+        this.status = status;
60
+    }
61
+    
62
+    @Override
63
+    public String toString() {
64
+        return String.format("item_id:%s, order_id: %s, user_id: %s, status: %s", orderItemId, orderId, userId, status);
65
+    }
66
+}

+ 40 - 0
src/main/java/com/huojutech/sharding/repository/OrderItemRepository.java

@@ -0,0 +1,40 @@
1
+/*
2
+ * Copyright 2016-2018 shardingsphere.io.
3
+ * <p>
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ * </p>
16
+ */
17
+
18
+package com.huojutech.sharding.repository;
19
+
20
+import org.apache.ibatis.annotations.Mapper;
21
+
22
+import com.huojutech.sharding.entity.OrderItem;
23
+
24
+import java.util.List;
25
+
26
+@Mapper
27
+public interface OrderItemRepository {
28
+    
29
+    void createIfNotExistsTable();
30
+    
31
+    void truncateTable();
32
+    
33
+    Long insert(OrderItem model);
34
+    
35
+    void delete(Long orderItemId);
36
+    
37
+    List<OrderItem> selectAll();
38
+    
39
+    void dropTable();
40
+}

+ 36 - 0
src/main/java/com/huojutech/sharding/repository/OrderRepository.java

@@ -0,0 +1,36 @@
1
+/*
2
+ * Copyright 2016-2018 shardingsphere.io.
3
+ * <p>
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ * </p>
16
+ */
17
+
18
+package com.huojutech.sharding.repository;
19
+
20
+import org.apache.ibatis.annotations.Mapper;
21
+
22
+import com.huojutech.sharding.entity.Order;
23
+
24
+@Mapper
25
+public interface OrderRepository {
26
+    
27
+    void createIfNotExistsTable();
28
+    
29
+    void truncateTable();
30
+    
31
+    Long insert(Order model);
32
+    
33
+    void delete(Long orderId);
34
+    
35
+    void dropTable();
36
+}

+ 77 - 0
src/main/java/com/huojutech/sharding/service/DemoService.java

@@ -0,0 +1,77 @@
1
+/*
2
+ * Copyright 2016-2018 shardingsphere.io.
3
+ * <p>
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ * </p>
16
+ */
17
+
18
+package com.huojutech.sharding.service;
19
+
20
+import org.springframework.stereotype.Service;
21
+
22
+import com.huojutech.sharding.algorithm.IDGenerator;
23
+import com.huojutech.sharding.entity.Order;
24
+import com.huojutech.sharding.entity.OrderItem;
25
+import com.huojutech.sharding.repository.OrderItemRepository;
26
+import com.huojutech.sharding.repository.OrderRepository;
27
+
28
+import javax.annotation.Resource;
29
+import java.util.ArrayList;
30
+import java.util.Date;
31
+import java.util.List;
32
+
33
+@Service
34
+public class DemoService {
35
+    
36
+    @Resource
37
+    private OrderRepository orderRepository;
38
+    
39
+    @Resource
40
+    private OrderItemRepository orderItemRepository;
41
+    
42
+    public void demo() {
43
+        orderRepository.createIfNotExistsTable();
44
+        orderItemRepository.createIfNotExistsTable();
45
+        orderRepository.truncateTable();
46
+        orderItemRepository.truncateTable();
47
+        List<Long> orderIds = new ArrayList<>(10);
48
+        IDGenerator idGenerator = new IDGenerator();
49
+        
50
+        System.out.println("1.Insert--------------");
51
+        for (int i = 0; i < 10; i++) {
52
+            Order order = new Order();
53
+            order.setUserId(i);
54
+            order.setGmtCreate(new Date());
55
+            order.setOrderCode("20180" + idGenerator.generateKey().toString());
56
+            
57
+            order.setStatus("INSERT_TEST");
58
+            orderRepository.insert(order);
59
+            long orderId = order.getOrderId();
60
+            orderIds.add(orderId);
61
+            
62
+//            OrderItem item = new OrderItem();
63
+//            item.setOrderId(orderId);
64
+//            item.setUserId(i);
65
+//            orderItemRepository.insert(item);
66
+        }
67
+        System.out.println(orderItemRepository.selectAll());
68
+        System.out.println("2.Delete--------------");
69
+//        for (Long each : orderIds) {
70
+//            orderRepository.delete(each);
71
+//            orderItemRepository.delete(each);
72
+//        }
73
+//        System.out.println(orderItemRepository.selectAll());
74
+//        orderItemRepository.dropTable();
75
+//        orderRepository.dropTable();
76
+    }
77
+}

+ 48 - 0
src/main/resources/META-INF/mappers/OrderItemMapper.xml

@@ -0,0 +1,48 @@
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3
+<mapper namespace="io.shardingsphere.example.spring.boot.mybatis.repository.OrderItemRepository">
4
+    <resultMap id="baseResultMap" type="io.shardingsphere.example.spring.boot.mybatis.entity.OrderItem">
5
+        <result column="order_item_id" property="orderItemId" jdbcType="INTEGER" />
6
+        <result column="order_id" property="orderId" jdbcType="INTEGER" />
7
+        <result column="user_id" property="userId" jdbcType="INTEGER" />
8
+    </resultMap>
9
+    
10
+    <update id="createIfNotExistsTable">
11
+        CREATE TABLE IF NOT EXISTS t_order_item 
12
+        (order_item_id BIGINT AUTO_INCREMENT, order_id BIGINT, user_id INT NOT NULL, 
13
+        `order_code` varchar(50) NOT NULL,
14
+        `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
15
+        PRIMARY KEY (order_item_id));
16
+    </update>
17
+    
18
+    <update id="truncateTable">
19
+        TRUNCATE TABLE t_order_item;
20
+    </update>
21
+    
22
+    <update id="dropTable">
23
+        DROP TABLE IF EXISTS t_order_item;
24
+    </update>
25
+    
26
+    <insert id="insert" useGeneratedKeys="true" keyProperty="orderItemId">
27
+        INSERT INTO t_order_item (
28
+          order_id, user_id
29
+        )
30
+        VALUES (
31
+        #{orderId,jdbcType=INTEGER},
32
+        #{userId,jdbcType=INTEGER}
33
+        )
34
+    </insert>
35
+    
36
+    <delete id="delete">
37
+        DELETE FROM t_order_item WHERE order_id = #{orderId,jdbcType=INTEGER}
38
+    </delete>
39
+    
40
+    <select id="selectAll" resultMap="baseResultMap">
41
+        SELECT
42
+        i.*
43
+        FROM
44
+        t_order o, t_order_item i
45
+        WHERE
46
+        o.order_id = i.order_id
47
+    </select>
48
+</mapper>

+ 35 - 0
src/main/resources/META-INF/mappers/OrderMapper.xml

@@ -0,0 +1,35 @@
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3
+<mapper namespace="io.shardingsphere.example.spring.boot.mybatis.repository.OrderRepository">
4
+    <update id="createIfNotExistsTable">
5
+        CREATE TABLE IF NOT EXISTS t_order 
6
+        (order_id BIGINT AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50),
7
+        `order_code` varchar(50) NOT NULL,
8
+        `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
9
+         PRIMARY KEY (order_id));
10
+    </update>
11
+    
12
+    <update id="truncateTable">
13
+        TRUNCATE TABLE t_order;
14
+    </update>
15
+    
16
+    <update id="dropTable">
17
+        DROP TABLE IF EXISTS t_order;
18
+    </update>
19
+    
20
+    <insert id="insert" useGeneratedKeys="true" keyProperty="orderId">
21
+        INSERT INTO t_order (
22
+          user_id, status,order_code,gmt_create
23
+        )
24
+        VALUES (
25
+        #{userId,jdbcType=INTEGER},
26
+        #{status,jdbcType=VARCHAR},
27
+        #{orderCode},
28
+        #{gmtCreate}
29
+        )
30
+    </insert>
31
+    
32
+    <delete id="delete">
33
+        DELETE FROM t_order WHERE order_id = #{orderId,jdbcType=INTEGER}
34
+    </delete>
35
+</mapper>

+ 16 - 0
src/main/resources/META-INF/mybatis-config.xml

@@ -0,0 +1,16 @@
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<!DOCTYPE configuration
3
+        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4
+        "http://mybatis.org/dtd/mybatis-3-config.dtd">
5
+<configuration>
6
+    <!--<settings>-->
7
+        <!--<setting name="logImpl" value="STDOUT_LOGGING" />-->
8
+    <!--</settings>-->
9
+    <typeAliases>
10
+        <package name="io.shardingsphere.example.spring.boot.mybatis.entity"/>
11
+    </typeAliases>
12
+    <mappers>
13
+        <mapper resource="META-INF/mappers/OrderMapper.xml"/>
14
+        <mapper resource="META-INF/mappers/OrderItemMapper.xml"/>
15
+    </mappers>
16
+</configuration>

+ 35 - 0
src/main/resources/application-sharding.properties

@@ -0,0 +1,35 @@
1
+sharding.jdbc.datasource.names=ds_0
2
+
3
+sharding.jdbc.datasource.ds_0.type=org.apache.commons.dbcp.BasicDataSource
4
+sharding.jdbc.datasource.ds_0.driver-class-name=com.mysql.jdbc.Driver
5
+sharding.jdbc.datasource.ds_0.url=jdbc:mysql://localhost:3306/demo_ds_0
6
+sharding.jdbc.datasource.ds_0.username=root
7
+sharding.jdbc.datasource.ds_0.password=123456
8
+
9
+#sharding.jdbc.config.sharding.default-data-source-name= ds_0
10
+#sharding.jdbc.config.sharding.default-database-strategy.standard.sharding-column=order_code
11
+#sharding.jdbc.config.sharding.default-database-strategy.standard.algorithm-class-name=io.shardingsphere.example.spring.boot.mybatis.algorithm.DatabaseShardingAlgorithm
12
+#sharding.jdbc.config.sharding.default-key-generator-class-name= io.shardingsphere.example.spring.boot.mybatis.service.IDGenerator
13
+
14
+sharding.jdbc.config.sharding.tables.t_order.database-strategy.complex.sharding-columns=order_code,gmt_create
15
+sharding.jdbc.config.sharding.tables.t_order.database-strategy.complex.algorithm-class-name=io.shardingsphere.example.spring.boot.mybatis.algorithm.DatabaseShardingAlgorithm
16
+sharding.jdbc.config.sharding.tables.t_order.actual-data-nodes=ds_0.t_order_$->{2018..2019}_$->{0..1}
17
+sharding.jdbc.config.sharding.tables.t_order.table-strategy.complex.sharding-columns=order_code,gmt_create
18
+sharding.jdbc.config.sharding.tables.t_order.key-generator-column-name=order_id
19
+sharding.jdbc.config.sharding.tables.t_order.table-strategy.complex.algorithm-class-name=io.shardingsphere.example.spring.boot.mybatis.algorithm.MyPreciseShardingAlgorithm
20
+
21
+#sharding.jdbc.config.sharding.tables.t_order_item.actual-data-nodes=ds_$->{0..1}.t_order_item_$->{0..1}
22
+#sharding.jdbc.config.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_id
23
+#sharding.jdbc.config.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item_$->{order_id % 2}
24
+#sharding.jdbc.config.sharding.tables.t_order_item.key-generator-column-name=order_item_id
25
+
26
+sharding.jdbc.config.sharding.tables.t_order_item.database-strategy.complex.sharding-columns=order_code,gmt_create
27
+sharding.jdbc.config.sharding.tables.t_order_item.database-strategy.complex.algorithm-class-name=io.shardingsphere.example.spring.boot.mybatis.algorithm.DatabaseShardingAlgorithm
28
+sharding.jdbc.config.sharding.tables.t_order_item.actual-data-nodes=ds_0.t_order_item_$->{2018..2019}_$->{0..1}
29
+sharding.jdbc.config.sharding.tables.t_order_item.table-strategy.complex.sharding-columns=order_code,gmt_create
30
+sharding.jdbc.config.sharding.tables.t_order_item.key-generator-column-name=order_item_id
31
+sharding.jdbc.config.sharding.tables.t_order_item.table-strategy.complex.algorithm-class-name=io.shardingsphere.example.spring.boot.mybatis.algorithm.MyPreciseShardingAlgorithm
32
+
33
+sharding.jdbc.config.sharding.binding-tables[0]= t_order,t_order_item
34
+
35
+sharding.jdbc.config.sharding.props.sql.show= true

+ 32 - 0
src/main/resources/application.properties

@@ -0,0 +1,32 @@
1
+spring.jpa.properties.hibernate.hbm2ddl.auto=create
2
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
3
+spring.jpa.properties.hibernate.show_sql=true
4
+mybatis.config-location=classpath:META-INF/mybatis-config.xml
5
+
6
+spring.profiles.active=sharding
7
+#spring.profiles.active=sharding-db
8
+#spring.profiles.active=sharding-tbl
9
+#spring.profiles.active=masterslave
10
+#spring.profiles.active=sharding-masterslave
11
+
12
+#spring.profiles.active=etcd-sharding-local
13
+#spring.profiles.active=etcd-sharding-cloud
14
+#spring.profiles.active=etcd-sharding-db-local
15
+#spring.profiles.active=etcd-sharding-db-cloud
16
+#spring.profiles.active=etcd-sharding-tbl-local
17
+#spring.profiles.active=etcd-sharding-tbl-cloud
18
+#spring.profiles.active=etcd-masterslave-local
19
+#spring.profiles.active=etcd-masterslave-cloud
20
+#spring.profiles.active=etcd-sharding-masterslave-local
21
+#spring.profiles.active=etcd-sharding-masterslave-cloud
22
+
23
+#spring.profiles.active=zookeeper-sharding-local
24
+#spring.profiles.active=zookeeper-sharding-cloud
25
+#spring.profiles.active=zookeeper-sharding-db-local
26
+#spring.profiles.active=zookeeper-sharding-db-cloud
27
+#spring.profiles.active=zookeeper-sharding-tbl-local
28
+#spring.profiles.active=zookeeper-sharding-tbl-cloud
29
+#spring.profiles.active=zookeeper-masterslave-local
30
+#spring.profiles.active=zookeeper-masterslave-cloud
31
+#spring.profiles.active=zookeeper-sharding-masterslave-local
32
+#spring.profiles.active=zookeeper-sharding-masterslave-cloud

+ 17 - 0
src/main/resources/logback.xml

@@ -0,0 +1,17 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<configuration>
3
+    <property name="log.context.name" value="sharding-jdbc-spring-namespace-mybatis-example" />
4
+    <property name="log.charset" value="UTF-8" />
5
+    <property name="log.pattern" value="[%-5level] %date --%thread-- [%logger] %msg %n" />
6
+    <contextName>${log.context.name}</contextName>
7
+    
8
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
9
+        <encoder charset="${log.charset}">
10
+            <pattern>${log.pattern}</pattern>
11
+        </encoder>
12
+    </appender>
13
+    <root>
14
+        <level value="INFO" />
15
+        <appender-ref ref="STDOUT" />
16
+    </root>
17
+</configuration>

+ 50 - 0
src/main/resources/manual_schema.sql

@@ -0,0 +1,50 @@
1
+DROP SCHEMA IF EXISTS demo_ds_0;
2
+DROP SCHEMA IF EXISTS demo_ds_1;
3
+DROP SCHEMA IF EXISTS demo_ds_master_0;
4
+DROP SCHEMA IF EXISTS demo_ds_master_0_slave_0;
5
+DROP SCHEMA IF EXISTS demo_ds_master_0_slave_1;
6
+DROP SCHEMA IF EXISTS demo_ds_master_1;
7
+DROP SCHEMA IF EXISTS demo_ds_master_1_slave_0;
8
+DROP SCHEMA IF EXISTS demo_ds_master_1_slave_1;
9
+
10
+DROP SCHEMA IF EXISTS demo_ds;
11
+DROP SCHEMA IF EXISTS demo_ds_master;
12
+DROP SCHEMA IF EXISTS demo_ds_slave_0;
13
+DROP SCHEMA IF EXISTS demo_ds_slave_1;
14
+
15
+CREATE SCHEMA IF NOT EXISTS demo_ds_0;
16
+CREATE SCHEMA IF NOT EXISTS demo_ds_1;
17
+CREATE SCHEMA IF NOT EXISTS demo_ds_master_0;
18
+CREATE SCHEMA IF NOT EXISTS demo_ds_master_0_slave_0;
19
+CREATE SCHEMA IF NOT EXISTS demo_ds_master_0_slave_1;
20
+CREATE SCHEMA IF NOT EXISTS demo_ds_master_1;
21
+CREATE SCHEMA IF NOT EXISTS demo_ds_master_1_slave_0;
22
+CREATE SCHEMA IF NOT EXISTS demo_ds_master_1_slave_1;
23
+
24
+CREATE SCHEMA IF NOT EXISTS demo_ds;
25
+CREATE SCHEMA IF NOT EXISTS demo_ds_master;
26
+CREATE SCHEMA IF NOT EXISTS demo_ds_slave_0;
27
+CREATE SCHEMA IF NOT EXISTS demo_ds_slave_1;
28
+
29
+-- Should sync from master-salve automatically
30
+-- CREATE TABLE IF NOT EXISTS demo_ds_slave_0.t_order (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id));
31
+-- CREATE TABLE IF NOT EXISTS demo_ds_slave_1.t_order (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id));
32
+-- CREATE TABLE IF NOT EXISTS demo_ds_slave_0.t_order_item (order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_item_id));
33
+-- CREATE TABLE IF NOT EXISTS demo_ds_slave_1.t_order_item (order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_item_id));
34
+
35
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_0_slave_0.t_order_0 (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id));
36
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_0_slave_0.t_order_1 (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id));
37
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_0_slave_1.t_order_0 (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id));
38
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_0_slave_1.t_order_1 (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id));
39
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_1_slave_0.t_order_0 (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id));
40
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_1_slave_0.t_order_1 (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id));
41
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_1_slave_1.t_order_0 (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id));
42
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_1_slave_1.t_order_1 (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id));
43
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_0_slave_0.t_order_item_0 (order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_item_id));
44
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_0_slave_0.t_order_item_1 (order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_item_id));
45
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_0_slave_1.t_order_item_0 (order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_item_id));
46
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_0_slave_1.t_order_item_1 (order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_item_id));
47
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_1_slave_0.t_order_item_0 (order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_item_id));
48
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_1_slave_0.t_order_item_1 (order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_item_id));
49
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_1_slave_1.t_order_item_0 (order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_item_id));
50
+-- CREATE TABLE IF NOT EXISTS demo_ds_master_1_slave_1.t_order_item_1 (order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, PRIMARY KEY (order_item_id));