(1) Tabla de puntuación de nivel de integración mybatis-plus Sharding-JDBC

 PD:

Concepto: la subtabla horizontal está en la misma base de datos, los datos de la misma tabla se dividen en varias tablas de acuerdo con ciertas reglas

1. Preparar el medio ambiente:

1. En una sola base de datos, subtabla:

2. Script de base de datos:

#创建订单库order_db
CREATE DATABASE `order_db` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

#在order_db中创建t_order_1、t_order_2表
DROP TABLE IF EXISTS `t_order_1`;
CREATE TABLE `t_order_1` (
`order_id` bigint(20) NOT NULL COMMENT '订单id',
`price` decimal(10, 2) NOT NULL COMMENT '订单价格',
`user_id` bigint(20) NOT NULL COMMENT '下单用户id',
`status` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '订单状态',
PRIMARY KEY (`order_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

DROP TABLE IF EXISTS `t_order_2`;
CREATE TABLE `t_order_2` (
`order_id` bigint(20) NOT NULL COMMENT '订单id',
`price` decimal(10, 2) NOT NULL COMMENT '订单价格',
`user_id` bigint(20) NOT NULL COMMENT '下单用户id',
`status` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '订单状态',
PRIMARY KEY (`order_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

Segundo, pom.xml: (Importar el paquete jar correspondiente)

PD:

La versión de springboot utilizada aquí es 2.2.2.RELEASE;

Aquí sharding-jdbc-spring-boot-starter utilizo la integración 4.0.0-RC2, la consola informará un error:

Error al configurar un DataSource: el atributo 'url' no está especificado y no se pudo configurar ningún origen de datos incorporado.

Motivo: no se pudo determinar una clase de controlador adecuada

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

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

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.20</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.0-RC1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

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

3. application.yml: (importante)

#服务端口
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   #配置库的名字,随意
      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
    sharding:
      tables:
        t_order:  # 指定t_order表的数据分布情况,配置数据节点
          actualDataNodes: m1.t_order_$->{1..2}
          tableStrategy:
            inline:   # 指定t_order表的分片策略,分片策略包括分片键和分片算法
              shardingColumn: order_id
              algorithmExpression: t_order_$->{order_id % 2 + 1}
          keyGenerator:   # 指定t_order表的主键生成策略为SNOWFLAKE
            type: SNOWFLAKE  #主键生成策略为SNOWFLAKE
            column: order_id  #指定主键
    props:
      sql:
        show: true

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

t_order : Aquí está el nombre de la tabla lógica, no el nombre real de la tabla. El nombre real de la tabla es t_order_1, t_order_2;

actualDataNodes : m1.t_order _ $ -> {1..2} donde m1 es el nombre de la biblioteca (configurado arriba), que es equivalente al nombre de la biblioteca. nombre de la tabla lógica_1, nombre de la biblioteca. nombre de la tabla lógica_2 === ===》 Corresponde a dos nombres de tablas reales.

shardingColumn : clave de fragmentación ,

AlgoritmoExpresión : t_order _ $ -> {order_id% 2 + 1}: Reglas de fragmentación. t_order _ $ -> {order_id% 2 + 1} en dos mitades:

(1) - "t_order_logical table name_value, en cuanto a si este valor es 1 o 2, es causado por

(2) --- "order_id% 2 + 1", el valor de order_id dividido por 2 es módulo y luego 1.

Es decir, los datos con un número par de order_id caen en t_order_1, y un número impar cae en t_order_2.

spring.main.allow-bean-definition-overriding: true: debe establecerse; de ​​lo contrario, informará un error;

The bean 'dataSource', defined in class path resource [org/apache/shardingsphere/shardingjdbc/spring/boot/SpringBootConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [com/alibaba/druid/spring/boot/autoconfigure/DruidDataSourceAutoConfigure.class] and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

El significado es claro, hay dos frijoles con el mismo nombre.

Verifique el código fuente SpringBoot y el druida, puede ver los beans con el mismo nombre.

Cuarto, el segmento de código

ps: el código es muy simple, principalmente para la configuración, por lo que no entraré en detalles aquí.

controlador:

package com.lucifer.sharding.controller;


import com.lucifer.sharding.service.OrderService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author Lucifer
 */
@RestController
public class OrderController {

    @Resource
    private OrderService orderService;

    @GetMapping(value = "/add")
    public void addOrder() {
        orderService.addOrder();
    }

    @GetMapping(value = "/find")
    public void findOrder() {
        orderService.findOrder();
    }
    
}

interfaz de servicio: 

package com.lucifer.sharding.service;

/**
 * @author Lucifer
 */
public interface OrderService {

    /**
     * 新增订单
     *
     */
    void addOrder();

    /**
     * 查询
     */
    void findOrder();
}

Clase de implementación del servicio: 

package com.lucifer.sharding.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lucifer.sharding.dao.OrderDao;
import com.lucifer.sharding.pojo.Order;
import com.lucifer.sharding.service.OrderService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;


/**
 * @author Lucifer
 */
@Service
public class OrderServiceImpl implements OrderService {

    @Resource
    OrderDao orderDao;

    @Override
    public void addOrder() {
        for (int i = 0; i < 10; i++) {
            Order order = new Order();
            order.setPrice(new BigDecimal(Math.random()));
            order.setUserId(new Random().nextLong());
            order.setStatus("0");
            orderDao.insert(order);
        }
    }


   //执行新增后,将两库的数据各取一条,来测试
    @Override
    public void findOrder() {
        List<Long> list=new ArrayList<>();
        list.add(418415166183440384L);
        list.add(418417197166100481L);
        QueryWrapper<Order> queryWrapper=new QueryWrapper<>();
        queryWrapper.in("order_id", list);
        orderDao.selectList(queryWrapper);
    }
}

Interfaz de capa de Dao: 

package com.lucifer.sharding.dao;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lucifer.sharding.pojo.Order;

/**
 * @author Lucifer
 */
public interface OrderDao extends BaseMapper<Order> {

}

Clase de entidad: 

package com.lucifer.sharding.pojo;

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

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

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

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

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

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

    private static final long serialVersionUID = 1L;
}

PD:

Lo que hay que decir es que la anotación @TableName (value = "t_order") de mybatis-plus especifica el nombre de la tabla, y aquí se especifica el nombre de la tabla lógica .

Agregue la anotación @MapperScan a la clase de inicio SpringBoot .

Cinco, prueba

La consola imprime:

Base de datos:

De hecho, la lógica aproximada es que ShardingSphere ha generado un valor de la clave primaria order_id para usted usando el algoritmo de copo de nieve, y de acuerdo con las reglas configuradas en el archivo de configuración para determinar en qué tabla insertar, en cuanto a la consulta, se determina de acuerdo con su order_id Verifique qué tabla (ignorando las capturas de pantalla de prueba).

Es decir, si el campo de consulta no es una clave de fragmento, se verificarán dos tablas; como se muestra en la figura:

 

186 artículos originales publicados · elogiados 146 · 490,000 visitas

Supongo que te gusta

Origin blog.csdn.net/qq_37495786/article/details/103767507
Recomendado
Clasificación