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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 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
相关文章
|
8天前
|
Java 关系型数据库 MySQL
SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
通过详细的步骤和示例代码,您可以在 SpringBoot 项目中成功集成 Flink CDC,并实时追踪 MySQL 数据库的变动。
94 43
|
24天前
|
安全 druid Java
Java 访问数据库的奇妙之旅
本文介绍了Java访问数据库的几种常见方式
44 12
|
2月前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
111 1
|
2月前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
79 5
|
3月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
101 6
|
3月前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
79 8
|
3月前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
96 9
|
3月前
|
Java API Apache
|
4月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
355 0
在Java中处理JSON数据:Jackson与Gson库比较
|
4月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
631 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库