SpringBoot+Sharding-jdbc+mybatis-plus实现水平分表

这篇具有很好参考价值的文章主要介绍了SpringBoot+Sharding-jdbc+mybatis-plus实现水平分表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 一:先准备数据库表

CREATE TABLE car_info_1(
    id BIGINT PRIMARY KEY COMMENT '主键',
    brand VARCHAR(50) DEFAULT '' COMMENT '汽车品牌',
    model VARCHAR(50) DEFAULT '' COMMENT '汽车型号',
    production_year INT(4) DEFAULT NULL COMMENT '生产年份',
    price DECIMAL(10, 2) DEFAULT NULL COMMENT '汽车价格'
) ENGINE = Innodb DEFAULT CHARSET = utf8 COMMENT '汽车信息表1';

CREATE TABLE car_info_2(
    id BIGINT PRIMARY KEY COMMENT '主键',
    brand VARCHAR(50) DEFAULT '' COMMENT '汽车品牌',
    model VARCHAR(50) DEFAULT '' COMMENT '汽车型号',
    production_year INT(4) DEFAULT NULL COMMENT '生产年份',
    price DECIMAL(10, 2) DEFAULT NULL COMMENT '汽车价格'
) ENGINE = Innodb DEFAULT CHARSET = utf8 COMMENT '汽车信息表2';

CREATE TABLE products_1(
    id BIGINT PRIMARY KEY COMMENT '主键',
    name VARCHAR(50) DEFAULT '' COMMENT '商品名称',
    price DECIMAL(10, 2) DEFAULT NULL COMMENT '商品价格',
    description VARCHAR(100) DEFAULT '' COMMENT '商品描述',
    category VARCHAR(20) DEFAULT '' COMMENT '商品类别'
) ENGINE = Innodb DEFAULT CHARSET = utf8 COMMENT '商品信息表1';

CREATE TABLE products_2(
    id BIGINT PRIMARY KEY COMMENT '主键',
    name VARCHAR(50) DEFAULT '' COMMENT '商品名称',
    price DECIMAL(10, 2) DEFAULT NULL COMMENT '商品价格',
    description VARCHAR(100) DEFAULT '' COMMENT '商品描述',
    category VARCHAR(20) DEFAULT '' COMMENT '商品类别'
) ENGINE = Innodb DEFAULT CHARSET = utf8 COMMENT '商品信息表2';

二:创建项目并编写相关代码

1: 创建springboot项目,引入相应依赖

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.14</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.xyz</groupId>
    <artifactId>springboot-mp-fk-fb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-mp-fk-fb</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>

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

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.11</version>
        </dependency>

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

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.20</version>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2: 编写配置文件

# 服务端口号
server.port=9999

# Mybatis-plus相关的配置
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

#---------------------------------水平分表的配置---------------------------------
# 配置数据源别名
spring.shardingsphere.datasource.names=m1

# 配置具体的数据源(连接池,驱动,数据库地址,用户名,密码)
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://127.0.0.1:3306/xxxx?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.shardingsphere.datasource.m1.username=xxxx
spring.shardingsphere.datasource.m1.password=xxxx

# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true
# 配置sharding-jdbc分片策略
# 指定数据库car_info表的主键以及主键的生成策略
spring.shardingsphere.sharding.tables.car_info.key-generator.column=id
spring.shardingsphere.sharding.tables.car_info.key-generator.type=SNOWFLAKE
# 指定数据库products表的主键以及主键的生成策略
spring.shardingsphere.sharding.tables.products.key-generator.column=id
spring.shardingsphere.sharding.tables.products.key-generator.type=SNOWFLAKE

# 指定car_info表分布情况,配置表在那个数据库里面,表名称是什么  m1.car_info_1, m1.car_info_2
spring.shardingsphere.sharding.tables.car_info.actual-data-nodes=m1.car_info_$->{1..2}
# 指定products表分布情况
spring.shardingsphere.sharding.tables.products.actual-data-nodes=m1.products_$->{1..2}

