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

简介: 😄看本博客之前,建议先看1️⃣Mybatis-plus(MP)中CRUD操作保姆级笔记2️⃣mybatisPlus实现ActiveRecord(AR)操作笔记3️⃣mybatisPlus自定义Sql语句🍅 作者:程序员小王🍅 程序员小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步🍅 欢迎点赞 👍 收藏 ⭐留言 📝🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕

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

主键

TableName

TableId


一、主键类型

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


1.none 没有主键

2.auto 自动增长(mysql,sql sever)

3.input 手工输入

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

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

6.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

数据库表设计

0.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);
    }

1.png


(2)id_workder_String(分布式)

数据库表设计

2.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);
    }

3.png


(3)uuid

数据库表设计

4.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);
    }


5.png

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

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


@TableName 说明表名称。


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


表:

6.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;

7.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);
    }


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h79TljsP-1636353892225)(image/image_8.png)]


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

8.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;


9.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);
    }
相关文章
|
3月前
|
算法 Go
[go 面试] 雪花算法与分布式ID生成
[go 面试] 雪花算法与分布式ID生成
|
11天前
|
NoSQL 算法 关系型数据库
分布式 ID 详解 ( 5大分布式 ID 生成方案 )
本文详解分布式全局唯一ID及其5种实现方案,关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
分布式 ID 详解 ( 5大分布式 ID 生成方案 )
|
9天前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
10天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
20天前
|
存储 缓存 NoSQL
分布式架构下 Session 共享的方案
【10月更文挑战第15天】在实际应用中,需要根据具体的业务需求、系统架构和性能要求等因素,选择合适的 Session 共享方案。同时,还需要不断地进行优化和调整,以确保系统的稳定性和可靠性。
|
30天前
|
算法
基于粒子群算法的分布式电源配电网重构优化matlab仿真
本研究利用粒子群算法(PSO)优化分布式电源配电网重构,通过Matlab仿真验证优化效果,对比重构前后的节点电压、网损、负荷均衡度、电压偏离及线路传输功率,并记录开关状态变化。PSO算法通过迭代更新粒子位置寻找最优解,旨在最小化网络损耗并提升供电可靠性。仿真结果显示优化后各项指标均有显著改善。
|
14天前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
26 0
|
28天前
|
SQL NoSQL 安全
分布式环境的分布式锁 - Redlock方案
【10月更文挑战第2天】Redlock方案是一种分布式锁实现,通过在多个独立的Redis实例上加锁来提高容错性和可靠性。客户端需从大多数节点成功加锁且总耗时小于锁的过期时间,才能视为加锁成功。然而,该方案受到分布式专家Martin的质疑,指出其在特定异常情况下(如网络延迟、进程暂停、时钟偏移)可能导致锁失效,影响系统的正确性。Martin建议采用fencing token方案,以确保分布式锁的正确性和安全性。
36 0
|
3月前
|
存储 NoSQL Java
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这篇文章是关于Java面试中的分布式架构问题的笔记,包括分布式架构下的Session共享方案、RPC和RMI的理解、分布式ID生成方案、分布式锁解决方案以及分布式事务解决方案。
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
|
3月前
|
存储 算法 NoSQL
(七)漫谈分布式之一致性算法下篇:一文从根上儿理解大名鼎鼎的Raft共识算法!
Raft通过一致性检查,能在一定程度上保证集群的一致性,但无法保证所有情况下的一致性,毕竟分布式系统各种故障层出不穷,如何在有可能发生各类故障的分布式系统保证集群一致性,这才是Raft等一致性算法要真正解决的问题。
109 11
下一篇
无影云桌面