文章目录
MybatisPlus的知识点
通过使用dao的接口来调用方法
- insert() 给数据库中插入某个元素或对象
- deleteById() 通过id进行产删除
- updateById(Object) 修改元素的某项值
- selectById() 通过id来进行查询
- selectList(null) 查询所有
常用注解
- @Data,为当前实体类在编译期设置对应的get/set方法,无参/无参构造方法,toString方法,
hashCode方法,equals方法等
分页功能
- 在配置类中设置响应的拦截器,就可以实现分页功能
@Configuration //确保可以被配置类扫描到
public class MybatisPlusConfig {
//制作分页拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
//1.定义MP拦截器
MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
//2.添加具体的拦截器
mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); //添加分页的拦截器
mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); //添加乐观锁的拦截器
return mpInterceptor;
}
- 实现分页查询
//分页查询
@Test
void testSelectPage(){
//1 创建IPage分页对象,设置分页参数
IPage<User> page=new Page<>(1,3);
//2 执行分页查询
userDao.selectPage(page,null);
//3 获取分页结果
System.out.println("当前页码值:"+page.getCurrent());
System.out.println("每页显示数:"+page.getSize());
System.out.println("总页数:"+page.getPages());
System.out.println("总条数:"+page.getTotal());
System.out.println("当前页数据:"+page.getRecords());
}
条件查询方式
按条件查询
- mybatisplus将条件查询的条件封装在Wrapper中,从而进行条件查询
- 方式一
QueryWrapper qw = new QueryWrapper();
qw.lt("age", 18); //添加条件,age<18
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
- 方式二:lambda格式条件查询
//方式二:lambda格式条件查询
QueryWrapper<User> wq = new QueryWrapper<>();
wq.lambda().lt(User::getAge,10);
List<User> userList = userDao.selectList(wq);
System.out.println(userList);
- 也可以添加多个条件
` lqw.lt(User::getAge, 30);
lqw.gt(User::getAge,10); //年龄大于10小于30`
lqw.lt(User::getAge,10).or().gt(User::getAge,30); //或者关系
and //并且关系
NULL值处理
- 如果有的条件为null,也要执行sql
//condition条件为真,则执行后面的条件。条件为假则不执行任何操作
lqw.lt(null!=uq.getAge2(), User::getAge, uq.getAge2());
lqw.gt(null!=uq.getAge(), User::getAge,uq.getAge());
查询投影
- LambdaQueryWapper只能查询字段内中的属性名
- QueryWrapper可以查询字段名和一些函数
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
//显示某些字段,这种格式只适用与Lambda格式
lqw.select(User::getId,User::getUsername,User::getAge);
// QueryWrapper<User> qw = new QueryWrapper<>();
// qw.select("id","username","age","tel");
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
- 分组求和
qw.select("count(*) as count","gender");
qw.groupBy("gender"); //按性别分组
List<Map<String, Object>> userList = userDao.selectMaps(qw);
查询条件的设定
- 范围匹配(> 、 = 、between)
- 模糊匹配(like)
- 空判定(null)
- 包含性匹配(in)
- 分组(group)
- 排序(order)
- eq表示==,相等
wrapper.eq("username", "周周"); //username==周周
-
范围查询 lt le(<=) gt ge(>=) eq between
-
删除 ,通过id删除
list.add(18);
list.add(19);
userDao.deleteBatchIds(list);
字段映射与表名映射
- 在模型类属性上方,使用@TableField属性注解,通过value属性,设置当前属性对应的数据库表中的字段关系。
@TableField(value = “password”,select = false) //将密码暴露很危险,不能被轻易查询 - 使实体类类名与数据表表名对应
@TableName(value = “tb_user”)
id生成策略(insert)
逻辑删除(Delete/Update)
- 逻辑删除:为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中
//逻辑删除字段,记录当前字段是否被删除
@TableLogic(value = "0",delval = "1")
private int deleted;
乐观锁
乐观锁主张的思想是什么?
- 业务并发现象带来的问题:秒杀
- 使用@Version来定义一个乐观锁的字段
//添加乐观锁
@Version
private Integer version;
- 在配置类中添加拦截器
//2.添加乐观锁拦截器
mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
- 添加乐观锁后,操作成功后,version会+1, 当要操作同一个值时
//1.先通过要修改的数据id将当前数据查询出来
User user = userDao.selectById(3L); //version=3
User user2 = userDao.selectById(3L); //version=3
user2.setName("Jock aaa");
userDao.updateById(user2); //version=>4
user.setName("Jock bbb");
userDao.updateById(user); //verion=3?条件还成立吗?