(四)mybatisPlus中表的三种主键和列的两种映关系,使用“雪花算法“提供分布式主键使用方案

简介: mybatisPlus中表的三种主键和列的两种映射解决方案

😄看本博客之前,建议先看

1️⃣Mybatis-plus(MP)中CRUD操作保姆级笔记

2️⃣mybatisPlus实现ActiveRecord(AR)操作笔记

3️⃣mybatisPlus自定义Sql语句

mybatisPlus中表的三种主键和列的两种映射解决方案

主键


TableName


TableId


一、主键类型

idType 枚举类,主键定义如下:


none 没有主键


auto 自动增长(mysql,sql sever)


input 手工输入


id_worker :实体类用Long id,表的列名bigint ,int类型的大小不够


id_worker_String 实体类使用**String ** id,表的列名使用varchar(50)


uuid 实体类使用String id,列使用varchar(50)


id_worker: Twitter 雪花算法(SnowFlake 算法)-分布式 ID


雪花算法生成的最终结果其实就是一个long类型的Java长整型数字,这是一个大前提!
核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。
            在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的
SnowFlake算法的优点:
(1)高性能高可用:生成时不依赖于数据库,完全在内存中生成。
(2)容量大:每秒中能生成数百万的自增ID。
(3)ID自增:存入数据库中,索引效率高。
SnowFlake算法的缺点:
依赖与系统时间的一致性,如果系统时间被回调,或者改变,可能会造成id冲突或者重复。

(1)id_workder

数据库表设计


image.png

实体类

/**
 * @author 王恒杰
 * @version 1.0
 * @Description:
 * 使用AR,要求实体类需要继承MybatisPlus中的model方法
 * Model中提供了对数据库的CRUD 操作
 */
@TableName("dept")
public class Dept extends Model<Dept> {
    @Override
    protected Serializable pkVal() {
        return id;
    }
    /**
     * 设置表的主键,分布式id,使用了雪花算法
     */
   @TableId(value = "id",type = IdType.ID_WORKER)
    private Long id;
    private  String name;
    private String mobile;
    private Integer manager;

测试类

   /**
     * 添加操作
     */
    @Test
    public void  insertDeptTest(){
        Dept dept = new Dept();
        dept.setName("销售表");
        dept.setMobile("1235678");
        dept.setManager(2);
        boolean insert = dept.insert();
        System.out.println(insert);
    }


image.png

(2)id_workder_String(分布式)

数据库表设计


image.png

实体类

/**
 * @author 王恒杰
 * @version 1.0
 * @Description:
 * 使用AR,要求实体类需要继承MybatisPlus中的model方法
 * Model中提供了对数据库的CRUD 操作
 */
@TableName("dept")
public class Dept extends Model<Dept> {
    @Override
    protected Serializable pkVal() {
        return id;
    }
    /**
     * 设置表的主键,分布式id,使用了雪花算法,字符串类型
     */
   @TableId(value = "id",type = IdType.ID_WORKER_STR)
    private String id;
    private  String name;
    private String mobile;
    private Integer manager;

测试类

  /**
     * 添加操作
     */
    @Test
    public void  insertDeptTest(){
        Dept dept = new Dept();
        dept.setName("销售表");
        dept.setMobile("1235678");
        dept.setManager(2);
        boolean insert = dept.insert();
        System.out.println(insert);
    }


image.png

(3)uuid

数据库表设计


image.png

实体类


/**
 * @author 王恒杰
 * @version 1.0
 * @Description:
 * 使用AR,要求实体类需要继承MybatisPlus中的model方法
 * Model中提供了对数据库的CRUD 操作
 */
@TableName("dept")
public class Dept extends Model<Dept> {
    @Override
    protected Serializable pkVal() {
        return id;
    }
    /**
     * 设置表的主键,分布式id,使用了雪花算法,字符串类型
     */
   @TableId(value = "id",type = IdType.UUID)
    private String id;
    private  String name;
    private String mobile;
    private Integer manager;

测试类

