SpringBoot+Sharding-JDBC操作分库分表

什么是Sharding-JDBC?什么是分库分表?为什么要分库分表?

可查看本篇博客:

Apache——ShardingSphere(分布式数据库中间件、对于分库分表的操作利器)

Sharding-JDBC操作水平分表

一、搭建环境

  1. 基础环境:SpringBoot2.2.1 + MybatisPlus + Sharding-JDBC + Druid连接池
  2. 创建SpringBoot工程
     

  3. 修改SpringBoot项目版本为2.2.1
     

  4. 引入相关依赖
     
    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- Druid连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.20</version>
            </dependency>
            <!-- Mysql驱动依赖 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <!-- MybatisPlus -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.0.5</version>
            </dependency>
            <!-- Sharding-JDBC -->
            <dependency>
                <groupId>org.apache.shardingsphere</groupId>
                <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
                <version>4.0.0-RC1</version>
            </dependency>
    
            <!-- lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
    
        </dependencies>

二、按照水平分表的方式创建数据库和数据库表

  1. 创建数据库goods_db;
  2. 在goods_db中创建表goods_1、goods_2;
  3. 约定规则,如果添加商品id是偶数把数据加入goods_1,如果是偶数把数据加入goods_2;
  4. 结构展示
     

三、编写代码

创建Goods实体类

@Data
public class Goods {
    private Long gid;
    private String gname;
    private Long userId;
    private String gstatus;
}

 @Data注解生成的内容如下:

创建GoodsMapper

@Repository
public interface GoodsMapper extends BaseMapper<Goods> {
}

启动类配置扫描Mapper包

@SpringBootApplication
@MapperScan("com.xxx.mapper")
public class ShardingJdbcApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShardingJdbcApplication.class, args);
    }

}

四、application.properties配置Sharding-JDBC

 
  1. # 配置Sharding-JDBC的分片策略

  2. # 配置数据源,给数据源起名g1,g2...此处可配置多数据源

  3. spring.shardingsphere.datasource.names=g1

  4.  
  5. # 配置数据源具体内容————————包含 连接池, 驱动, 地址, 用户名, 密码

  6. # 由于上面配置数据源只有g1因此下面只配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password

  7. spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource

  8. spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver

  9. spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/goods_db?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC

  10. spring.shardingsphere.datasource.g1.username=root

  11. spring.shardingsphere.datasource.g1.password=123456

  12.  
  13. # 配置表的分布,表的策略

  14. spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g1.goods_$->{1..2}

  15.  
  16. # 指定goods表 主键gid 生成策略为 SNOWFLAKE

  17. spring.shardingsphere.sharding.tables.goods.key-generator.column=gid

  18. spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

  19.  
  20. # 指定分片策略 约定gid值是偶数添加到goods_1表,如果gid是奇数添加到goods_2表

  21. spring.shardingsphere.sharding.tables.goods.table-strategy.inline.sharding-column=gid

  22. spring.shardingsphere.sharding.tables.goods.table-strategy.inline.algorithm-expression=goods_$->{gid % 2 + 1}

  23.  
  24. # 打开sql输出日志

  25. spring.shardingsphere.props.sql.show=true

PS:此类配置文件在ShardingShpere官网中可找到,不必担心记不住。

五、编写测试代码

 ShardingjdbcdemoApplicationTests.Java代码:

 
  1. package com.ws.shardingjdbcdemo;

  2.  
  3. import com.ws.shardingjdbcdemo.mapper.GoodsMapper;

  4. import com.ws.shardingjdbcdemo.pojo.Goods;

  5. import org.junit.jupiter.api.Test;

  6. import org.springframework.beans.factory.annotation.Autowired;

  7. import org.springframework.boot.test.context.SpringBootTest;

  8.  
  9. @SpringBootTest

  10. class ShardingjdbcdemoApplicationTests {

  11.  
  12. @Autowired

  13. GoodsMapper goodsMapper;

  14.  
  15. @Test

  16. void addGoods() {

  17. Goods good = new Goods();

  18. good.setGname("小米手机");

  19. good.setUserId(100L);

  20. good.setGstatus("已发布");

  21. goodsMapper.insert(good);

  22. }

  23.  
  24. }

