java:使用shardingSphere访问mysql的分库分表数据

# 创建分库与分表

创建两个数据库【order_db_1、order_db_2】。
然后在两个数据库下分别创建三个表【orders_1、orders_2、orders_3】。
建表sql请参考:

CREATE TABLE `orders_1`  (
  `id` bigint NOT NULL,
  `order_type` varchar(255) NULL DEFAULT NULL,
  `customer_id` bigint NULL DEFAULT NULL,
  `amount` double NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) 
ENGINE = InnoDB

在这里插入图片描述

# 下面开始写测试代码:

【pom.xml】

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.3.12.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <version>2.3.12.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3.1</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-core</artifactId>
    <version>3.4.3.1</version>
</dependency>
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.1</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.22</version>
</dependency>
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.3.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.49</version>
</dependency>

【application.properties】

server.port=8080
spring.application.name=myShardingSphere

management.server.port=8080
management.endpoints.web.exposure.include=*

########################################

management.health.db.enabled=false
management.health.elasticsearch.enabled=false

mybatis-plus.mapper-locations=classpath:mapper/*.xml
mybatis-plus.type-aliases-package=test/persistence/mapper

##########################################################

spring.shardingsphere.datasource.names=ds-order-db-1, ds-order-db-2

######################################################
# 数据源

spring.shardingsphere.datasource.ds-order-db-1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds-order-db-1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds-order-db-1.url=jdbc:mysql://192.168.44.228:3306/order_db_1
spring.shardingsphere.datasource.ds-order-db-1.username=root
spring.shardingsphere.datasource.ds-order-db-1.password=root

spring.shardingsphere.datasource.ds-order-db-2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds-order-db-2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds-order-db-2.url=jdbc:mysql://192.168.44.228:3306/order_db_2
spring.shardingsphere.datasource.ds-order-db-2.username=root
spring.shardingsphere.datasource.ds-order-db-2.password=root

#################################################
# table

spring.shardingsphere.sharding.tables.orders.actual-data-nodes=ds-order-db-${1..2}.orders_${1..3}

spring.shardingsphere.sharding.tables.orders.database-strategy.inline.sharding-column=customer_id
spring.shardingsphere.sharding.tables.orders.database-strategy.inline.algorithm-expression=ds-order-db-$->{customer_id % 2 + 1}

spring.shardingsphere.sharding.tables.orders.table-strategy.inline.sharding-column=customer_id
spring.shardingsphere.sharding.tables.orders.table-strategy.inline.algorithm-expression=orders_${customer_id % 3 + 1}

##################################################

spring.shardingsphere.props.sql.show=true

################################################

【mapper/OrdersMapper.xml】

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chz.myShardingSphere.persistence.mapper.OrdersMapper">

    <resultMap id="orders" type="com.chz.myShardingSphere.persistence.po.Orders">
        <id column="id" property="id" />
        <result column="orderType" property="order_type" />
        <result column="customerId" property="customer_id" />
        <result column="amount" property="amount" />
    </resultMap>

    <select id="testSelectOrder" parameterType="long" resultMap="orders">
        SELECT *
        FROM orders
        <where>
            <if test="customerId!=null">
                and customer_id = #{customerId}
            </if>
        </where>
        order by id
        LIMIT 10 OFFSET 0
    </select>

</mapper>

【TestController.java】

package com.chz.myShardingSphere.controller;

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

    @Value("${spring.application.name}")
    private String applicationName;

    @Autowired
    private TestService testService;

    @GetMapping("/testAddOrder")
    public String testAddOrder(
            @RequestParam(value = "id", defaultValue = "1") Long id
    ) {
        testService.testAddOrder(id);
        return "testAddOrder";
    }

    @GetMapping("/testSelectOrder")
    public String testSelectOrder(
            @RequestParam(value = "customerId", required = false) Long customerId
    ) {
        List<Orders> orders = testService.testSelectOrder(customerId);
        return JSON.toJSONString(orders);
    }

    @GetMapping("/testDeleteOrder")
    public String testDeleteOrder() {
        testService.testDeleteOrder();
        return "success";
    }
}

【OrdersMapper.java】

package com.chz.myShardingSphere.persistence.mapper;

@Repository
@Mapper
public interface OrdersMapper extends BaseMapper<Orders>
{
    List<Orders> testSelectOrder(@Param("customerId") Long customerId);
}

【Orders.java】

package com.chz.myShardingSphere.persistence.po;

@Getter
@Setter
public class Orders {

    private Long id;
    private Long orderType;
    private Long customerId;
    private Double amount;

    @Override
    public String toString() {
        return "Orders{" +
                "id=" + id +
                ", orderType=" + orderType +
                ", customerId=" + customerId +
                ", amount=" + amount +
                '}';
    }
}

【TestService.java】

package com.chz.myShardingSphere.server;

@Service
public class TestService {

    @Autowired
    private OrdersMapper ordersMapper;

    @Transactional
    public void testAddOrder(long id)
    {
        Orders orders = new Orders();
        orders.setId(id);
        orders.setCustomerId(id);
        orders.setOrderType(id);
        orders.setAmount((double)id);
        ordersMapper.insert(orders);
    }

    @Transactional
    public List<Orders> testSelectOrder(Long customerId)
    {
        List<Orders> orders = ordersMapper.testSelectOrder(customerId);
        return orders;
    }

    @Transactional
    public void testDeleteOrder()
    {
        LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>();
        ordersMapper.delete(queryWrapper);
    }
}

【MyShardingSphereTest.java】

package com.chz.myShardingSphere;

@SpringBootApplication
public class MyShardingSphereTest {

    public static void main(String[] args) {
        SpringApplication.run(MyShardingSphereTest.class, args);
    }
}

启动【MyShardingSphereTest】

# 下面进行测试:

访问以下url创建6条数据:

http://localhost:8080/test/testAddOrder?id=1
http://localhost:8080/test/testAddOrder?id=2
http://localhost:8080/test/testAddOrder?id=3
http://localhost:8080/test/testAddOrder?id=4
http://localhost:8080/test/testAddOrder?id=5
http://localhost:8080/test/testAddOrder?id=6

然后访问【http://localhost:8080/test/testSelectOrder】看下数据能不能查出来:
在这里插入图片描述
可以看到数据都查出来了。

增加个条件试试,访问【http://localhost:8080/test/testSelectOrder?customerId=1】
在这里插入图片描述
也运行正常

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ShardingSphere:SpringBoot2+MybatisPlus+读写分离+分库分表课程目标快速的掌握读写分离+分表的实战,即插即用适用人群IT从业人员,开发人员,Java从业者,互联网从业者,性能调优人群课程简介ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈。它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,shardingSphere定位为关系型数据库中间件。 Sharding-JDBCSharding-JDBC是Sharding-Sphere的第一个产品,也是Sharding-Sphere的前身,是当当网开源的一个产品。定位为轻量级的Java框架,在Java的JDBC层提供额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。他们均提供标准化的数据分片、读写分离、柔性事务和数据治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。Sharding-JDBC可以通过Java,YAML,Spring命名空间和Spring Boot Starter四种方式配置,开发者可根据场景选择适合的配置方式。课程特色 本章节以尽量短的时间,为使用者提供最简单的ShardingSphere的快速入门。课程说明该课程属于系列课程,分为读写分离,分库不分表,不分库分表分库分表,读写分离+分库分表共5个回合。本课程属于其中一个回合,请各位小哥哥们注意,课程的标题哦~
课程目标快速的掌握读写分离+分表的实战,即插即用适用人群IT从业人员,开发人员,Java从业者,互联网从业者,性能调优人群课程简介ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈。它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,shardingSphere定位为关系型数据库中间件。Sharding-JDBCSharding-JDBC是Sharding-Sphere的第一个产品,也是Sharding-Sphere的前身,是当当网开源的一个产品。定位为轻量级的Java框架,在Java的JDBC层提供额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。他们均提供标准化的数据分片、读写分离、柔性事务和数据治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。Sharding-JDBC可以通过Java,YAML,Spring命名空间和Spring Boot Starter四种方式配置,开发者可根据场景选择适合的配置方式。课程特色 本章节以尽量短的时间,为使用者提供最简单的ShardingSphere的快速入门。课程说明该课程属于系列课程,分为读写分离,分库不分表,不分库分表分库分表,读写分离+分库分表共5个回合。本课程属于其中一个回合,请各位小哥哥们注意,课程的标题哦~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈鸿圳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值