SpringBoot教程(二十五) | SpringBoot整合Sharding-JDBC分库分表

参考文章
【1】SpringBoot+Sharding-JDBC操作分库分表(超超超详细)

前言

1. 什么是Sharding?

Sharding是一种数据库架构技术,它将一个大的数据库或表水平拆分成多个较小的、更易于管理的片段,这些片段被称为shards。
每个shard可以存储数据库的一部分数据,并且通常被部署在独立的数据库服务器上。
Sharding的主要目的是通过横向扩展来提高数据库的性能、可靠性和可扩展性。

2. 什么是Sharding-JDBC?

Sharding-JDBC早期是由当当网开源的分布式数据库中间件,后期该项目被放入到ShardingSphere项目下,Sharding-JDBC是一个轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务, 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架

在使用Sharding-JDBC首先要清楚以下几点
1.它是一个轻量级的Java框架,可以理解是增强的JDBC驱动
2.Sharding-JDBC是不做分库分表的,库与表是由数据库工程师分好的,通过引入Sharding-JDBC.jar配置好配置,解决多数据源切换与多数据源的操作

所需的maven依赖

主要为 sharding-jdbc-spring-boot-starter、druid

<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>

<!-- 数据库连接驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<!-- 数据库连接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.6</version>
</dependency>

<!-- sharding-jdbc 数据库分库分表 -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.1</version>
</dependency>

<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

细节注意:

引入sharding-jdbc-spring-boot-starter依赖时 不要同时引入 druid-spring-boot-starter依赖,
不然会出现Mapper 的bean的创建失败,sqlSessionFactory或sqlSessionTemplate属性没有被正确设置或注入(Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required)的情况.

解决方案:将druid-spring-boot-starter修改为

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>

原因:是因为引入了sharding,数据源指向了sharding数据源,druid启动器和sharding数据源出现了冲突,加载druid数据源失败而报错。

注意点(关于shardingsphere的配置情况)

(1)key-generator.column(主键字段)设定后,
当指定的列 未显式设值的(set操作)就会自动赋值生成 策略格式的数据,
当指定的列 存在显式设值的(set操作),就不会用策略格式的主键数据

实操一:如何水平分表

水平分表的意思:在同一个库中创建多个相同结构的表

1. 步骤说明

  1. 创建数据库 sharding
  2. 在sharding中创建表goods_1、goods_2
  3. 约定规则: 添加数据时
    商品id是偶数把数据加入goods_1表,奇数把数据加入goods_2表

2. 创建数据库和表

在这里插入图片描述

create database sharding;
use sharding;
DROP TABLE IF EXISTS `goods_1`;
CREATE TABLE `goods_1`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);
DROP TABLE IF EXISTS `goods_2`;
CREATE TABLE `goods_2`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);

3.配置application.properties文件

# 配置Sharding-JDBC的分片策略
# 配置数据源,给数据源起名g1,g2...此处可配置多数据源
spring.shardingsphere.datasource.names=g1

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 由于上面配置数据源只有g1因此下面只配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password
spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/sharding?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g1.username=root
spring.shardingsphere.datasource.g1.password=root

# 配置表的分布
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g1.goods_$->{1..2}

# 指定goods表 主键gid 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.column=gid
### 设置主键生成策略 可选内置的 SNOWFLAKE(雪花算法)/UUID
##也可以自定义(实现ShardingKeyGenerator,并配置META-INF/services/org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator)
# 此处的 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

# 指定表分片策略 
# 约定gid值是偶数添加到goods_1表,如果gid是奇数添加到goods_2表
spring.shardingsphere.sharding.tables.goods.table-strategy.inline.sharding-column=gid
spring.shardingsphere.sharding.tables.goods.table-strategy.inline.algorithm-expression=goods_$->{gid % 2 + 1}

# 打开sql输出日志
spring.shardingsphere.props.sql.show=true

4. 实体类、mapper接口、test启动类

实体类

package com.ws.shardingjdbcdemo.pojo;
import lombok.Data;
//@Data注解是lombok的注解,简化实体类编写,自动生成get/set以及toString等方法
@Data
public class Goods {
    private Long gid;
    private String gname;
    private Long userId;
    private String gstatus;
}

GoodsMapper接口

package com.example.reactboot.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.springframework.stereotype.Repository;

@Repository
public interface GoodsMapper extends BaseMapper<Goods> {

}