启动测试方法,果然报错了:

 大概意思就是说,不允许有两个相同名称的Bean。

 解决方案:

    spring.main.allow-bean-definition-overriding=true

将此配置在application.properties中

 
  1. # 配置Sharding-JDBC的分片策略

  2. # 配置数据源,给数据源起名g1,g2...此处可配置多数据源

  3. spring.shardingsphere.datasource.names=g1

  4.  
  5. # 配置允许后面的Bean覆盖前面名称重复的Bean

  6. spring.main.allow-bean-definition-overriding=true

  7.  
  8. # 配置数据源具体内容————————包含 连接池, 驱动, 地址, 用户名, 密码

  9. # 由于上面配置数据源只有g1因此下面只配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password

  10. spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource

  11. spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver

  12. spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/goods_db?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC

  13. spring.shardingsphere.datasource.g1.username=root

  14. spring.shardingsphere.datasource.g1.password=123456

  15.  
  16. # 配置表的分布,表的策略

  17. spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g1.goods_$->{1..2}

  18.  
  19. # 指定goods表 主键gid 生成策略为 SNOWFLAKE

  20. spring.shardingsphere.sharding.tables.goods.key-generator.column=gid

  21. spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

  22.  
  23. # 指定分片策略 约定gid值是偶数添加到goods_1表,如果gid是奇数添加到goods_2表

  24. spring.shardingsphere.sharding.tables.goods.table-strategy.inline.sharding-column=gid

  25. spring.shardingsphere.sharding.tables.goods.table-strategy.inline.algorithm-expression=goods_$->{gid % 2 + 1}

  26.  
  27. # 打开sql输出日志

  28. spring.shardingsphere.props.sql.show=true

再次启动测试方法成功插入数据并在控制台打印出SQL语句:

 goods_1表:

 goods_2表:

PS:可看到gid为奇数,在goods_2中插入了数据,goods_1中无。 

 控制台:

 接下来测试一下是否真正按照奇数偶数来分表插入了。

修改addGoods()方法的代码:

 
  1. @Test

  2. void addGoods() {

  3. for (int i = 0; i < 10; i++){

  4. Goods good = new Goods();

  5. good.setGname("小米手机" + i);

  6. good.setUserId(100L);

  7. good.setGstatus("已发布");

  8. goodsMapper.insert(good);

  9. }

  10. }

执行结果:

goods_1表:

goods_2表:

 可看到,完全按照奇数插入2表,偶数插入1表的规则。

测试查询:

1. 编写getGood()方法

 
  1. @Test

  2. void getGood(){

  3. QueryWrapper<Goods> queryWrapper = new QueryWrapper<>();

  4. queryWrapper.eq("gid",479688915029065729L);

  5. Goods good = goodsMapper.selectOne(queryWrapper);

  6. System.out.println(good.toString());

  7. }

2. 执行getGood(),成功打印出gid = 479688915029065729 的数据信息

以上就是Sharding-JDBC对水平分表的操作。若有问题可留言评论,旨在共同学习,共同进步!

上面讲述了使用Sharding-JDBC如何对水平分表的操作,接下来玩玩水平分库分表操作。

Sharding-JDBC操作水平分库+水平分表

1. 创建两个数据库goods_db_1和goods_db_2,每个数据库中均包含两个表goods_1和goods_2,goods_1和goods_2和上述分表的结构一样。