 /**
     * 添加操作
     */
    @Test
    public void  insertDeptTest(){
        Dept dept = new Dept();
        dept.setName("销售表");
        dept.setMobile("1235678");
        dept.setManager(2);
        boolean insert = dept.insert();
        System.out.println(insert);
    }

image.png

二、指定表名和字段名解决映射问题

定义实体类,默认的表名和实体类同名;如果不一致,在实体类定义上面使用


@TableName 说明表名称。


例如:@TableName(value=”数据库表名”) 步骤:


表:


image.png

实体类

/**
 * @author 王恒杰
 * @version 1.0
 * @Description:
 * 使用AR,要求实体类需要继承MybatisPlus中的model方法
 * Model中提供了对数据库的CRUD 操作
 */
@TableName(value = "dept")
public class Dept extends Model<Dept> {
    @Override
    protected Serializable pkVal() {
        return id;
    }
    /**
     * 设置表的主键,分布式id,使用了雪花算法,字符串类型
     */
   @TableId(value = "id",type = IdType.UUID)
    private String id;
   @TableField(value = "d_name")
    private  String name;
   @TableField(value = "d_mobile")
    private String mobile;
    private Integer manager;

image.png

测试类

    /**
     * 添加操作
     */
    @Test
    public void  insertDeptTest(){
        Dept dept = new Dept();
        dept.setName("销售表");
        dept.setMobile("1235678");
        dept.setManager(2);
        boolean insert = dept.insert();
        System.out.println(insert);
    }



三、驼峰命名方式解决映射问题


image.png

实体类

@TableName(value = "dept")
public class Dept extends Model<Dept> {
    @Override
    protected Serializable pkVal() {
        return id;
    }
    /**
     * 设置表的主键,分布式id,使用了雪花算法,字符串类型
     */
   @TableId(value = "id",type = IdType.UUID)
    private String id;
    private  String deptName;
    private String deptMobile;
    private Integer deptManager;


image.png

测试类

  /**
     * 添加操作
     */
    @Test
    public void  insertDeptTest(){
        Dept dept = new Dept();
        dept.setDeptName("销售表");
        dept.setDeptMobile("1235678");
        dept.setDeptManager(2);
        boolean insert = dept.insert();
        System.out.println(insert);
    }
相关文章
|
1月前
|
NoSQL 算法 安全
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
153 0
|
3月前
|
监控 NoSQL Linux
【分布式】Redis的持久化方案解析
【1月更文挑战第25天】【分布式】Redis的持久化方案解析
|
3月前
|
SQL Oracle 关系型数据库
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
88 0
|
6天前
|
存储 SQL 算法
搞定了 6 种分布式ID,分库分表哪个适合做主键?
在《ShardingSphere5.x分库分表原理与实战》系列的第七篇文章中,作者探讨了分布式ID在分库分表中的重要性,以及如何利用`ShardingSphere-jdbc`的多种主键生成策略。文章介绍了`UUID`、`NanoID`、自定义雪花算法和`CosId`等策略的优缺点,并警告不要在SQL中手动拼接主键字段。此外,文章还展示了如何配置这些策略,并提醒读者`CosId`在5.2.0版本可能不可用。最后,文章讨论了如何自定义分布式主键生成算法,并强调选择策略时要考虑全局唯一性、性能和易用性。
|
26天前
|
缓存 算法 关系型数据库
深度思考:雪花算法snowflake分布式id生成原理详解
雪花算法snowflake是一种优秀的分布式ID生成方案,其优点突出:它能生成全局唯一且递增的ID,确保了数据的一致性和准确性;同时,该算法灵活性强,可自定义各部分bit位,满足不同业务场景的需求;此外,雪花算法生成ID的速度快,效率高,能有效应对高并发场景,是分布式系统中不可或缺的组件。
深度思考:雪花算法snowflake分布式id生成原理详解
|
26天前
|
存储 Java 应用服务中间件
【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案
【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案
48 0
|
26天前
|
canal 消息中间件 关系型数据库
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
75 0
|
1月前
|
机器学习/深度学习 数据采集 运维
高效处理异常值的算法:One-class SVM模型的自动化方案
高效处理异常值的算法:One-class SVM模型的自动化方案
36 1
|
1月前
|
算法 Java 数据中心
分布式ID生成系统之雪花算法详解
在当今的云计算和微服务架构盛行的时代,分布式系统已成为软件开发的重要组成部分。随着系统规模的扩大和业务的复杂化,对数据一致性和唯一性的要求也越来越高,尤其是在全局唯一标识符(ID)的生成上。因此,分布式ID生成系统应运而生,成为保证数据唯一性和提高系统可扩展性的关键技术之一。雪花算法(Snowflake)是Twitter开源的一种算法,用于生成64位的全局唯一ID,非常适用于分布式系统中生成唯一标识符。下面我们将深入探讨雪花算法的原理、结构和实现方式。
98 2
 分布式ID生成系统之雪花算法详解