MybatisPlus
MyBatisPlus
建议一些很简单的crud可以用mp写,稍微复杂一点点带各种参数和范围的在dao里面写,很复杂的动态sql就用xml写
介绍
MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率
特性
- 无侵入︰只做增强不做改变,不会对现有工程产生影响
- 强大的CRUD操作:内置通用Mapper,少量配置即可实现单表CRUD操作
- 支持Lambda:编写查询条件无需担心字段写错
- 支持主键自动生成
- 内置分页插件
入门案例
- 导坐标
- 在dao层对应的接口中写@Mapper,继承BaseMapper<Pojo类>即可
注意事项
数据库的表名要和实体类类名(实体类类名)一样
表中的主键id要改成bigint类型,实体类中的id要改成Long类型
分页查询时要添加分页查询的拦截器
映射匹配兼容性
- 表中字段名和类中的属性名不一样,在类对应的属性上方添加
- @TableField(value=“表中对应的字段名”)
- 类中添加了数据库中未定义的属性,在类对应的属性上方添加
- @TableField(exist = false)
- 数据库的表名和类名不一样,在类名上方添加
- @TableName(“数据库中对应的表名”)
条件查询
普通条件查询
- 创建一个条件查询对象:LambdaQueryWrapper<Pojo类> 条件对象名=new LambdaQueryWrapper<Pojo类>()
- 配合lambda表达式和mybatisplus的提供的条件查询函数写条件进行查询
如:
1
2
3
4
5
6
7
8
9
10
11
12
13public void testGetByCondition(){
LambdaQueryWrapper<People> lqw = new LambdaQueryWrapper<>();
//条件:小于20岁
//lqw.lt(People::getAge,20);
//条件:20岁-30岁之间
//lqw.lt(People::getAge,30).gt(People::getAge,20);
//条件:小于20或者大于30
lqw.lt(People::getAge,20).or().gt(People::getAge,30);
System.out.println(peopleDao.selectList(lqw));
}
条件查询null值判断
- 在条件查询函数前添加一个Boolean值判断的条件即可
MP和Sql的对应
官网:https://baomidou.com/pages/10c804/#between
lt() 等价于 <
gt() 等价于 >
le() 等价于 <=
ge() 等价于 >=
eq() 等价于 =
between() 等价于 betwen
. 等价于 and
or() 等价于 or
likeLeft 等价于 %like
likeRight 等价于 like%
CRUD
增
- insert(entity)
删除
deleteById(id):根据id删除记录
deleteBatchIds(ids):根据传入List集合中的id进行批量删除
delete(queryWrapper):更具条件删除
deleteByMap(map):根据Map中的条件进行删除,map中的条件在sql语句中是and关系
1
2
3
4
5Map<String,Object> map=new HashMap<>();
map.put("emp_gender","男");
map.put("emp_name","卢家业");
employeeMapper.deleteByMap(map);
//等价于 delete from employee where emp_gender=“男” and emp_name=“卢家业”
查
selectById(id):根据id查询指定记录
selectBatchIds(ids):批量查询指多个id的记录集合
selectByMap(map):根据Map集合中传入的条件进行查询,每个条件都是and关系
selectOne(queryWrapper):更具条件查询一条符合的数据
selectList(queryWrapper):更具条件查询全部符合的数据
selectPage(page,queryWrapper):更具分页条件和查询条件分页查询(记得要先搞分页查询的拦截器MybatisPlusInterceptor)
1
2
3
4
5LambdaQueryWrapper<Course> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Course::getCourseName,"卢家业");
Page<Course> page = new Page<>(1, 10);
courseBaseMapper.selectPage(page, queryWrapper);
//等价于 SELECT * FROM course WHERE course_name = “卢家业” LIMIT 0, 10;
改
- updateById(entity):根据id进行记录更新,如果对象属性未传值,则不会更新该字段,保持数据库表原来字段值
- update(entity,wrapper):更具更新条件wrapper进行更新。
其他
id生成策略控制
- @TableId(type = IdType.需要的生成策略)
逻辑删除
- 逻辑删除:为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中
- @TableLogic(value = “默认值”,delval = “删除后的值”)
乐观锁
- 作用:防止业务并发现象带来的问题
- 步骤
- 在数据库中添加乐观锁标记字段
- 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段(@Version)
- 配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装(OptimisticLockerInnerInterceptor)
- 使用乐观锁机制在修改前必须先获取到对应数据的verion方可正常进行
代码生成器