2. 配置application.properties

 
  1. # 配置Sharding-JDBC的分片策略

  2. # 配置数据源,给数据源起名g1,g2...此处可配置多数据源

  3. spring.shardingsphere.datasource.names=g1,g2

  4.  
  5. # 配置允许一个实体类映射多张表

  6. spring.main.allow-bean-definition-overriding=true

  7.  
  8. # 配置数据源具体内容————————包含 连接池, 驱动, 地址, 用户名, 密码

  9. # g1配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password

  10. spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource

  11. spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver

  12. spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/goods_db_1?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC

  13. spring.shardingsphere.datasource.g1.username=root

  14. spring.shardingsphere.datasource.g1.password=123456

  15.  
  16. # 配置数据源具体内容————————包含 连接池, 驱动, 地址, 用户名, 密码

  17. # g2配置g2.type,g2.driver-class-name,g2.url,g2.username,g2.password

  18. spring.shardingsphere.datasource.g2.type=com.alibaba.druid.pool.DruidDataSource

  19. spring.shardingsphere.datasource.g2.driver-class-name=com.mysql.cj.jdbc.Driver

  20. spring.shardingsphere.datasource.g2.url=jdbc:mysql://localhost:3306/goods_db_2?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC

  21. spring.shardingsphere.datasource.g2.username=root

  22. spring.shardingsphere.datasource.g2.password=123456

  23.  
  24. # 配置数据库的分布,表的分布

  25. # m1:goods_1 goods_2; m2:goods_1,goods_2;

  26. spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g$->{1..2}.goods_$->{1..2}

  27.  
  28. # 指定goods表 主键gid 生成策略为 SNOWFLAKE

  29. spring.shardingsphere.sharding.tables.goods.key-generator.column=gid

  30. spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

  31.  
  32. # 指定数据库分片策略 约定user_id值是偶数添加到goods_db_1中,奇数添加到goods_db_2中

  33. spring.shardingsphere.sharding.tables.goods.database-strategy.inline.sharding-column=user_id

  34. spring.shardingsphere.sharding.tables.goods.database-strategy.inline.algorithm-expression=g$->{user_id % 2 + 1}

  35.  
  36. # 指定表分片策略 约定gid值是偶数添加到goods_1表,如果gid是奇数添加到goods_2表

  37. spring.shardingsphere.sharding.tables.goods.table-strategy.inline.sharding-column=gid

  38. spring.shardingsphere.sharding.tables.goods.table-strategy.inline.algorithm-expression=goods_$->{gid % 2 + 1}

  39.  
  40. # 打开sql输出日志

  41. spring.shardingsphere.props.sql.show=true

 3. 编写测试方法addGoods02()

 
  1. @Test

  2. void addGoods02(){

  3. Goods good = new Goods();

  4. good.setGname("华为手机");

  5. good.setUserId(100L);

  6. good.setGstatus("已发布");

  7. goodsMapper.insert(good);

  8. }

 4. 执行addGoods02()方法

     由于我们的user_id设置为100L,为偶数,根据我们的初衷,偶数存入goods_db_1中。

 5. 执行结果

     控制台sql语句显示与我们所期望的一致。

      数据库结果也与我们所期望一致。 

      剩下批量插入,查询,修改,删除操作大家可以自行尝试一下。

Sharding-JDBC操作垂直分库+水平分库+水平分表

背景描述:

      在  分库分表&分库分表利器 文章中了解到什么是垂直分库分表、水平分库分表,为什么分库分表;在咱们实际项目中,垂直分库后会有多个数据库,每个数据库中有属于自己的表和公共表(操作公共表在本节后面会讲述)。

      上面章节我们做到了用Sharding-JDBC操作水平分库分表,在以上基础上,我们还有一个数据库user_db,里面有一张t_user表,用来存放用户信息,这是在咱们一个项目中有多个数据库,每个数据库又有不同的表。 

数据库结构及t_user表结构如下:

一、需求分析

      在我们项目中有以上这么多数据库和表,当我们操作t_user表时,快速准确操作到userdb数据库 > t_user表。

