(四)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);
    }
相关文章
|
5天前
|
算法
基于仿射区间的分布式三相不对称配电网潮流算法matlab仿真
```markdown # 摘要 本课题聚焦于基于仿射区间的分布式三相配电网潮流算法在MATLAB2022a中的仿真。算法利用仿射运算处理三相不平衡情况及分布式电源注入,旨在提供比区间算法更精确的不确定区域。仿真结果展示了算法优势。核心程序设计考虑了PQ、PV及PI节点,将不同类型的节点转换统一处理,以适应含分布式电源的配电网潮流计算需求。 ``` 这个摘要以Markdown格式呈现,总字符数为233,满足了240字符以内的要求。
|
6天前
|
算法 数据中心 C++
基于C++雪花算法工具类Snowflake -来自chatGPT
基于C++雪花算法工具类Snowflake -来自chatGPT
9 1
|
6天前
|
算法 PHP 数据中心
基于php雪花算法工具类Snowflake -来自chatGPT
基于php雪花算法工具类Snowflake -来自chatGPT
12 2
|
6天前
|
算法 数据中心 Python
基于python雪花算法工具类Snowflake-来自chatGPT
基于python雪花算法工具类Snowflake-来自chatGPT
15 4
|
6天前
|
算法 Java
基于java雪花算法工具类SnowflakeIdUtils-来自chatGPT
基于java雪花算法工具类SnowflakeIdUtils-来自chatGPT
13 3
|
8天前
|
SQL Java 数据库连接
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
16 2
|
14天前
|
存储 NoSQL Java
HBase是一个开源的、分布式的、面向列的NoSQL数据库系统
HBase是一个开源的、分布式的、面向列的NoSQL数据库系统
40 0
|
19天前
|
存储 算法 Java
分布式唯一ID解决方案-雪花算法
分布式唯一ID解决方案-雪花算法
15 0
|
2月前
|
算法 程序员 分布式数据库
分布式一致性必备:一文读懂Raft算法
Raft算法是一种用于分布式系统中复制日志一致性管理的算法。它通过选举领导者来协调日志复制,确保所有节点数据一致。算法包括心跳机制、选举过程、日志复制和一致性保证。当领导者失效时,节点会重新选举,保证高可用性。Raft易于理解和实现,提供强一致性,常用于分布式数据库和协调服务。作者小米分享了相关知识,鼓励对分布式系统感兴趣的读者进一步探索。
212 0
|
2月前
|
XML 存储 缓存
记一次雪花算法遇到的 生产事故!
最近生产环境遇到一个问题: 现象:创建工单、订单等地方,全都创建数据失败。 初步排查:报错信息为duplicate key,意思是保存数据的时候,报主键 id 重复,而这些 id 都是由雪花算法生成的,按道理来说,雪花算法是生成分布式唯一 ID,不应该生成重复的 ID。
104 5