目录

  • 前言
  • 代码
    • 环境
    • 依赖
    • 配置文件
    • 创建数据库和表
    • 实体
  • 测试
  • 代码仓库

前言

sharding-jdbc 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。


提供了 4 中配置方式:

  • JAVA API
  • Yaml
  • SpringBoot
  • Spring 命名空间(xml 配置文件)

代码

环境

jdk8,maven3.3.9,mysql5.7,springboot2.5.0

依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.6.5</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

配置文件

server:port: 8080tomcat:uri-encoding: utf-8servlet:encoding:charset: UTF-8logging:level:com.jcl.sharing: infospring:application:name: sharing-jdbc-samplejackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8# 仅包含非空的属性值default-property-inclusion: non_null# sharding 配置shardingsphere:datasource:names: ds0,ds1ds0:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://localhost:3306/sharding-order?serverTimezone=Asia/Shanghai&useSSL=true&characterEncoding=utf8username: rootpassword: 123456ds1:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://192.168.1.6:3306/shard-order?serverTimezone=Asia/Shanghai&useSSL=true&characterEncoding=utf8username: rootpassword: 123456sharding:# 分片表配置tables:# 逻辑表名# 下面的没有自动提示,可以点击配置属性,会跳转到具体的自动配置文件中# 然后就会看到源码对应的配置类是什么,就知道有哪些属性可以配置了# 比如 org.apache.shardingsphere.core.yaml.config.sharding.YamlTableRuleConfigurationt_order:# 实际节点actual-data-nodes: ds$->{0..1}.t_order_$->{1..2}# 数据库分片策略database-strategy:inline:sharding-column: user_idalgorithm-expression: ds$->{user_id % 2}# 表分片策略# 由于 雪花 ID 是一个 long 类型的,所以可以使用行内表达式table-strategy:inline:sharding-column: idalgorithm-expression: t_order_$->{id % 2 + 1}# 主键生成策略
#          key-generator:#            column: id#            type: SNOWFLAKE#            worker.id: 100# 打印 sharding 的 sql 信息props:sql.show: true
mybatis:configuration:map-underscore-to-camel-case: true# 打印sqllog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: /mapper/*.xml

创建数据库和表

分别在两个 mysql 中创建数据库

  1. 名称:sharding-order、shard-order
  2. 编码:utf8mb4
CREATE TABLE `t_order_1` (`id` int(11) NOT NULL,`order_amount` decimal(10,2) NOT NULL COMMENT '订单金额',`order_status` int(1) NOT NULL COMMENT '订单状态',`user_id` int(11) NOT NULL COMMENT '用户 iD',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
01:
sharding-ordert_order_1t_order_202:
shard-ordert_order_1t_order_2

我们的需求如下:

  1. 数据库切分:使用 user_id 取模,偶数分到 01,奇数分到 02 上
  2. 表切分:再用 ID 取模,偶数分到 t_order_1,奇数分到 t_order_2 中

实体

import java.math.BigDecimal;public class Order {private Integer id;private BigDecimal orderAmount;private Integer orderStatus;private Integer userId;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public BigDecimal getOrderAmount() {return orderAmount;}public void setOrderAmount(BigDecimal orderAmount) {this.orderAmount = orderAmount;}public Integer getOrderStatus() {return orderStatus;}public void setOrderStatus(Integer orderStatus) {this.orderStatus = orderStatus;}public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}
}

dao

package com.jcl.sharing.mapper;import com.jcl.sharing.bean.Order;
import com.jcl.sharing.bean.OrderExample;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface OrderMapper {int deleteByPrimaryKey(Integer id);int insert(Order record);Order selectByPrimaryKey(Integer id);
}

测试

import com.jcl.sharing.bean.Order;
import com.jcl.sharing.bean.OrderExample;
import com.jcl.sharing.mapper.OrderMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.math.BigDecimal;
import java.util.List;@SpringBootTest
class SharingJdbcSampleApplicationTests {@Autowiredprivate OrderMapper orderMapper;@Testvoid contextLoads() {Order order = new Order();// 数据库:userId 偶数分到 sharding-order,奇数分到 shard-orderorder.setUserId(20);// 表:id 偶数分到 t_order_1, 奇数分到 t_order_2order.setId(2);order.setOrderAmount(BigDecimal.TEN);order.setOrderStatus(1);orderMapper.insertSelective(order);}@Testpublic void testSelectOrder() {OrderExample example = new OrderExample();example.createCriteria().andIdEqualTo(2).andUserIdEqualTo(20);List<Order> orders = orderMapper.selectByExample(example);for (Order order : orders) {System.err.println("id=" + order.getId() + " , userId=" + order.getUserId());}}
}

根据我们上面的策略来看,这条语句期望是插入到:sharding-order.t_order_1 中

下面的查询结果为:

==>  Preparing: select id, order_amount, order_status, user_id from t_order WHERE ( id = ? and user_id = ? )
==> Parameters: 2(Integer), 20(Integer)
<==    Columns: id, order_amount, order_status, user_id
<==        Row: 2, 10.00, 1, 20
<==      Total: 1# 上面是 mybatis 的打印信息
# 下面的是我们自己打印的信息
id=2 , userId=20

代码仓库

https://gitee.com/thirtyleo/java_training_ground/tree/master/sharing-jdbc-sample

未完待续。。。

如果有问题可在评论区回复,作者会收到通知的!

Sharding-JDBC简单使用相关推荐

