目录

  • 数据库的水平分表
  • 需求说明
  • 数据库表创建
  • 编写程序
    • 引入 `maven` 依赖
    • 实体类
    • `dao` 层
      • `Mapper` 接口
      • `Mapper.xml`
    • `Service` 层
    • `Controller` 层
    • `application.properties` 文件
  • 接口测试
    • 数据插入测试
      • 主键 `order_id` 为奇数
      • 主键 `order_id` 为偶数
    • 数据查询测试

数据库的水平分表

关于水平分表可以参考文章:https://blog.csdn.net/weixin_38192427/article/details/122441366

需求说明

创建两张表 t_order_1t_order_2,这两张表是订单表水平拆分后的表,通过 Sharding-JDBC 向订单表插入数据, 按照一定的分片规则,主键为偶数的进入 t_order_1,主键为奇数进入 t_order_2,通过 Sharding-JDBC 查询数据,根据 SQL 语句的内容从 t_order_1t_order_2 查询数据

数据库表创建

创建订单库 order_db,然后在 order_db 中创建 t_order_1、t_order_2 表,可以看到两张表的列是完全相同的,这就是水平分表

CREATE TABLE `t_order_1` (`order_id` int(11) NOT NULL COMMENT '订单id',`price` decimal(10,2) NOT NULL COMMENT '订单价格',`user_id` int(11) NOT NULL COMMENT '下单用户id',`status` varchar(50) CHARACTER SET utf8mb4 NOT NULL COMMENT '订单状态',PRIMARY KEY (`order_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;CREATE TABLE `t_order_2` (`order_id` int(11) NOT NULL COMMENT '订单id',`price` decimal(10,2) NOT NULL COMMENT '订单价格',`user_id` int(11) NOT NULL COMMENT '下单用户id',`status` varchar(50) CHARACTER SET utf8mb4 NOT NULL COMMENT '订单状态',PRIMARY KEY (`order_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

编写程序

引入 maven 依赖

主要依赖如下,其它依赖自行引入

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version>
</dependency>

实体类

@Data
public class Order implements Serializable {@NotNull(message = "参数orderId不能为空")private Integer orderId;@NotNull(message = "参数price不能为空")private BigDecimal price;@NotNull(message = "参数userId不能为空")private Integer userId;@NotBlank(message = "参数status不能为空")private String status;
}

dao

Mapper 接口

@Mapper
public interface OrderMapper {int insertOrder(Order order);List<Order> findOrderByIds(List<Integer> orderIds);
}

Mapper.xml

<insert id="insertOrder" parameterType="org.example.pojo.Order">insert into t_order(order_id, price, user_id, status)values (#{orderId,jdbcType=INTEGER}, #{price,jdbcType=DECIMAL}, #{userId,jdbcType=INTEGER},#{status,jdbcType=VARCHAR})
</insert><select id="findOrderByIds" parameterType="java.util.List" resultType="org.example.pojo.Order">select<include refid="Base_Column_List"></include>from t_order AS twhere t.order_id in<foreach collection="list" item="id" open="(" separator="," close=")">#{id}</foreach>
</select>
  • 注意 SQL 语句的写法,抽象表名是 t_order,并不是具体的 t_order_1t_order_2

Service

@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderMapper orderMapper;@Overridepublic int insertOrder(Order order) {return orderMapper.insertOrder(order);}@Overridepublic List<Order> getOrderByIds(List<Integer> orderIds) {return orderMapper.findOrderByIds(orderIds);}
}

Controller

@Controller
@RequestMapping(path = "/order")
public class OrderController {@Autowiredprivate OrderService orderService;@PostMapping(path = "/addOrder")@ResponseBodypublic ResultMap addOrder(@Valid Order order, @NotNull BindingResult bindingResult) {// 参数校验if (bindingResult.hasErrors()) {String message = bindingResult.getFieldError().getDefaultMessage();return new ResultMap().fail().message(message);}int i = orderService.insertOrder(order);if (i > 0) {return new ResultMap().success().message("成功");}return new ResultMap().fail().message("失败");}@GetMapping(path = "/getOrder")@ResponseBodypublic ResultMap getOrder(@NotNull @RequestBody List<Integer> orderIds) {if (orderIds.isEmpty()) {return new ResultMap().fail().message("参数orderIds不能为空");}List<Order> orderList = orderService.getOrderByIds(orderIds);if (orderList.isEmpty()) {return new ResultMap().fail().message("没有查询到你想要的数据");}return new ResultMap().success().data(orderList).message("查询成功");}
}

application.properties 文件

server.port=8080# sharding-jdbc分片规则配置开始---------------------------------------------------------------
# 自定义数据源名称为 m1
spring.shardingsphere.datasource.names=m1
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.m1.url=jdbc:mysql://127.0.0.1:3306/order_db?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=UTC
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=123456
# 指定表的数据分布情况,其中t_order可以自定义,配置数据节点 m1.t_order_1 和 m1.t_order_2
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=m1.t_order_$->{1..2}
# 指定t_order表的主键是order_id,主键生成策略为SNOWFLAKE,SNOWFLAKE是一种分布式自增算法,保证id全局唯一
spring.shardingsphere.sharding.tables.t_order.key-generator.column=order_id
spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE
# 指定t_order表的分片策略,分片策略包括分片键和分片算法
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
# order_id为偶数的数据落在t_order_1,为奇数的落在t_order_2,分表策略的表达式为t_order_$->{order_id % 2 + 1}
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{order_id % 2 + 1}
# 打开sql输出日志
spring.shardingsphere.props.sql.show=true
# sharding-jdbc分片规则配置结束---------------------------------------------------------------# 指定 mapper 文件路径
mybatis.mapper-locations=cldasspath:com/example/mapper/*.xml
mybatis.configuration.cache-enabled=true
# 开启驼峰命名
mybatis.configuration.map-underscore-to-camel-case=true
  • 更多详细的配置文档说明:https://shardingsphere.apache.org/document/legacy/3.x/document/cn/manual/sharding-jdbc/configuration/config-spring-boot/

接口测试

数据插入测试

主键 order_id 为奇数

启动项目,使用 postman 测试接口 http://localhost:8080/order/addOrder,结果如下


由于传入的参数 orderId1 是奇数,数据应该落在 t_order_2 表中,如下


再来看看 t_order_1 表中的数据依然是空

主键 order_id 为偶数

使用 postman 再次测试接口 http://localhost:8080/order/addOrder,结果如下


由于传入的参数 orderId2 是偶数,数据应该落在 t_order_1 表中,如下


再来看看 t_order_2 表中的数据依然是上一次插入的数据

数据查询测试

启动项目,使用 postman 测试接口 http://localhost:8080/order/getOrder,传入的参数 orderIds[1,2] 的数组,进行批量查询,结果如下


在看看控制台 SQL 日志,如下

  • 可以看看,SQL 语句分别在 t_order_1t_order_2 表中进行了查询

SpringBoot整合Sharding-JDBC实现水平分表相关推荐

  1. Sharding-JDBC水平分表详细教程

    标签:postgresq   shm   utf8mb4   如何   template   表达式   otc   tables   code 介绍: Sharding-JDBC,定位为轻量级Jav ...

  2. 2、ShardingSphere 之 Sharding-JDBC实现水平分表

    文章目录 1 Sharding-JDBC简介 2 Sharding-JDBC 3 Sharding-JDBC实现水平分表 3.1 搭建环境 3.1.1 总体概览 3.1.2 创建SpringBoot工 ...

  3. ShardingSphere(二) 水平分表配置搭建,实现分表写入读取

    概述:本章内容分将搭建一个ShardingSphere工程环境,并实现最简单的单库下的水平分表配置演示.通过解读配置文件我们来了解ShardingSphere中是如何实现他的路由操作. 环境:Spri ...

  4. 水平分表、分库和垂直分表、分库和公共表的代码实现和讲解

    文章目录 一.教学讲解视频 二.环境准备 三.水平分表 1.概念 2.代码 四.水平分库 1.概念 2.代码 五.垂直分表 1.概念 2.代码 六.垂直分库 1.概念 2.代码 七.公共表 1.概念 ...

  5. 使用sharding-jdbc实现水平分库+水平分表

    前面的文章使用sharding-jdbc实现水平分表中详细记录了如何使用sharding-jdbc实现水平分表,即根据相应的策略,将一部分数据存入到表1中,一部分数据存入到表2中,逻辑上为同一张表,分 ...

  6. 数据库--分库分表--垂直分表与水平分表

    原文网址:数据库--分库分表--垂直分表与水平分表_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍数据库的分库分表的方案:垂直分表与水平分表. 关系型数据库本身比较容易成为系统瓶颈,单机存储容 ...

  7. Sharding-JDBC水平分表(分片策略)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记008

    上一节我们实现了,水平分表的,环境的搭建,做了一个项目springboot的,然后创建了数据库,然后我们再去做 我们去配置sharding-jdbc的分片策略去. 我们可以去官网,点击了解更多 然后我 ...

  8. mycat的主从关系 垂直分库 水平分表 以及mycat分片联表查询的配置详解(mysql5.7系列)

    主从关系 准备三台不同ip的虚拟机 (第一批)主从关系的配置 主192.168.47.131 配置/etc/my.cnf,在[mysqld]下配置 log-error=/var/log/mysqld. ...

  9. MYSQL实现水平分表

    mysql水平分表 本人主要以Navicat实现,具体想要高端点,可以用Sharing JDBC.Mycat去实现 水平分表 mysql水平分表 分库分表原理是什么? 为什么要分库分表? 二.水平分表 ...

  10. mysql使用MRG_MyISAM(MERGE)实现水平分表

    来源:http://m.oschina.net/blog/382658 在MySql中数据的优化尤其是大数据量的优化是一门很大的学问,当然其它数据库也是如此,即使你不是DBA,做为一名程序员掌握一些基 ...

最新文章

  1. Selenium3.X 与 Javascript (Nodejs)
  2. Algorithms_入门基础_如何使用最高效的方式来判断一个数是否是2的N次方
  3. Earth Mover's Distance (EMD)距离
  4. 利用Azure communication service实现跟Teams同样等级的沟通协作应用
  5. 单片机c语言出租车计时程序,基于单片机出租车计价器课题设计c语言编写(样例3)...
  6. 【C语言】在线OJ题 BC7-BC52-牛客网编程初学者入门训练
  7. 使用HslCommunication实现PLC数据的远程客户端监视,以及web端实时监视,远程操作设备示例...
  8. APICS与AX的Master Planning(一)--Phantom bill of Material 虚项
  9. 基于SSM框架之众筹网站项目
  10. AnimMontage(中文翻译)——UE4官方文档
  11. 《当程序员的那些狗日日子》三
  12. 量子计算机王,王正汉|量子计算机:下一轮工业革命的引擎
  13. 人全外显子组测序WES学习笔记 第一天
  14. 在哪里设置自动锁定计算机,教你电脑锁屏怎么设置,让电脑自动锁屏
  15. vuex中辅助函数写法
  16. MacBook远程桌面Windows使用Microsoft Remote Desktop for Mac_亲测使用
  17. 工作一年的收获与思考
  18. FileLock——Java文件锁
  19. python做地图热力图保存为png_Python如何实现热力图?可视化入库图实战演示
  20. OPENCV+VS2008+SQLserver图片存储数据库开发

热门文章

  1. 阿里云云计算:4 阿里云产品架构
  2. 引导页onboarding页面Snapkit实现
  3. iOS 13问题记录
  4. 多头注意力比单头好在哪?
  5. 8月7日晚八点分享-推荐系统面试/概览
  6. python 安装impala包
  7. a minimal solution(30,31,32)
  8. a ppt of CRF
  9. Scala学习数组/映射/元组
  10. 403. Frog Jump