ShardingjdbcdemoApplicationTests 启动类

package com.example.reactboot;

import com.example.reactboot.mapper.GoodsMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ShardingjdbcdemoApplicationTests {

    @Autowired
    GoodsMapper goodsMapper;

    @Test
    void addGoods01() {
        for (int i = 0; i < 10; i++){
            Goods good = new Goods();
            good.setGname("小米手机" + (i+1));
            good.setUserId(100L);
            good.setGstatus("已发布");
            goodsMapper.insert(good);
        }
    }

}

最终效果
成功实现了
gid 为偶数 在1号表,为奇数 在2号表
在这里插入图片描述

实操二:如何水平分库

水平分库的意思:在多个库中 创建 一个相同结构的表

1. 步骤说明

  1. 创建数据库 sharding_1、sharding_2
  2. 在sharding_1、sharding_2中创建表goods
  3. 约定规则: 添加数据时
    用户id是偶数把数据加入sharding_1库,奇数把数据加入sharding_2库

2. 创建数据库和表

在这里插入图片描述

create database sharding_1;
use sharding_1;
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);

create database sharding_2;
use sharding_2;
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);

3. 配置application.properties文件

重点配置

# 配置数据库的分布,表的分布
# m1:goods_1 goods_2; m2:goods_1,goods_2;
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g$->{1..2}.goods

完整配置

# 配置Sharding-JDBC的分片策略
# 配置数据源,给数据源起名g1,g2...此处可配置多数据源
spring.shardingsphere.datasource.names=g1,g2

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password
spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/sharding_1?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g1.username=root
spring.shardingsphere.datasource.g1.password=root

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 只配置g2.type,g2.driver-class-name,g2.url,g2.username,g2.password
spring.shardingsphere.datasource.g2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g2.url=jdbc:mysql://localhost:3306/sharding_2?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g2.username=root
spring.shardingsphere.datasource.g2.password=root


# 配置数据库的分布,表的分布
# m1:goods_1 goods_2; m2:goods_1,goods_2;
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g$->{1..2}.goods

# 指定goods表 主键gid 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.column=gid
### 设置主键生成策略 可选内置的 SNOWFLAKE(雪花算法)/UUID
##也可以自定义(实现ShardingKeyGenerator,并配置META-INF/services/org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator)
# 此处的 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

# 指定数据库分片策略
# 约定user_id值是偶数添加到goods_db_1中,奇数添加到goods_db_2中
spring.shardingsphere.sharding.tables.goods.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.goods.database-strategy.inline.algorithm-expression=g$->{user_id % 2 + 1}

# 打开sql输出日志
spring.shardingsphere.props.sql.show=true

4. 实体类、mapper接口、test启动类

实体类

package com.ws.shardingjdbcdemo.pojo;
import lombok.Data;
//@Data注解是lombok的注解,简化实体类编写,自动生成get/set以及toString等方法
@Data
public class Goods {
    private Long gid;
    private String gname;
    private Long userId;
    private String gstatus;
}

GoodsMapper接口

package com.example.reactboot.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.springframework.stereotype.Repository;

@Repository
public interface GoodsMapper extends BaseMapper<Goods> {

}

ShardingjdbcdemoApplicationTests 启动类

package com.example.reactboot;

import com.example.reactboot.mapper.GoodsMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ShardingjdbcdemoApplicationTests {

    @Autowired
    GoodsMapper goodsMapper;

    @Test
    void addGoods02() {
        for (int i = 0; i < 10; i++){
            Goods good = new Goods();
            good.setGname("小米手机" + (i+1));
            good.setUserId((i+1)+100L);
            good.setGstatus("已发布");
            goodsMapper.insert(good);
        }
    }

}

最终效果
成功实现了
用户id 为偶数 在1号库,为奇数 在2号库

在这里插入图片描述

实操三:如何水平分库分表

水平分库分表:在同多个库中创建多个相同结构的表

1. 步骤说明

  1. 创建数据库 sharding_1、sharding_2
  2. 在sharding_1、sharding_2中都创建表goods_1、goods_2
  3. 约定规则: 添加数据时
    用户id是偶数把数据加入sharding_1库,奇数把数据加入sharding_2库
    商品id是偶数把数据加入goods_1表,奇数把数据加入goods_2表

2. 创建数据库和表

在这里插入图片描述