二、实现需求

     1. 配置application.properties文件

     在上面水平分库分表的基础上编写关于user_db和t_user表的配置。

 
  1. # 配置Sharding-JDBC的分片策略

  2. # 配置数据源,给数据源起名g1,g2...此处可配置多数据源

  3. spring.shardingsphere.datasource.names=g1,g2,u0

  4.  
  5. # 配置允许一个实体类映射多张表

  6. spring.main.allow-bean-definition-overriding=true

  7.  
  8. # 配置g1数据源具体内容————————包含 连接池, 驱动, 地址, 用户名, 密码

  9. # g1配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password

  10. spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource

  11. spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver

  12. spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/goods_db_1?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC

  13. spring.shardingsphere.datasource.g1.username=root

  14. spring.shardingsphere.datasource.g1.password=123456

  15.  
  16. # 配置g2数据源具体内容————————包含 连接池, 驱动, 地址, 用户名, 密码

  17. # g2配置g2.type,g2.driver-class-name,g2.url,g2.username,g2.password

  18. spring.shardingsphere.datasource.g2.type=com.alibaba.druid.pool.DruidDataSource

  19. spring.shardingsphere.datasource.g2.driver-class-name=com.mysql.cj.jdbc.Driver

  20. spring.shardingsphere.datasource.g2.url=jdbc:mysql://localhost:3306/goods_db_2?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC

  21. spring.shardingsphere.datasource.g2.username=root

  22. spring.shardingsphere.datasource.g2.password=123456

  23.  
  24. # 配置u0数据源具体内容————————包含 连接池, 驱动, 地址, 用户名, 密码

  25. # u0配置u0.type,u0.driver-class-name,u0.url,u0.username,u0.password

  26. spring.shardingsphere.datasource.u0.type=com.alibaba.druid.pool.DruidDataSource

  27. spring.shardingsphere.datasource.u0.driver-class-name=com.mysql.cj.jdbc.Driver

  28. spring.shardingsphere.datasource.u0.url=jdbc:mysql://localhost:3306/user_db?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC

  29. spring.shardingsphere.datasource.u0.username=root

  30. spring.shardingsphere.datasource.u0.password=123456

  31.  
  32. #配置垂直分库t_user的策略

  33. spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=u0.t_user

  34. spring.shardingsphere.sharding.tables.t_user.key-generator.column=user_id

  35. spring.shardingsphere.sharding.tables.t_user.key-generator.type=SNOWFLAKE

  36. spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.sharding-column=user_id

  37. #由于只有一张表,因此在此直接写表明,不需要像水平分多个表那样写策略

  38. spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.algorithm-expression=t_user

  39.  
  40. # 配置数据库的分布,表的分布

  41. # g1:goods_1 goods_2; g2:goods_1,goods_2;

  42. spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g$->{1..2}.goods_$->{1..2}

  43.  
  44. # 指定goods表 主键gid 生成策略为 SNOWFLAKE

  45. spring.shardingsphere.sharding.tables.goods.key-generator.column=gid

  46. spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

  47.  
  48. # 指定数据库分片策略 约定user_id值是偶数添加到goods_db_1中,奇数添加到goods_db_2中

  49. spring.shardingsphere.sharding.tables.goods.database-strategy.inline.sharding-column=user_id

  50. spring.shardingsphere.sharding.tables.goods.database-strategy.inline.algorithm-expression=g$->{user_id % 2 + 1}

  51.  
  52. # 指定表分片策略 约定gid值是偶数添加到goods_1表,如果gid是奇数添加到goods_2表

  53. spring.shardingsphere.sharding.tables.goods.table-strategy.inline.sharding-column=gid

  54. spring.shardingsphere.sharding.tables.goods.table-strategy.inline.algorithm-expression=goods_$->{gid % 2 + 1}

  55.  
  56. # 打开sql输出日志

  57. spring.shardingsphere.props.sql.show=true

     2. 编写代码

        User.java

 
  1. package com.ws.shardingjdbcdemo.pojo;

  2.  
  3. import com.baomidou.mybatisplus.annotation.TableName;

  4. import lombok.Data;

  5.  
  6. @Data

  7. @TableName("t_user")

  8. public class User {

  9. private Long userId;

  10. private String username;

  11. private String ustatus;

  12. }

        UserMapper.java

 
  1. package com.ws.shardingjdbcdemo.mapper;

  2.  
  3. import com.baomidou.mybatisplus.core.mapper.BaseMapper;

  4. import com.ws.shardingjdbcdemo.pojo.User;

  5. import org.springframework.stereotype.Repository;

  6.  
  7. @Repository

  8. public interface UserMapper extends BaseMapper<User> {

  9.  
  10. }

        Tests.java

 
  1. @Test

  2. void addUser(){

  3. User user = new User();

  4. user.setUsername("琳妹妹");

  5. user.setUstatus("0");

  6. userMapper.insert(user);

  7. }

  8.  
  9. @Test

  10. void getUser(){

  11. QueryWrapper<User> queryWrapper = new QueryWrapper<>();

  12. //此处请填写自己程序生成的ID

  13. queryWrapper.eq("user_id",100L);

  14. User good = userMapper.selectOne(queryWrapper);

  15. System.out.println(good.toString());

  16. }

