java springboot mysql shardingsphere 分库分表 上 (单库分表)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: java springboot mysql shardingsphere 分库分表 上 (单库分表)

1、主要技术

本文主要采用SpringBoot + MyBatisPlus + sharding-jdbc技术

实现:单库分表 、分库分表 水平拆分

数据库:sharding0、sharding1

表:emp0、emp1

2、数据库脚本

# 数据库自行创建
CREATE TABLE `emp0` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `empno` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `empname` varchar(20) NOT NULL DEFAULT '',
  `job` varchar(9) NOT NULL DEFAULT '',
  `mgr` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `hiredate` datetime NOT NULL,
  `sal` decimal(7,2) NOT NULL,
  `comn` decimal(7,2) NOT NULL,
  `depno` mediumint(8) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6000091 DEFAULT CHARSET=utf8;
CREATE TABLE `emp1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `empno` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `empname` varchar(20) NOT NULL DEFAULT '',
  `job` varchar(9) NOT NULL DEFAULT '',
  `mgr` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `hiredate` datetime NOT NULL,
  `sal` decimal(7,2) NOT NULL,
  `comn` decimal(7,2) NOT NULL,
  `depno` mediumint(8) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6000091 DEFAULT CHARSET=utf8;

3、引入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.20</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>4.0.0-RC1</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>3.0.5</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

4、单库分表

4.1、yaml文件

server:
  port: 7070
spring:
  application:
    name: shadingsphere-name
  main:
    # 一个实体类对应两张表,覆盖 否则会报错
    allow-bean-definition-overriding: true
  shardingsphere:
    #配置数据源
    datasource:
      names: m1
      m1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/sharding0?serverTimezone=GMT%2B8
        username: root
        password: wuzhenyong1207
    sharding:
      tables:
        # 表名
        emp:
          # 配置表在哪个数据库里面 m1.emp0 ,m1.emp1
          actual-data-nodes: m1.emp$->{0..1}
          # 生成ID
          key-generator:
            column: id
            # 自定义主键生成类型  官网有两种:UUID, SNOWFLAKE 雪花算法
            type: SIMPLE
          # 指定分片策略
          table-strategy:
            inline:
              sharding-column: id
              algorithm-expression: emp$->{id %2}
    props:
      # 开启sql日志
      sql:
        show: true

4.2、自定义主键生成策略

说明:因为数据库是自增,所以采用自定义主键生成策略

实际请项目请自行实现自增策略,否则会出现id重复问题,本文只是演示

/**
 * 自定义主键生成策略
 *
 * @author wuzhenyong
 * @date 2022/05/26
 */
public class SimpleShardingKeyGenerator implements ShardingKeyGenerator {
    private AtomicLong atomic = new AtomicLong(0);
    @Getter
    @Setter
    private Properties properties = new Properties();
    @Override
    public Comparable<?> generateKey() {
        return atomic.incrementAndGet();
    }
    @Override
    public String getType() {
      // 类型名称
        return "SIMPLE";
    }
}

4.3、spi机制

在resources文件夹下新建

META-INF/services/

org.apache.shardingsphere.spi.keygen.ShardingKeyGenerator 文件

文件内容为:自定义主键生成策略所在包路径.SimpleShardingKeyGenerator

28cf6f3984e04988a8571c705a751c72[0].png

4.4、新建实体类、mapper层、controller层

4.4.1、实体类
@TableName("emp")
@Data
public class EmpEntity {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private Integer empno;
    private String empname;
    private String job;
    private String mgr;
    private LocalDateTime hiredate;
    private BigDecimal sal;
    private BigDecimal comn;
    private String depno;
}
4.4.2、mapper
@Mapper
public interface EmpMapper extends BaseMapper<EmpEntity>{
}
4.4.3、controller
/**
 * @author wuzhenyong
 * ClassName:EmpController.java
 * date:2022-05-26 10:56
 * Description:
 */
@RestController
@RequestMapping("/emp")
@AllArgsConstructor
public class EmpController {
    private final EmpMapper empMapper;
    @GetMapping("/save")
    public String save() {
        for (int i = 0; i < 20; i++) {
            String value = String.valueOf(i);
            EmpEntity entity = new EmpEntity();
            entity.setEmpno(value);
            entity.setEmpname(value);
            entity.setJob(value);
            entity.setMgr(value);
            entity.setHiredate(LocalDateTime.now());
            entity.setSal(new BigDecimal(value));
            entity.setComn(new BigDecimal(value));
            entity.setDepno(value);
            empMapper.insert(entity);
        }
        return "添加成功";
    }
    @GetMapping("/list")
    public List<EmpEntity> list() {
        List<EmpEntity> empEntities = empMapper.selectList(new QueryWrapper<EmpEntity>()
                .lambda()
                .orderByDesc(EmpEntity::getId));
        return empEntities;
    }
    @GetMapping("/update/{id}")
    public String update(@PathVariable Integer id) {
        EmpEntity entity = empMapper.selectById(id);
        entity.setHiredate(LocalDateTime.now());
        empMapper.updateById(entity);
        return "更新成功";
    }
}

4.5、测试运行

4.5.1运行保存方法

控制台日志,日志太长了显示不全

2d3a016e4d1b47ec849f046517663b3e.png

4.5.2查看表数据

emp0表

c144d8debe984e57b5eee3be13afb76c.png

emp1表

3de1a3d1b9bf47718a93ff2c32dff0a2.png

5、分库分表请看下文

点我:java springboot mysql shardingsphere 分库分表 下 (分库分表)

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
Java 开发者 Spring
Java Springboot监听事件和处理事件
通过这些内容的详细介绍和实例解析,希望能帮助您深入理解Spring Boot中的事件机制,并在实际开发中灵活应用,提高系统的可维护性和扩展性。
20 7
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
58 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
21天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
104 13
|
29天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
58 5
|
2月前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
61 8
|
2月前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
68 9
|
3月前
|
JavaScript 前端开发 Java
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
这篇文章详细介绍了如何在前端Vue项目和后端Spring Boot项目中通过多种方式解决跨域问题。
410 1
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
|
2月前
|
监控 前端开发 Java
Java SpringBoot –性能分析与调优
Java SpringBoot –性能分析与调优
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。