😄看本博客之前,建议先看
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
数据库表设计
实体类
/** * @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); }
三、驼峰命名方式解决映射问题
表
实体类
@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); }