开启ActiveRecord之旅
ActiveRecord简介
ActiveRecord操作步骤
实体类只需要继承Model即可;
User类继承Model类
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("user")
public class User extends Model<User> implements Serializable{
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 姓名
*/
@TableField("name")
private String name;
/**
* 年龄
*/
@TableField("age")
private Integer age;
/**
* 邮箱
*/
@TableField("email")
private String email;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(value = "creat_time", fill = FieldFill.INSERT)
private Date creatTime;
@TableField("deleted")
// @TableLogic
private Integer deleted;
}
通过AR即实体对象来操作方法
1.查询
(1)通过id进行查询
User user=new User();
user.setId(2l);
User user1 = user.selectById();
System.out.println(user1);
运行的SQL
(2)通过条件进行查询
User user=new User();
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("age",23);
List<User> userList = user.selectList(queryWrapper);
for (User user1 : userList) {
System.out.println(user1);
}
运行SQL
2.新增数据
User user=new User();
user.setName("宋江");
user.setAge(112);
user.setEmail("13@qq.com");
boolean result = user.insert();
System.out.println(result);
运行的SQL
3.更新
通过id进行更新
User user=new User();
user.setId(16l);
user.setAge(56);
boolean result = user.updateById();
System.out.println(result);
运行的SQL
4.删除
通过id进行删除
User user=new User();
user.setId(5l);
boolean result = user.deleteById();
System.out.println(result);
运行SQL
逻辑删除
逻辑删除理解
实现步骤
1.在数据表中增加一个deleted字段
2.实体类中增加对应的属性和注解
@TableLogic //逻辑删除
private Integer deleted;
3.配置
//配置逻辑删除
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
4.测试
(1.删除)
User user=new User();
boolean result = user.deleteById(1l);
System.out.println(result);
运行的SQL语句,走的是set而不是delete
(2.查询)
会自动过滤掉deleted=1的部分,即过滤掉逻辑删除的部分
User user=new User();
User user1 = user.selectById(1l);
System.out.println(user1);
运行的SQL语句
mybatis-plus插件
sql性能分析插件
配置
可以写测试语句进行测试,如果运行时间太长就会报错
自动填充(如创建时间和修改时间)
(1)类属性上增加填充注解
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@TableField(value = "creat_time", fill = FieldFill.INSERT)
private Date creatTime;
(2)设置填充处理器
@Slf4j //日志
@Component //添加到spring中
public class MyMetaObjectHandler implements MetaObjectHandler {
// 插入填充
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill...");
setFieldValByName("creatTime",new Date(),metaObject);
setFieldValByName("updateTime",new Date(),metaObject);
}
// 更新填充
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill...");
setFieldValByName("updateTime",new Date(),metaObject);
}
}
乐观锁
(1)定义
(2)乐观锁实现机制
(3)实现步骤
(1)数据库增加version字段
(2)类增加相应的version字段和乐观锁注解
@Version //乐观锁字段
private Integer version;
(3)注册乐观锁插件
@Bean //注册乐观锁插件
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
(4)测试
①单线程测试乐观锁成功:
User user = userMapper.selectById(2l);
user.setName("勇勇");
user.setAge(22);
int result = userMapper.updateById(user);
System.out.println(result);
运行的SQL
②多线程测试乐观锁失败:
User user1 = userMapper.selectById(2l);
user1.setName("勇勇");
user1.setAge(22);
//插队更新
User user2 = userMapper.selectById(2l);
user2.setName("西西");
user2.setAge(21);
userMapper.updateById(user2);
int result = userMapper.updateById(user1); //user1更新失败
MybatisX快速开发插件
简介
MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。
安装
安装方法:打开 IDEA,进入 File -> Settings -> Plugins -> Browse Repositories,输入 mybatisx
搜索并安装。
功能
1.java与XML来回跳转
2.Mapper方法自动生成XML
通用枚举
简介
比如男、女;小学、初中、高中这样的类别可以使用枚举
使用步骤
1.数据库增加枚举字段
如int类型sex
2.类中增加相应属性
@TableField("sex")
private SexEnum sex;
3.在enums中创建枚举类SexEnum继承IEnum
package com.yong.user.enums;
import com.baomidou.mybatisplus.annotation.IEnum;
public enum SexEnum implements IEnum<Integer> {
MAN(1,"男"),
WOMAN(0,"女");
private int value;
private String desc;
SexEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
@Override
public String toString() {
return this.desc;
}
@Override
public Integer getValue() {
return this.value;
}
}
4.配置含有枚举类的扫描包
mybatis-plus:
type-enums-package: com.yong.user.enums
5.测试
(1)插入用户
User user=new User();
user.setAge(22);
user.setName("貂蝉");
user.setEmail("12@qq.com");
user.setSex(SexEnum.WOMAN);
boolean result = user.insert();
System.out.println(result);
运行SQL结果
(2)查询用户
①一般查询
User user=new User();
user.setId(23l);
User user1 = user.selectById();
System.out.println(user1);
运行结果
②在查询条件中也是有效的
User user=new User();
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("sex",SexEnum.WOMAN);
List<User> userList = user.selectList(queryWrapper);
for (User user1 : userList) {
System.out.println(user1);
}
运行结果