# 指定表的分片策略:约束主键id为偶数时添加到car_info_1表中,主键id为奇数时添加到car_info_2表中
spring.shardingsphere.sharding.tables.car_info.table-strategy.inline.sharding-column=id
# 选择数据库表的规则
spring.shardingsphere.sharding.tables.car_info.table-strategy.inline.algorithm-expression=car_info_$->{id % 2 + 1}
# 指定表的分片策略:约束主键id为偶数时添加到products_1表中,主键id为奇数时添加到products_2表中
spring.shardingsphere.sharding.tables.products.table-strategy.inline.sharding-column=id
# 选择数据库表的规则
spring.shardingsphere.sharding.tables.products.table-strategy.inline.algorithm-expression=products_$->{id % 2 + 1}

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









3: 编写相关业务代码

@Data
public class CarInfo {

    private Long id;

    /**
     * 汽车品牌
     */
    private String brand;

    /**
     * 汽车型号
     */
    private String model;

    /**
     * 生产年份
     */
    private Integer productionYear;

    /**
     * 汽车价格
     */
    private BigDecimal price;

}
@Data
public class Products {

    private Long id;

    /**
     * 商品名称
     */
    private String name;

    /**
     * 商品价格
     */
    private BigDecimal price;

    /**
     * 商品描述
     */
    private String description;

    /**
     * 商品类别
     */
    private String category;

}

@Mapper
public interface CarInfoMapper extends BaseMapper<CarInfo> {
}
@Mapper
public interface ProductsMapper extends BaseMapper<Products> {
}

@RestController
@RequestMapping(value = "/test")
public class TestController {


    @Resource
    private CarInfoMapper carInfoMapper;

    @Resource
    private ProductsMapper productsMapper;


    /**
     * 同一个数据库-水平分表添加数据
     * @author
     * @date 2023/8/18 00:37:20
     */
    @PostMapping(value = "/saveCarInfo")
    public String saveCarInfo(@RequestBody CarInfo carInfo) {
        carInfoMapper.insert(carInfo);
        return "汽车信息添加成功";
    }


    /**
     * 同一个数据库-水平分表添加数据
     * @author
     * @date 2023/8/18 00:37:20
     */
    @PostMapping(value = "/saveProducts")
    public String saveProducts(@RequestBody Products products) {
        productsMapper.insert(products);
        return "商品信息添加成功";
    }


    /**
     * 同一个数据库-水平分表更新数据
     * @author
     * @date 2023/8/18 00:37:20
     */
    @PostMapping(value = "/updateCarInfo")
    public String updateCarInfo(@RequestBody CarInfo carInfo) {
        carInfoMapper.updateById(carInfo);
        return "汽车信息更新成功";
    }


    /**
     * 同一个数据库-水平分表查询数据
     * @author
     * @date 2023/8/18 00:37:20
     */
    @GetMapping(value = "/selectCarInfo")
    public List<CarInfo> selectCarInfo() {
        QueryWrapper<CarInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByAsc("id");
        return carInfoMapper.selectList(queryWrapper);
    }


    /**
     * 同一个数据库-水平分表删除数据
     * @author
     * @date 2023/8/18 00:37:20
     */
    @DeleteMapping(value = "/deleteCarInfo")
    public String deleteCarInfo(@RequestParam Long id) {
        carInfoMapper.deleteById(id);
        return "汽车信息删除成功";
    }

4: 测试相关接口

这块我就不演示了文章来源地址https://www.toymoban.com/news/detail-656602.html

到了这里,关于SpringBoot+Sharding-jdbc+mybatis-plus实现水平分表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一、Sharding-JDBC系列01:整合SpringBoot实现分库分表,读写分离

    目录 一、概述 二、案例演示-水平分表 (1)、创建springboot工程 (2)、创建数据库和数据表 (3)、application.yaml配置分片规则   (4)、测试数据插入、查询操作 4.1、插入-控制台SQL日志  4.2、查询-控制台SQL日志  三、案例演示-水平分库 (1)、创建数据库和数据表  (2)、application.yaml配置

