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. 步骤说明
- 创建数据库 sharding
- 在sharding中创建表goods_1、goods_2
- 约定规则: 添加数据时
商品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. 步骤说明
- 创建数据库 sharding_1、sharding_2
- 在sharding_1、sharding_2中创建表goods
- 约定规则: 添加数据时
用户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. 步骤说明
- 创建数据库 sharding_1、sharding_2
- 在sharding_1、sharding_2中都创建表goods_1、goods_2
- 约定规则: 添加数据时
用户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库