Mybatis-plus中的DML编程控制–增删改的高级操作
1、Insert
1.1、id生成策略控制
- 不同的表应用不同的id生成策略
- 日志:自增(1,2,3,4,…)
- 购物订单:特殊规则( FQ23948AK3843)
- 外卖单:关联地区日期等信息(10 04 20200314 34 91)
- 关系表:可省略id
- ······
- 名称:
@TableId
- 类型:属性注解
- 位置:模型类中用于表示主键的属性定义上方
- 作用:设置当前类中主键属性的生成策略
- 代码段:
package com.mannor.mybatis_plus_demo.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
public class User {
@TableId(type = IdType.AUTO) //指定Id为自增属性,不然产生一个很大的数字来作为主键
private Long id;
}
- 相关属性
- value:设置数据库主键名称
- type:设置主键属性的生成策略,值参照IdType枚举值
ID生成策略:
1. AUTO(0)︰使用数据库id自增策略控制id生成NONE(1):不设置id生成策略
2. INPUT(2):用户手工输入id
3. ASSIGN_ID(3):雪花算法生成id(可兼容数值型与字符串型)
4. ASSIGN_UUID(4):以UUID生成算法作为id生成策略
防止为了大量的实体类使用这种会显得麻烦,所以可以在配置类上进行设定:
mybatis-plus.global-config.db-config.id-type: auto
同时,亦可以设置表名前缀:tableprefix:tb_(简写)
2、Delete
2.1、多记录删除
@Test
void testDeleteList() {
List<Long> list = new ArrayList<>();
list.add(1L);
list.add(6L);
userDao.deleteBatchIds(list);
}
多记录查询也是类似
2.2、逻辑删除
- 删除操作业务问题:业务数据从数据库中丢弃,关联的数据也会被删除掉
- 逻辑删除:为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中
- 在数据库中添加一个字段,设置默认值为0,1表示删除;
- 在对应的实体类中添加字段,并且添加
@TableLogic
注解
package com.mannor.mybatis_plus_demo.pojo;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long Id;
//逻辑删除字段,标记当前记录是否被删除
@TableLogic(value = "0",delval = "1")
private Integer deleted;
}
增加此操作之后,执行delete操作,底层就会替换成update操作,将deleted字段值改为1,实现了逻辑删除。
在对该表执行查询操作的时候,也不会查询到delete为1的记录,相当于添加了where deleted=1
。
同理:也可以在yml文件中进行全局配置,键入logic等待提示(自行操作)。
3、Update过程中的并发现象
3.1、乐观锁
- 业务并发现象带来的问题:秒杀(并发访问)
在MP中使用乐观锁的实现,本质上是在SQL语句上添加了version=version+1,此种方法可以解决2000以下的并发。
具体实现:文章来源:https://www.toymoban.com/news/detail-585969.html
- 在数据库表中添加version字段,设置默认值为1;
- 在对应的实体类中添加version字段,并且在上面填加@Version注解;
- 实现一个生成拦截器的构造类;
package com.mannor.mybatis_plus_demo.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MPConfig {
@Bean
public MybatisPlusInterceptor mpInterceptor() {
// 1.定义拦截器
MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
// 2.定义具体的拦截器
mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());// 分页的拦截器
// 3.添加乐观锁拦截器
mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mpInterceptor;
}
}
此时,控制并发的操作已经完成,所有查询的用户会拿到version的值,操作时会比对拿到的version与数据库中的version比对,操作之后Version=version+1,所以有且只有一个用户会修改到数据库(当version特定的时候,如秒杀到最后一个)。文章来源地址https://www.toymoban.com/news/detail-585969.html
到了这里,关于Mybatis-plus中的DML编程控制--增删改的高级操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!