三、测试及结果

addUser()结果:

  getUser结果:

 Sharding-JDBC操作公共表

      背景描述:

        在项目中一般会有一些表的内容是固定的,或者说是很少修改的表,但是又经常跟这些表关联查询,例如一些状态信息。一般在我们项目中这种表会存放在我们各个数据库,所以称为公共表。

        在上面章节我们使用Sharding-JDBC操作了垂直分库+水平分库+水平分表,假设现在在我们的各个数据库中均有一张公共表t_dict。

      数据库&表结构:

      需求:

            操作公共表时,例如增加和删除操作时,会修改所有数据库中的这张表。

      实现:

          1、在上章节基础上编写配置 application.properties(配置公共表部分)

 
  1. # 配置Sharding-JDBC的分片策略

  2. # 配置数据源,给数据源起名g1,g2...此处可配置多数据源

  3. spring.shardingsphere.datasource.names=g1,g2,u0

  4.  
  5. # 配置允许一个实体类映射多张表

  6. spring.main.allow-bean-definition-overriding=true

  7.  
  8. # 配置g1数据源具体内容————————包含 连接池, 驱动, 地址, 用户名, 密码

  9. # g1配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password

  10. spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource

  11. spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver

  12. spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/goods_db_1?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC

  13. spring.shardingsphere.datasource.g1.username=root

  14. spring.shardingsphere.datasource.g1.password=123456

  15.  
  16. # 配置g2数据源具体内容————————包含 连接池, 驱动, 地址, 用户名, 密码

  17. # g2配置g2.type,g2.driver-class-name,g2.url,g2.username,g2.password

  18. spring.shardingsphere.datasource.g2.type=com.alibaba.druid.pool.DruidDataSource

  19. spring.shardingsphere.datasource.g2.driver-class-name=com.mysql.cj.jdbc.Driver

  20. spring.shardingsphere.datasource.g2.url=jdbc:mysql://localhost:3306/goods_db_2?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC

  21. spring.shardingsphere.datasource.g2.username=root

  22. spring.shardingsphere.datasource.g2.password=123456

  23.  
  24. # 配置u0数据源具体内容————————包含 连接池, 驱动, 地址, 用户名, 密码

  25. # u0配置u0.type,u0.driver-class-name,u0.url,u0.username,u0.password

  26. spring.shardingsphere.datasource.u0.type=com.alibaba.druid.pool.DruidDataSource

  27. spring.shardingsphere.datasource.u0.driver-class-name=com.mysql.cj.jdbc.Driver

  28. spring.shardingsphere.datasource.u0.url=jdbc:mysql://localhost:3306/user_db?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC

  29. spring.shardingsphere.datasource.u0.username=root

  30. spring.shardingsphere.datasource.u0.password=123456

  31.  
  32. # 配置公共表

  33. spring.shardingsphere.sharding.broadcast-tables=t_dict

  34. # 配置公共表ID及生成策略

  35. spring.shardingsphere.sharding.tables.t_dict.key-generator.column=dict_id

  36. spring.shardingsphere.sharding.tables.t_dict.key-generator.type=SNOWFLAKE

  37.  
  38. #配置垂直分库t_user的策略

  39. spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=u0.t_user

  40. spring.shardingsphere.sharding.tables.t_user.key-generator.column=user_id

  41. spring.shardingsphere.sharding.tables.t_user.key-generator.type=SNOWFLAKE

  42. spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.sharding-column=user_id

  43. #由于只有一张表,因此在此直接写表明,不需要像水平分多个表那样写策略

  44. spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.algorithm-expression=t_user

  45.  
  46. # 配置数据库的分布,表的分布

  47. # g1:goods_1 goods_2; g2:goods_1,goods_2;

  48. spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g$->{1..2}.goods_$->{1..2}

  49.  
  50. # 指定goods表 主键gid 生成策略为 SNOWFLAKE

  51. spring.shardingsphere.sharding.tables.goods.key-generator.column=gid

  52. spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

  53.  
  54. # 指定数据库分片策略 约定user_id值是偶数添加到goods_db_1中,奇数添加到goods_db_2中

  55. spring.shardingsphere.sharding.tables.goods.database-strategy.inline.sharding-column=user_id

  56. spring.shardingsphere.sharding.tables.goods.database-strategy.inline.algorithm-expression=g$->{user_id % 2 + 1}

  57.  
  58. # 指定表分片策略 约定gid值是偶数添加到goods_1表,如果gid是奇数添加到goods_2表

  59. spring.shardingsphere.sharding.tables.goods.table-strategy.inline.sharding-column=gid

  60. spring.shardingsphere.sharding.tables.goods.table-strategy.inline.algorithm-expression=goods_$->{gid % 2 + 1}

  61.  
  62. # 打开sql输出日志

  63. spring.shardingsphere.props.sql.show=true

          2、编写代码

                MyDict.java

 
  1. package com.ws.shardingjdbcdemo.pojo;

  2.  
  3. import com.baomidou.mybatisplus.annotation.TableName;

  4. import lombok.Data;

  5.  
  6. @Data

  7. @TableName("t_dict")

  8. public class MyDict {

  9. private Long dictId;

  10. private String dictName;

  11. private String dictCode;

  12. }

                MyDictMapper.java

 
  1. package com.ws.shardingjdbcdemo.mapper;

  2.  
  3. import com.baomidou.mybatisplus.core.mapper.BaseMapper;

  4. import com.ws.shardingjdbcdemo.pojo.MyDict;

  5. import org.springframework.stereotype.Repository;

  6.  
  7. @Repository

  8. public interface MyDictMapper extends BaseMapper<MyDict> {

  9.  
  10. }

                Tests.java

 
  1. /**

  2. * 下面是公共表测试方法

  3. */

  4. @Test

  5. void addDict(){

  6. MyDict myDict = new MyDict();

  7. myDict.setDictName("已启用");

  8. myDict.setDictCode("1");

  9. myDictMapper.insert(myDict);

  10. }

  11.  
  12. @Test

  13. void deleteDict(){

  14. QueryWrapper<MyDict> wrapper = new QueryWrapper<>();

  15. wrapper.eq("dict_id","");

  16. myDictMapper.delete(wrapper);

  17. }

          3、测试 

          addDict()方法:

          deleteDict()方法: 

      以上就是通过Apache-ShardingSphere的Sharding-JDBC对分库分表以及公共表的操作,假如您有疑问,可以在下方评论留言,旨在共同学习,共同进步!

猜你喜欢

转载自blog.csdn.net/feikillyou/article/details/112545986