MyBatisPlus

建议一些很简单的crud可以用mp写,稍微复杂一点点带各种参数和范围的在dao里面写,很复杂的动态sql就用xml写

介绍

  • 官网:https://mybatis.plus/ 或者https://mp.baomidou.com/

  • MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率

  • 特性

    • 无侵入︰只做增强不做改变,不会对现有工程产生影响
    • 强大的CRUD操作:内置通用Mapper,少量配置即可实现单表CRUD操作
    • 支持Lambda:编写查询条件无需担心字段写错
    • 支持主键自动生成
    • 内置分页插件

入门案例

  1. 导坐标
  2. 在dao层对应的接口中写@Mapper,继承BaseMapper<Pojo类>即可

注意事项

  • 数据库的表名要和实体类类名(实体类类名)一样

  • 表中的主键id要改成bigint类型,实体类中的id要改成Long类型

  • 分页查询时要添加分页查询的拦截器

映射匹配兼容性

  • 表中字段名和类中的属性名不一样,在类对应的属性上方添加
    • @TableField(value=“表中对应的字段名”)
  • 类中添加了数据库中未定义的属性,在类对应的属性上方添加
    • @TableField(exist = false)
  • 数据库的表名和类名不一样,在类名上方添加
    • @TableName(“数据库中对应的表名”)

条件查询

普通条件查询

  1. 创建一个条件查询对象:LambdaQueryWrapper<Pojo类> 条件对象名=new LambdaQueryWrapper<Pojo类>()
  2. 配合lambda表达式和mybatisplus的提供的条件查询函数写条件进行查询
  • 如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public 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
    5
    Map<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
    5
    LambdaQueryWrapper<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方可正常进行

代码生成器