主键生成策略
1、 测试添加一条数据
@Test
void testSave() {
User user = new User();
user.setName("will");
user.setAge(3);
user.setEmail("abc@163.com");
int result = userMapper.insert(user); // 帮我们自动生成ID
System.out.println(result); // 受影响的行数
System.out.println(user); // id,自动回填
}
2、 所有主键生成策略介绍
public enum IdType {
AUTO(0), // 数据库id自增
NONE(1), // 未设置主键
INPUT(2), // 手工输入
ID_WORKER(3), // 默认的全局唯一id
UUID(4), // 全局唯一的id uuid
ID_WORKER_STR(5); // ID_WORKER的字符串表示法
}
3、 默认主键生成策略ID_WORK
雪花算法:
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。具体实现的代码可以参看https://github.com/twitter/snowflake。雪花算法支持的TPS可以达到419万左右(2^22*1000)。
4、 自增策略AUTO
修改实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.AUTO)
private Long id; // 对应数据库
private String name;
private Integer age;
private String email;
}
数据库表字段一定要是自增!
再次测试添加操作
5、 手工输入策略INPUT
修改实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.INPUT)
private Long id; // 对应数据库
private String name;
private Integer age;
private String email;
}
数据库表字段取消自增!
修改添加操作代码
@Test
void testSave() {
User user = new User();
user.setId(10L);
user.setName("will");
user.setAge(3);
user.setEmail("abc@163.com");
int result = userMapper.insert(user); // 帮我们自动生成ID
System.out.println(result); // 受影响的行数
System.out.println(user); // id,自动回填
}
再次测试添加操作
更新操作测试
1、 编码
// 更新测试
@Test
void testUpdate() {
User user = new User();
user.setId(10L);
user.setName("will123");
user.setAge(3);
user.setEmail("abc@163.com");
userMapper.updateById(user);
}
2、 测试根据ID更新,观察生成语句
3、 观察数据库
自动填充处理
创建时间、修改时间等字段,这些字段的更新一般都是自动化完成的,不希望手动更新!
方式一:数据库级别
1、在表中新增字段create_time、update_time
2、更新实体类,添加字段createTime、updateTime
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.INPUT)
private Long id; // 对应数据库
private String name;
private Integer age;
private String email;
private Date createTime;
private Date updateTime;
}
3、再次执行更新操作
4、查看更新结果
方式二:代码级别
1、 删除数据库默认值,更新操作
2、 更新实体类,使用注解
package com.will.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@TableId(type = IdType.INPUT)
private Long id; // 对应数据库
private String name;
private Integer age;
private String email;
// 字段填充内容
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
3、 编写填充策略
package com.will.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component //一定不要忘记把处理器加入ICO容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
// 插入时的填充策略
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
// 更新时候的填充策略
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
4、 测试添加一条数据,观察创建时间
@Test
void testSave() {
User user = new User();
user.setId(11L);
user.setName("will01");
user.setAge(3);
user.setEmail("abc@163.com");
int result = userMapper.insert(user); // 帮我们自动生成ID
System.out.println(result); // 受影响的行数
System.out.println(user); // id,自动回填
}