SpringBoot2.6.2 整合shardingsphere4.1.1+mybatis-plus 3.0.5分表实战

·  阅读 283

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

分库分表大家在项目中肯定都用过,也有不少的开源中间件,当然一些大一点的公司基于一些开源的组件做一些封装比如myCat, shardingJDBC 等等,对于小公司来说这些开源的基础组件其实非常好用了,也是一个项目基建必备的产品。这里主要介绍一下ShardingJDBC。

ShardingJDBC

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

官方网站

shardingsphere.apache.org/index_zh.ht…

核心架构(ShardingJDBC)

image.png

SpringBoot 整合MyBatisPlus和ShardingJDBC

1. 安装依赖

创建一个SpringBoot工程项目,主要添加下面的一些依赖。

复制代码
org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test com.baomidou mybatis-plus-boot-starter 3.0.5 mysql mysql-connector-java org.apache.shardingsphere sharding-jdbc-spring-boot-starter 4.1.1 com.alibaba druid 1.1.22 com.sun tools com.sun jconsole ``` ```

2. 分表策略配置

分表策略配置一般直接放在本地,不建议nacos配置

SQL脚本

CREATE TABLE `smp_down_link_record` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `merchant_id` int(10) not NULL COMMENT '商户ID',
	`mass_task_id` int(10) not NULL COMMENT '任务ID',
	`mass_task_name` varchar(128) not NULL '任务名称',
	`phone` varchar(128) not NULL '手机号码',
	`STATUS` TINYINT not NULL COMMENT '0. 待发送 1. 发送成功 2. 未知 3. 发送失败',
	`error_code` varchar(32) COMMENT '错误码',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
复制代码

分表策略配置

spring.main.allow-bean-definition-overriding=true
#配置数据源的详细信息,多个逗号分开
sharding.jdbc.datasource.names=m1
# 数据库连接池
sharding.jdbc.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
#数据库驱动类名
sharding.jdbc.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据库 URL 连接
sharding.jdbc.datasource.m1.url=jdbc:mysql://127.0.0.1:3306/smp?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
# 数据库用户名
sharding.jdbc.datasource.m1.username=root
# 数据库密码
sharding.jdbc.datasource.m1.password=****

# 指定smp_down_link_record 表的分布情况
sharding.jdbc.config.sharding.tables.smp_down_link_record.actual-data-nodes=m1.smp_down_link_record_$->{0..1}

#指定smp_down_link_record表中主键的生成策略  SNOWFLAKE:雪花算法,随机生成主键Id
#sharding.jdbc.config.sharding.tables.smp_down_link_record.key-generator-column-name=id
#sharding.jdbc.config.sharding.tables.smp_down_link_record.key-generator-type=SIMPLE

# 指定分片的策略 约定id值:
sharding.jdbc.config.sharding.tables.smp_down_link_record.table-strategy.inline.sharding-column=merchant_id
sharding.jdbc.config.sharding.tables.smp_down_link_record.table-strategy.inline.algorithm-expression=smp_down_link_record_$->{merchant_id%2}

#打开sql的输出日志

sharding.jdbc.config.sharding.props.sql.show=true

#实体类扫描配置,这样在mapper的xml中可以直接使用实体类名,不用写包路径
mybatis.type-aliases-package=com.sharding.jdbc.demo.entity
#驼峰转换
mybatis.configuration.mapUnderscoreToCamelCase=true
#处理日期
spring.jackson.date-format=yyyy-MM-dd HH:mm
spring.jackson.time-zone=GMT+8
复制代码

工程代码比较简单没有复杂sql,直接集成mysqlplus的ORM框架。

image.png

测试方法

@SpringBootTest
class ShardingJdbcDemoApplicationTests {

    @Resource
    private DownLinkRecordDAO downLinkRecordDAO;

    @Test
    void contextLoads() {
        DownLinkRecord downLinkRecord = new DownLinkRecord();
        downLinkRecord.setMassTaskId(1);
        downLinkRecord.setMerchantId(5);
        downLinkRecord.setMassTaskName("测试任务");
        downLinkRecord.setPhone("askdaodasdaskdfsdfodsuo");
        downLinkRecord.setErrorCode("");
        downLinkRecord.setStatus(1);
        downLinkRecordDAO.save(downLinkRecord);
    }

}
复制代码

FAQ

关于分表配置还是建议用properties的形式,ymal容易出现格式错误,导致报错,这个错误还容易误导我们。

image.png

分类:
后端
标签:
分类:
后端
标签: