(四)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
  • 数据库表设计

  • 实体类
/**
 * @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);
    }

(2)id_workder_String(分布式)
  • 数据库表设计

  • 实体类
/**
 * @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)uuid
  • 数据库表设计

  • 实体类

/**
 * @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);
    }

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

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

@TableName 说明表名称。

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

  • 表:

  • 实体类
/**
 * @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;

  • 测试类
    /**
     * 添加操作
     */
    @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)]

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

  • 实体类
@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;

  • 测试类
  /**
     * 添加操作
     */
    @Test
    public void  insertDeptTest(){
        Dept dept = new Dept();
        dept.setDeptName("销售表");
        dept.setDeptMobile("1235678");
        dept.setDeptManager(2);
        boolean insert = dept.insert();
        System.out.println(insert);
    }
  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小王java

学习java的路上,加油!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值