    2024年02月02日
    浏览(45)
  • springboot第55集:思维导图Sharding-JDBC,事务,微服务分布式架构周刊

    事务定义 在数据库管理系统中,事务是单个逻辑或工作单元,有时由多个操作组成,在数据库中以一致模式完成的逻辑处理称为事务。一个例子是从一个银行账户转账到另一个账户:完整的交易需要减去从一个账户转账的金额,然后将相同的金额添加到另一个账户。 事务特

    2024年02月19日
    浏览(42)
  • Sharding-JDBC概述

    ​ 随着业务数据量的增加,原来所有的数据都是在一个数据库上的,网络IO及文件IO都集中在一个数据库上的,因此CPU、内存、文件IO、网络IO都可能会成为系统瓶颈。 当业务系统的数据容量接近或超过单台服务器的容量、QPS/TPS接近或超过单个数据库实例的处理极限等,此时

    2024年02月13日
    浏览(34)
  • Sharding-JDBC分库连接数优化

    一、背景 配运平台组的快递订单履约中心(cp-eofc)及物流平台履约中心(jdl-uep-ofc)系统都使用了ShardingSphere生态的sharding-jdbc作为分库分表中间件, 整个集群采用只分库不分表的设计,共16个MYSQL实例,每个实例有32个库,集群共512个库. 当每增加一台客户端主机,一个MYSQl实例最少要增加

    2024年02月14日
    浏览(36)
  • Mysql Sharding-JDBC读写分离

    深入Sharding-JDBC分库分表从入门到精通【黑马程序员】_哔哩哔哩_bilibili 1.1.1 msyql 多库 多表 多服务器  1.1.2 通过Sharding-JDBC jar包-增强JDBC 访问多数据源 - 自动处理成一个数据源 1.1.3 使用数据的人 - 使用Sharding-JDBC 自动合成的数据源 - 如同 一库一表操作   1.3.0 课程视频 07-Shard

    2024年02月02日
    浏览(33)
  • 若依框架集成sharding-jdbc

    本文基于4.X版本开发 官方网站 定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。 适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spri

    2024年02月08日
    浏览(94)
  • sharding-jdbc多数据源配置

    通过sharding-jdbc做分表这里就不多做介绍了,需要的可以看上一片文章 当项目中配置了多数据源,并且其中一个数据源需要使用sharding-jdbc分表时,配置如下 导入shardingjdbc依赖 这里使用的是4.0.1的配置,和上篇的3.1.0差别不大,详细配置大伙可以上官网查阅。 多数据源配置类

    2024年02月14日
    浏览(49)
  • Sharding-JDBC之PreciseShardingAlgorithm(精确分片算法)

      在我之前的文章里,数据的分库分表都是基于行表达式的方式来实现的,看起来也蛮好用,也挺简单的,但是有时会有些复杂的规则,可能使用行表达式策略会很复杂或者实现不了,我们就讲另外一种分片策略,精确分片算法,通常用来处理=或者in条件的情况比较多。

    2024年02月11日
    浏览(45)
  • Sharding-JDBC分库分表四种分片算法

    精确分片算法(PreciseShardingAlgorithm)精确分片算法(=与IN语句),用于处理使用单一键作为分片键的=与IN进行分片的场景。需要配合StandardShardingStrategy使用 范围分片算法(RangeShardingAlgorithm)用于处理使用单一键作为分片键的BETWEEN AND进行分片的场景。需要配合StandardShardingS

    2024年02月10日
    浏览(38)
  • Sharding-JDBC分库分表-自动配置与分片规则加载原理-3

    Sharding JDBC自动配置的原理 与所有starter一样,shardingsphere-jdbc-core-spring-boot-starter也是通过SPI自动配置的原理实现分库分表配置加载,spring.factories文件中的自动配置类shardingsphere-jdbc-core-spring-boot-starter功不可没,他主要是自动创建了模式bean、事务类型bean和数据源bean,配置加载

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包