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