  1. Spring boot + Sharding JDBC 分库分表 及 分布式事务处理

    Sharding JDBC 基础概念 Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC.Proxy 和 Sidecar(规划中)这 3 款既能够 ...

  2. 理解Sharding jdbc原理,看这一篇就够了

    相比于Spring基于AbstractRoutingDataSource实现的分库分表功能,Sharding jdbc在单库单表扩展到多库多表时,兼容性方面表现的更好一点.例如,spring实现的分库 ...

  3. Sharding JDBC分片和读写分离详解

    目录 Sharding Sphere简介 开始使用Sharding JDBC 数据分片 简单示例 Spring Boot示例 代码分析 属性分析 绑定表和广播表 真实表 绑定表 广播表 Shardin ...

  4. Spring boot项目集成Sharding Jdbc

    环境 jdk:1.8 framework: spring boot, sharding jdbc database: MySQL 搭建步骤 在pom 中加入sharding 依赖 <depend ...

  5. Sharding JDBC(四) 分片策略一:标准分片策略StandardShardingStrategy

    目录 一.标准分片策略StandardShardingStrategy 二.StandardShardingStrategy配置实现 分库分表最核心的两点SQL 路由  . SQL 改写 applic ...

  6. sharding jdbc 的雪花算法中的属性worker.id和max.vibration.offset

    雪花算法生成的id总共64位8个字节,结构如下: 符号位 时间位 工作机器标识位 序列位 1位(固定位0) 41位 10位 12位 worker.id sharding jdbc  4.1.1使用雪花 ...

  7. 【MySQL 读写分离】Sharding JDBC + Spring boot 实现数据库读写分离的登录 Demo

    上篇文章我们搭建了 MySQL 数据库主从复制集群 MySQL 搭建主从复制集群~~~ 本篇文章我们利用搭建好的主从复制集群,使用 SpringBoot 结合 Sharding-JDBC 搭建一个小的 ...

  8. SSM项目引入sharding JDBC进行分表

    SSM项目引入sharding JDBC进行分表 注意点: 本次集成sharing-jdbc 4.1.1,由于各个版本差别比较大,配置方式差别也特别大,请根据官方文档进行配置! 官方配置路径:http ...

  9. SpringBoot + Sharding JDBC,一文搞定分库分表、读写分离

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 30 分钟. 来自:blog.csdn.net/qq_40378034/article/details/115264837 S ...

  10. SpringBoot + Sharding JDBC 读写分离、分库分表

    Sharding-JDBC 最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为 ShardingSphere,20 ...

最新文章

  1. 关于正则表达式 \1 \2之类的问题
  2. DropBox免费扩容到10G了
  3. Git 忽略一些文件不加入版本控制
  4. JavaScript css-dom
  5. Codeforces Round #530 Div. 1 自闭记
  6. 公司java框架让程序员变笨_框架会使程序员变笨吗?
  7. 如何证明CPU缓存行cacheline的存在?
  8. python游戏房间_Python House冒险-如果已经进入一个房间,如何给出不同的输出
  9. openwrt添加me909s-8201
  10. python的easyocr图像文字识别
  11. mex文件用matlab能打开吗,MATLAB通过mex文件调用C/C++程序
  12. HTML5七夕情人节表白网页(蓝色背景3D相册) HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码 css爱心
  13. Mysql报错 Error querying database. Cause java.sql.SQLSyntaxErrorException
  14. android电视安装app
  15. 睡觉计算机主机在身旁好么,电脑睡眠和休眠用哪个比较好?
  16. TC358860XBG EDP/DP TO DAUL MIPI DSI
  17. UA MATH566 统计理论 完备性的证明方法
  18. 用Python脚本能获取Wifi密码么?能。
  19. 上三角矩阵的压缩存储
  20. Matrix Admin html5网站管理后台源码 Bootstrap响应式模板主题

热门文章

  1. vim的ex模式用法
  2. MySQL varchar(255) 和 varchar(256) 区别
  3. 计算机读书笔记10000,读书笔记:抓住1/10000的机会
  4. RANSAC(随机采样一致算法)原理及openCV代码实现
  5. 一个领域中的红海和蓝海
  6. 2018远程案例三星笔记本硬盘错误信息分析
  7. 恶意劫持主页之强力修复法
  8. PUSH消息是什么?
  9. 全网最全最细的CSDN【top1】接口测试工具Fiddler抓包工具总结
  10. 重走Android路 之 Android系统架构图以及开发工具了解