(三)Sharding-JDBC 整合mybatis-plus 水平分库、分表

ps:概念:

  • 水平分库:是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器 上。

  • 水平分表:是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中.

一、准备环境:

新增一个服务器节点,在两台服务器上都创建order_db库,并都创建t_order_1,t_order_2两张表。

二、对(一)Sharding-JDBC 整合mybatis-plus 水平分表代码改造

1.application.yml:

############################水平分库、分表#################################
#服务端口
server:
  port: 56081
#服务名
spring:
  application:
    name: sharding-jdbc-examples
  http:
    encoding:
      enabled: true
      charset: utf-8
      force: true
  main:
    allow-bean-definition-overriding: true
  #shardingsphere相关配置
  shardingsphere:
    datasource:
      names: m1,m2   #配置库的名字,随意
      m1:   #配置目前m1库的数据源信息
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.87.133:3306/order_db?useUnicode=true
        username: root
        password: 123456
      m2:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.87.134:3306/order_db?useUnicode=true
        username: root
        password: 123456
    sharding:
      tables:
        t_order:
          key-generator:
            column: user_id
            type: SNOWFLAKE
          actual-data-nodes: m$->{1..2}.t_order_$->{1..2}   # 分库策略,以user_id为分片键,分片策略为user_id % 2 + 1,user_id为偶数操作m1数据源,否则操作m2。
          database‐strategy:  #分库策略
            inline:
              sharding‐column: user_id
              algorithm‐expression: m$->{user_id % 2 + 1}
          table‐strategy: #分表策略
            inline:
              sharding‐column: order_id
              algorithm‐expression: t_order_$->{order_id % 2 + 1}
    props:
      sql:
        show: true   #打印sql


#日志打印
logging:
  level:
    root: info
    org.springframework.web: info
    com.lucifer.sharding.dao: debug
    druid.sql: debug

ps:这里的分库分表策略:

分库策略:以user_id为分片键,分片策略为user_id % 2 + 1,user_id为偶数操作m1数据源,否则操作m2。
分表策略:以order_id为分片键,分片策略为{order_id % 2 + 1},order_id为偶数操作t_order_1表,否则操作t_order_2表。

2.实体类:

package com.lucifer.sharding.pojo;

import java.io.Serializable;
import java.math.BigDecimal;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/**
 * @author Lucifer
 */
@TableName(value = "t_order")
@Data
public class Order implements Serializable {
    /**
     * 订单id
     */
    @TableId(type=IdType.ID_WORKER)
    private Long orderId;

    /**
     * 订单价格
     */
    private BigDecimal price;

    /**
     * 下单用户id
     */
    private Long userId;

    /**
     * 订单状态
     */
    private String status;

    private static final long serialVersionUID = 1L;
}

这里的改变,仅仅是在orderId这个属性上加了mybatis-plus的雪花算法生成的id。

3.为了简单,此处不再使用controller和service写接口用postman测试了,直接省略,直接在测试类中测试了。

4.测试类:

package com.lucifer.sharding;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lucifer.sharding.dao.OrderDao;
import com.lucifer.sharding.pojo.Order;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.math.BigDecimal;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ShardingJdbcExamplesApplication.class})
public class ShardingJdbcExamplesApplicationTests {

    @Resource
    OrderDao orderDao;

    @Test
    public void add() {
        for (int i = 0; i < 10; i++) {
            Order order = new Order();
            order.setPrice(BigDecimal.valueOf(0.1));
            order.setStatus("0");
            orderDao.insert(order);
        }
    }
    
    @Test
    public void find() {
        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
        List<Long> list = new ArrayList<>();
        list.add(418766159777628160L); //库1的t_order_2中
        list.add(418766159765045249L);  //库2的t_order_1中
        queryWrapper.in("user_id",list);
        orderDao.selectList(queryWrapper);
    }

}

1.测试add

m1库:(配置文件中配置的)====》192.168.87.133 

m2库:(配置文件中配置的)====》192.168.87.134 

2.测试find

控制台输出,会去两个库中的t_order_1,t_order_2都查询一下;

发布了186 篇原创文章 · 获赞 146 · 访问量 49万+

猜你喜欢

转载自blog.csdn.net/qq_37495786/article/details/103781170