MyBatis-Plus笔记(下)
注解
@tablename注解
- 描述:表名注解,标识实体类对应的表
- 使用位置:实体类
代码举例:
@TableName//可以不加,使用实体类的名字作为表名!忽略大小写
//BaseMapper->User实体类-》实体类名-》表名数据库操作
//当数据库的表名和实体类命名不同(忽略大小写),使用@TableName注解指定表名
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
@TableId注解
应用场景:①当主键的列名与属性名不一致时,②主键生成策略不是默认策略
- 描述:主键注解
- 使用位置:实体类主键字段
例如
@TableName("sys_user")
/**
*默认使用雪花算法:
*①数据库的主键是bigint/varchar(64)类型
*②对应实体类的属性是Long类型
*③随机生成一个数字,给与主键值(不重复)
*Auto
①mysql数据库创建表的主键列的时候,类型为数字,还要加上auto_increment
②插入数据自动增长。
*/
public class User {
@TableId(value="主键列名",type=主键策略)
private Long id;
private String name;
private Integer age;
private String email;
}
|属性| | 类型 | |必须指定 | |默认值| | 描述| |
|value| | String| | 否 | |""| | 主键字段名| |
|type | Enum | |否 | dType.NONE| | 指定主键类型 |
IdType属性可选值:
|值 | |描述| |
|AUTO | |数据库 ID 自增 (mysql配置主键自增长)| |
|ASSIGN_ID(默认) | |分配 ID(主键类型为 Number(Long )或 String)(since 3.3.0),使用接口`IdentifierGenerator`的方法`nextId`(默认实现类为`DefaultIdentifierGenerator`雪花算法)| |
雪花算法:随机生成一个long类型不重复的数字
全局配置修改主键策略:
mybatis-plus:
configuration:
# 配置MyBatis日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
# 配置MyBatis-Plus操作表的默认前缀
table-prefix: t_
# 配置MyBatis-Plus的主键策略,全局件主键设置为自增长策略
id-type: auto
@TableFiled使用
描述:字段注解(非主键)
举例:
@TableName("sys_user")
public class User {
@TableId
private Long id;
private String name;
private Integer age;
private String email;
@TableField(value="password",exist="false")
private int password;//在数据库中没有对应的列
}
TableField中的属性 | 类型 | 必须指定 | 默认值 | 描述 |
Value | String | 否 | "" | 数据库字段名 |
Exist | boolean | 否 | true | 是否为数据库表字段 |
**MyBatis-Plus会自动开启驼峰命名风格映射!!!**
逻辑删除的实现
步骤:
①数据库和实体类添加逻辑删除字段(约定字段值为1时逻辑删除,为0时未逻辑删除)
②在对应删除字段的属性上加一个@TableLogic注解(添加该注解后,我们在做删除操作时mybatis会自定将删除语句改为修改逻辑删除字段的修改语句)
每个表都会有逻辑删除,那么对应的每个表的实体类都会有一个deleted(逻辑删除字段);所以我们可以全局指定,这样就不用在每个表的逻辑删除字段上加@TableLogic注解了
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除的实体字段名(属性名)(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
代码举例:
public class User {
private Long id;
private String name;
private Integer age;
private String email;
/**
* 当前属性对应的列就是逻辑删除的状态字段,
* 当删除数据时,自动变为修改此列的属性值,默认0未删除;1删除
* 当你查询数据的时候,默认只查询delete=0的数据
*/
//逻辑删除字段
@TableLogic
private Integer deleted;
}
乐观锁
思想
乐观锁的基本思想是,认为并发冲突的概率较低,因此不需要提前加锁,而是在数据更新阶段进行冲突检测和处理。乐观锁的核心思想是"先修改,后校验"。在乐观锁的应用中,线程在读取共享资源时不会加锁,而是记录特定的版本信息。
悲观锁的基本思想是,在整个数据访问过程中,将共享资源锁定,以确保其他线程或进程不能同时访问和修改该资源。悲观锁的核心思想是"先保护,再修改"。在悲观锁的应用中,线程在访问共享资源之前会获取到锁,并在整个操作过程中保持锁的状态,阻塞其他线程的访问。
使用乐观锁
启动类
@SpringBootApplication
@MapperScan("com.atguigu.mapper")
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class,args);
}
/**
* 将mybatis-plus插件导入到ioc容器步骤:
* ①创建一个方法,在该方法中创建一个装所有插件的对象mybatisPlusInterceptor
* 在方法中通过该对象添加想要的插件
* ②返回该对象,同时将该对象加入到ioc容器中
*
* 使用乐观锁的步骤:
* ①导入乐观锁插件(在启动类中)
* ②在实体类对应乐观锁字段的属性上添加@Version注解
* 注意:是实体类对应的数据库表也要添加一个乐观锁列
* ③正常更新使用
*/
//将mybatis-plus插件导入到ioc容器
@Bean
public MybatisPlusInterceptor plusInterceptor(){
//创建一个mybatis-plus插件集合,所有的插件都集中在此(分页插件,乐观锁插件...)
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//添加乐观锁(版本号)插件;mybatis-plus会在更新的时候,每次帮我们对比版本号字段和让版本号加1
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
实体类
@TableName//可以不加,使用实体类的名字作为表名!忽略大小写
//BaseMapper->User实体类-》实体类名-》表名数据库操作
//当数据库的表名和实体类命名不同(忽略大小写),使用@TableName注解指定表名
public class User {
private Long id;
private String name;
private Integer age;
private String email;
/**
* 当前属性对应的列就是逻辑删除的状态字段,
* 当删除数据时,自动变为修改此列的属性值,默认0未删除;1删除
* 当你查询数据的时候,默认只查询delete=0的数据
*/
//逻辑删除字段
@TableLogic
private Integer deleted;
@Version
private Integer version;
}
防止全表数据伤处删除与更新
针对 update 和 delete 语句 作用: 阻止恶意的全表更新删除
添加一个防止全表更新删除的拦截器(也是一个插件)
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
return interceptor;
}
}