添加操作
@Test public void insert(){ User user=new User(); user.setName("niuzai"); user.setAge(12); user.setEmail("231231@qq.com"); //返回影响行数 int i = userMapper.insert(user); System.out.println(i); } 复制代码
特别注意,在MP中主键生成的策略
雪花算法
网络异常,图片无法展示
|
网络异常,图片无法展示
|
也可以使用在实体类中的id上做注解配置主键生成策略\
@TableId(type=IdType.XXX)
例如
ASSIGN_ID 自动分配19位的id
ASSIGN_UUID
AUTO 自动增长
INPUT 自己输入
修改操作
@Test public void updateByID(){ User user=new User(); user.setId(1385515096112947202L); user.setName("niushi"); int i = userMapper.updateById(user); System.out.println(i); } 复制代码
自动填充
网络异常,图片无法展示
|
为了测试,先在数据库的表中添加create_time ,update_time字段
在实体类添加对应属性,然后在属性上进行添加自动填充的属性注释
@TableField(fill = FieldFill.INSERT ) private Date createTime; @TableField(fill=FieldFill.INSERT_UPDATE) private Date updateTime; 复制代码
然后创建类,实现接口添加两个方法,重写MetaObjectHandler中的insertFill和updateFill
@Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { //mp执行添加操作时自动填充往create_time字段中添加时间 this.setFieldValByName("createTime",new Date(),metaObject); } @Override public void updateFill(MetaObject metaObject) { //mp执行更新和添加时都要自动填充时间,因为在user实体类中进行了相关操作 this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); } 复制代码
乐观锁
主要适用场景:当更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新;
乐观锁实现方式: 取出记录时,获取当前的version,更新时,带上version,执行更新时,set version= new Version where version =old version 如果版本不对,就更新失败。
补充:使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。
实现案例
- 首先在数据库中的字段里添加version字段
- 在实体类中添加version,并在其上方添加@version注释
- 通过version控制修改更新,进行乐观锁操作
@Version
private Integer version;
- 在insert时也自动填入默认版本值
@Override public void insertFill(MetaObject metaObject) { //mp执行添加操作时自动填充往create_time字段中添加时间 this.setFieldValByName("createTime",new Date(),metaObject); //添加数据时默认数据版本为1 this.setFieldValByName("version",1,metaObject); } 复制代码
- 创建配置config,注入Bean,配置乐观锁
@Configuration @MapperScan("com.zeus.demomp.mapper") public class MpConfig { //配置乐观锁插件 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor(); } } 复制代码
- 进行测试,先进行查询后进行更新操作,比较version值是否更新
public void testOptimisticLocker(){ //先通过查询 User user = userMapper.selectById(1385609705744887809L); //再修改值 user.setName("LG"); //进行更新操作 userMapper.updateById(user); }