首页 > 其他分享 >ShardingJdbc分库分表+连表查询(超简单)

ShardingJdbc分库分表+连表查询(超简单)

时间:2024-10-20 15:22:08浏览次数:9  
标签:demo 分库 spring activity 连表 shardingsphere sharding ShardingJdbc id

下载依赖

这边建议所有的依赖版本都和我同步,因为我被版本冲突折磨了好久...

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>



    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Druid连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.20</version>
        </dependency>

        <!-- MySQL驱动依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version> <!-- 确保与 Java 8 兼容 -->
        </dependency>

        <!-- MybatisPlus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>

        <!-- Sharding-JDBC -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.0-RC1</version>
        </dependency>

        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version> <!-- 确保与 Java 8 兼容 -->
        </dependency>

<!--         添加 JAXB 依赖 -->
<!--         由于 Java 8 默认包含 JAXB API,这里可以省略 -->
<!--         如果需要使用外部的 JAXB 实现 -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.2</version>
        </dependency>
        

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- 确保编译器插件使用 Java 8 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

创建数据库

CREATE TABLE `demo_order_0`  (
  `user_id` int(0) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `activity_id` int(0) NULL DEFAULT NULL
)

CREATE TABLE `demo_activity_0`  (
  `id` int(0) NOT NULL,
  `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型',
  `acticity_id` int(0) NULL DEFAULT NULL COMMENT '关联id',
  PRIMARY KEY (`id`) USING BTREE
) 

我只给了两张表,其他的表名用这个sql改一下表名即可,测试数据自行插入,两张表的activity_id字段是关联字段(后面做连表查询)

添加配置文件

application.properties

# 配置Sharding-JDBC的分片策略
# 配置数据源,给数据源起名g1,g2...此处可配置多数据源
spring.shardingsphere.datasource.names=g1,g2

# 配置允许一个实体类映射多张表
spring.main.allow-bean-definition-overriding=true

# 配置数据源具体内容————————包含  连接池,  驱动,             地址,   用户名,    密码
#                                 g1配置g1.type,g1.driver-class-name,g1.url,g1.username,g1.password
spring.shardingsphere.datasource.g1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g1.url=jdbc:mysql://127.0.0.1:3306/ams_sharding_order_0?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g1.username=root
spring.shardingsphere.datasource.g1.password=root

# 配置数据源具体内容————————包含  连接池,  驱动,             地址,   用户名,    密码
#                                 g2配置g2.type,g2.driver-class-name,g2.url,g2.username,g2.password
spring.shardingsphere.datasource.g2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.g2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.g2.url=jdbc:mysql://127.0.0.1:3306/ams_sharding_order_1?characterEncoding=utf-8&useUnicode=true&useSSL=false&serverTimezone=UTC
spring.shardingsphere.datasource.g2.username=root
spring.shardingsphere.datasource.g2.password=root

# 配置数据库的分布,表的分布
# m1:goods_1 goods_2; m2:goods_1,goods_2;
spring.shardingsphere.sharding.tables.demo_order.actual-data-nodes=g$->{1..2}.demo_order_$->{0..1}

# 指定goods表 主键gid 生成策略为 SNOWFLAKE
#spring.shardingsphere.sharding.tables.goods.key-generator.column=gid
#spring.shardingsphere.sharding.tables.goods.key-generator.type=SNOWFLAKE

# 指定数据库分片策略 约定user_id值是偶数添加到goods_db_1中,奇数添加到goods_db_2中
spring.shardingsphere.sharding.tables.demo_order.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.demo_order.database-strategy.inline.algorithm-expression=g$->{user_id % 2 +1}

# 指定表分片策略 约定gid值是偶数添加到goods_1表,如果gid是奇数添加到goods_2表
spring.shardingsphere.sharding.tables.demo_order.table-strategy.inline.sharding-column=activity_id
spring.shardingsphere.sharding.tables.demo_order.table-strategy.inline.algorithm-expression=demo_order_$->{activity_id % 2 }

# 配置新的表 demo_activity 的分片规则
spring.shardingsphere.sharding.tables.demo_activity.actual-data-nodes=g$->{1..2}.demo_activity_$->{0..1}

# 指定数据库分片策略 约定activity_id值是偶数添加到g1中,奇数添加到g2中
spring.shardingsphere.sharding.tables.demo_activity.database-strategy.inline.sharding-column=activity_id
spring.shardingsphere.sharding.tables.demo_activity.database-strategy.inline.algorithm-expression=g$->{activity_id % 2 +1}

# 指定表分片策略 约定activity_id值是偶数添加到demo_activity_0表,如果是奇数添加到demo_activity_1表
spring.shardingsphere.sharding.tables.demo_activity.table-strategy.inline.sharding-column=activity_id
spring.shardingsphere.sharding.tables.demo_activity.table-strategy.inline.algorithm-expression=demo_activity_$->{activity_id % 2 }
#加入连接表配置
spring.shardingsphere.sharding.binding-tables=demo_order,demo_activity
# 打开sql输出日志
spring.shardingsphere.props.sql.show=true

注意:数据库的表名一定要和我一致,不然就要修改配置中的分库分表策略,不然会启动失败

创建实体类

@TableName("demo_order")
@Data
public class DemoOrder {

    @TableField(value = "user_id")
    private Long userId;

    @TableField(value = "name")
    private String name;

    @TableField(value = "activity_id")
    private Long activityId;
}




@Data
public class OrderActivity {


 private Long userId;

 private String name;

 private Long activityId;

 private Long id;

 private String type;
}

创建Controller

@RequestMapping("/order")
@RestController
public class OrderController {

 @Resource
 private OrderMapper orderMapper;

 @PostMapping("/save")
 public void save(@RequestBody DemoOrder demoOrder){

  orderMapper.insert(demoOrder);

 }

 @PostMapping("/list")
 public List<DemoOrder> list(){

  return orderMapper.selectList(null);
 }

 @PostMapping("/orderList")
 public List<OrderActivity> orderList(){


  return orderMapper.orderList();
 }

创建mapper

@Mapper
public interface OrderMapper extends BaseMapper<DemoOrder> {

    @Select(
            "SELECT * " +
                    " FROM demo_order o " +
                    " LEFT JOIN demo_activity a " +
                    " ON o.activity_id = a.activity_id "
    )
    List<OrderActivity> orderList();
}

测试

新增数据(分库分表)

可以通过日志发现数据插入到了 g1 数据源的demo_order_0表中

可以看到数据已经插入

列表

通过列表的日志可以发现他是查询了所有表的数据汇总,如果要做分页按之前的样式写就可以了

列表(关联查询)

可以看到关联的类型已经查出

标签:demo,分库,spring,activity,连表,shardingsphere,sharding,ShardingJdbc,id
From: https://blog.csdn.net/Diyu0904/article/details/142921606

相关文章

  • 用户分库分表
    用户分库分表为什么要分库分表?●数据量庞大。●查询性能缓慢,之前可能是20ms,后续随着数据量的增长,查询时间呈指数增长。●数据库连接不够。什么是分库分表?分库和分表有两种模式,垂直和水平。分库两种模式:●垂直分库:电商数据库拆分为用户、订单、商品、交易等数据库。订......
  • 分库分表还是分布式?如何用 OceanBase的单机分布式一体化从根本上解决问题
    随着企业业务规模的不断增长,单机集中式的数据库系统逐渐难以承载企业日益增长的数据存储与处理需求。因此,MySQL的分库分表方案成为了众多企业应对数据存储量激增及数据处理能力需求扩张的“止痛药”。尽管这一方案短期内有效缓解了企业面临的大规模数据处理压力,但同时也引发了......
  • SpringBoot整合ShardingJdbc分表
    项目中处理接收设备上报日志需求,上报数据量大,因此对数据进行按日期分表处理。使用技术:ShardingJdbc+rabbitMq+jpa+多线程处理引入所需jar:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</a......
  • 一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案
    前言今天大姚给大家分享一款EFCore下高性能、轻量级针对分表分库读写分离的解决方案,开源(ApacheLicense)的EFCore拓展程序包:ShardingCore。ShardingCore项目介绍ShardingCore是一款开源、简单易用、高性能、普适性,针对EFCore生态下的分表分库的扩展解决方案,支持EFCore2+的所有版......
  • 什么是索引和分库分表?
    1.什么是索引?在关系数据库中,索引是一种数据结构,将数据提前按照一定的规则进行排序和组织,能够帮助快速定位到数据记录的数据,加快数据库表中数据的查找和访问速度。像书籍的目录、文件夹、标签、房号...都可以帮助我们快速定位,都可以视为索引。能实现快速定位数据的一种存储......
  • 分库分表之后,id 主键如何处理?
    问:分库分表之后,id主键如何处理? 其实这是分库分表之后你必然要面对的一个问题,就是id咋生成?因为要是分成多个表之后,每个表都是从1开始累加,那肯定不对啊,需要一个全局唯一的id来支持。所以这都是你实际生产环境中必须考虑的问题。 基于数据库的实现方案 数据库自增id......
  • 分库分表零基础
    一、前言中大型项目中,一旦遇到数据量比较大,就应该对数据进行拆分。有垂直和水平两种。垂直拆分也就是本来一个数据库,数据量大之后,从业务角度进行拆分多个库。水平拆分,是同一个业务数据量大之后,进行水平拆分。mysql单表存储量推荐是百万级,如果不进行处理,mysql单表数据太大,会......
  • shardingJdbc分表执行批量update不支持的解决方式
    引言本次场景,公司通过shardingjdbc对mysql数据库进行分表,模糊匹配按照createTime,每季度一张表的方式,精确匹配按照creatTime的方式。关于模糊匹配、精确匹配,自行在shardingjdbc官网查看,分表策略等。由于是跟进createTime字段去作为分表的key,那么在执行select、update、delete......
  • MySQL分库分表
    一、概念分库:指将数据按照一定的规则拆分到多个数据库中,每个数据库存储一部分数据。通过分库可以提升数据库的存储能力和扩展性。分表:指将一张大表按照一定的规则拆分成多个小表,每个小表存储原表的一部分数据。通过分表可以提升查询性能,因为每个小表的数据量较少,查询速度......
  • 再有人问你什么是分库分表,直接把这篇文章发给他
    目录标题分库、分表、分库分表什么时候分库?什么时候分表?什么时候既分库又分表?横向拆分和纵向拆分分表字段的选择买家还是卖家?卖家查询怎么办?按照订单查询怎么办?分表算法直接取模Hash取模一致性Hash全局ID的生成UUID基于某个单表做自增主键基于多个单表+步长做自增主键......