create database sharding_1;
use sharding_1;
DROP TABLE IF EXISTS `goods_1`;
CREATE TABLE `goods_1`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);
DROP TABLE IF EXISTS `goods_2`;
CREATE TABLE `goods_2`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);

create database sharding_2;
use sharding_2;
DROP TABLE IF EXISTS `goods_1`;
CREATE TABLE `goods_1`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);
DROP TABLE IF EXISTS `goods_2`;
CREATE TABLE `goods_2`  (
  `gid` bigint PRIMARY KEY COMMENT '商品ID,主键',
  `gname` varchar(50) NOT NULL COMMENT '商品名称',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `gstatus` varchar(10) NOT NULL COMMENT '商品状态,已发布 OR 未发布'
);

3.配置application.properties文件

重点配置

# 配置数据库的分布,表的分布
# m1:goods_1 goods_2; m2:goods_1,goods_2;
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g$->{1..2}.goods_$->{1..2}        

# 指定数据库分片策略 
# 约定user_id值是偶数添加到goods_db_1库中,奇数添加到goods_db_2库中
spring.shardingsphere.sharding.tables.goods.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.goods.database-strategy.inline.algorithm-expression=g$->{user_id % 2 + 1}

完整配置

# 配置Sharding-JDBC的分片策略
# 配置数据源,给数据源起名g1,g2...此处可配置多数据源
spring.shardingsphere.datasource.names=g1,g2

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password
spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/sharding_1?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g1.username=root
spring.shardingsphere.datasource.g1.password=root

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 只配置g2.type,g2.driver-class-name,g2.url,g2.username,g2.password
spring.shardingsphere.datasource.g2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g2.url=jdbc:mysql://localhost:3306/sharding_2?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g2.username=root
spring.shardingsphere.datasource.g2.password=root


# 配置数据库的分布,表的分布
# m1:goods_1 goods_2; m2:goods_1,goods_2;
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=g$->{1..2}.goods_$->{1..2}        

# 指定goods表 主键gid 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.column=gid
### 设置主键生成策略 可选内置的 SNOWFLAKE(雪花算法)/UUID
##也可以自定义(实现ShardingKeyGenerator,并配置META-INF/services/org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator)
# 此处的 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

# 指定数据库分片策略 
# 约定user_id值是偶数添加到goods_db_1库中,奇数添加到goods_db_2库中
spring.shardingsphere.sharding.tables.goods.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.goods.database-strategy.inline.algorithm-expression=g$->{user_id % 2 + 1}
 
# 指定表分片策略 
# 约定gid值是偶数添加到goods_1表,如果gid是奇数添加到goods_2表
spring.shardingsphere.sharding.tables.goods.table-strategy.inline.sharding-column=gid
spring.shardingsphere.sharding.tables.goods.table-strategy.inline.algorithm-expression=goods_$->{gid % 2 + 1}

# 打开sql输出日志
spring.shardingsphere.props.sql.show=true

4. 实体类、mapper接口、test启动类

实体类

package com.ws.shardingjdbcdemo.pojo;
import lombok.Data;
//@Data注解是lombok的注解,简化实体类编写,自动生成get/set以及toString等方法
@Data
public class Goods {
    private Long gid;
    private String gname;
    private Long userId;
    private String gstatus;
}

GoodsMapper接口

package com.example.reactboot.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.springframework.stereotype.Repository;

@Repository
public interface GoodsMapper extends BaseMapper<Goods> {

}

ShardingjdbcdemoApplicationTests 启动类

package com.example.reactboot;

import com.example.reactboot.mapper.GoodsMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ShardingjdbcdemoApplicationTests {

    @Autowired
    GoodsMapper goodsMapper;

    @Test
    void addGoods03() {
        for (int i = 0; i < 10; i++){
            Goods good = new Goods();
            good.setGname("小米手机" + (i+1));
            good.setUserId((i+1)+100L);
            good.setGstatus("已发布");
            goodsMapper.insert(good);
        }
    }

}

最终效果
成功实现了
user_id 为偶数 在1号库,为奇数 在2号库
gid 为偶数 在1号表,为奇数 在2号表
在这里插入图片描述

实操四:如何垂直分表

后续分享

实操五:如何垂直分库

后续分享

实操六:如何垂直分库分表

后续分享

实操七:读写分离

首先"主从复制 读写分离" 这两个是结合在一起来,却少了谁都无法提高数据库系统的性能和可靠性的。
主从复制:简单来说就是在主服务器上执行的语句,从服务器执行同样的语句,在主服务器上的操作在从服务器产生了同样的结果。(这部分是服务器之间的配置进行实现的)

只有主从复制做好了,读写分离才能进行

以下我把g1当成主数据库,g2当成从数据库
新增的数据全部去g1,查的时候只查g2

配置application.properties文件

重点配置

#========主从数据库声明部分========
#配置指定主从数据库(配置一个ms0对象。设置了主库和从库的变量)
spring.shardingsphere.sharding.master-slave-rules.ms0.master-data-source-name=g1
spring.shardingsphere.sharding.master-slave-rules.ms0.slave-data-source-names=g2
#========数据节点配置部分========
#设置数据节点
#也就是要访问的数据库及表的名称(在这里设置的为ms0里面库的goos表)
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=ms0.goods

完整配置

# 读写分离
# 配置Sharding-JDBC的分片策略
# 配置数据源,给数据源起名g1,g2...此处可配置多数据源
spring.shardingsphere.datasource.names=g1,g2

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password
spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g1.url=jdbc:mysql://localhost:3306/sharding_1?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g1.username=root
spring.shardingsphere.datasource.g1.password=root

# 配置数据源具体内容————————包含  连接池、驱动、地址、用户名、密码
# 只配置g2.type,g2.driver-class-name,g2.url,g2.username,g2.password
spring.shardingsphere.datasource.g2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g2.url=jdbc:mysql://localhost:3306/sharding_2?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g2.username=root
spring.shardingsphere.datasource.g2.password=root


#========主从数据库声明部分========
#配置指定主从数据库(配置一个ms0对象。设置了主库和从库的变量)
spring.shardingsphere.sharding.master-slave-rules.ms0.master-data-source-name=g1
spring.shardingsphere.sharding.master-slave-rules.ms0.slave-data-source-names=g2
#========数据节点配置部分========
#设置数据节点
#也就是要访问的数据库及表的名称(在这里设置的为ms0里面库的goos表)
spring.shardingsphere.sharding.tables.goods.actual-data-nodes=ms0.goods


# 指定goods表 主键gid 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.column=gid
### 设置主键生成策略 可选内置的 SNOWFLAKE(雪花算法)/UUID
##也可以自定义(实现ShardingKeyGenerator,并配置META-INF/services/org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator)
# 此处的 生成策略为 SNOWFLAKE
spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

# 指定表分片策略
spring.shardingsphere.sharding.tables.goods.table-strategy.inline.sharding-column=gid
spring.shardingsphere.sharding.tables.goods.table-strategy.inline.algorithm-expression=goods



# 打开sql输出日志
spring.shardingsphere.props.sql.show=true

实体类、mapper接口、test启动类

实体类

package com.ws.shardingjdbcdemo.pojo;
import lombok.Data;
//@Data注解是lombok的注解,简化实体类编写,自动生成get/set以及toString等方法
@Data
public class Goods {
    private Long gid;
    private String gname;
    private Long userId;
    private String gstatus;
}

GoodsMapper接口

package com.example.reactboot.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.springframework.stereotype.Repository;

@Repository
public interface GoodsMapper extends BaseMapper<Goods> {

}

ShardingjdbcdemoApplicationTests 启动类

package com.example.reactboot;

import com.example.reactboot.mapper.GoodsMapper;
import com.ws.shardingjdbcdemo.pojo.Goods;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ShardingjdbcdemoApplicationTests {

    @Autowired
    GoodsMapper goodsMapper;

    @Test
    void addGoods03() {
        for (int i = 0; i < 10; i++){
            Goods good = new Goods();
            good.setGname("小米手机" + (i+1));
            good.setUserId((i+1)+100L);
            good.setGstatus("已发布");
            goodsMapper.insert(good);
        }
    }

    @Test
    public void testGoods03(){
        QueryWrapper wrapper = new QueryWrapper<Goods>();
        wrapper.eq("gid", 666999L);
        Goods good = goodsMapper.selectOne(wrapper);
        System.out.println(good);
    }


}

测试新增操作的截图
可以发现全部指向了g1库去增加
在这里插入图片描述
测试查询的截图
可以发现查询去的库是 g2库
在这里插入图片描述

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值