mybatis条件构造器(EntityWrapper)的使用方式

 更新时间:2022年03月22日 11:13:28   作者:愿你天黑有灯下雨有伞  
这篇文章主要介绍了mybatis条件构造器(EntityWrapper)的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mybatis条件构造器(EntityWrapper)使用

基本的 CRUD 操作,我们仅仅需要继承一个 BaseMapper 即可实现大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法供使用, 可以极其方便的实现单一、批量、分页等操作,极大的减少开发负担。

但是mybatis-plus的强大不限于此,请看如下需求该如何处理:

需求

我们需要分页查询 tb_employee 表中,年龄在 18~50 之间性别为男且姓名为 xx 的所有用户,这时候我们该如何实现上述需求呢?

使用MyBatis : 需要在 SQL 映射文件中编写带条件查询的 SQL,并用PageHelper 插件完成分页. 实现以上一个简单的需求,往往需要我们做很多重复单调的工作。

使用MP: 依旧不用编写 SQL 语句,MP 提供了功能强大的条件构造器 ------ EntityWrapper。

直接看几个案例体会EntityWrapper的使用

1、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:

List<Employee> employees = emplopyeeDao.selectPage(new Page<Employee>(1,3),
     new EntityWrapper<Employee>()
        .between("age",18,50)
        .eq("gender",0)
        .eq("last_name","tom")
);

注:由此案例可知,分页查询和之前一样,new 一个page对象传入分页信息即可。至于分页条件,new 一个EntityWrapper对象,调用该对象的相关方法即可。between方法三个参数,分别是column、value1、value2,该方法表示column的值要在value1和value2之间;eq是equals的简写,该方法两个参数,column和value,表示column的值和value要相等。注意column是数据表对应的字段,而非实体类属性字段。

2、查询gender为0且名字中带有老师、或者邮箱中带有a的用户:

List<Employee> employees = emplopyeeDao.selectList(
                new EntityWrapper<Employee>()
               .eq("gender",0)
               .like("last_name","老师")
                //.or()//和or new 区别不大
               .orNew()
               .like("email","a")
);

注:未说分页查询,所以用selectList即可,用EntityWrapper的like方法进行模糊查询,like方法就是指column的值包含value值,此处like方法就是查询last_name中包含“老师”字样的记录;“或者”用or或者orNew方法表示,这两个方法区别不大,用哪个都可以,可以通过控制台的sql语句自行感受其区别。

3、查询gender为0,根据age排序,简单分页:

List<Employee> employees = emplopyeeDao.selectList(
                new EntityWrapper<Employee>()
                .eq("gender",0)
                .orderBy("age")//直接orderby 是升序,asc
                .last("desc limit 1,3")//在sql语句后面追加last里面的内容(改为降序,同时分页)
);

注:简单分页是指不用page对象进行分页。orderBy方法就是根据传入的column进行升序排序,若要降序,可以使用orderByDesc方法,也可以如案例中所示用last方法;last方法就是将last方法里面的value值追加到sql语句的后面,在该案例中,最后的sql语句就变为select ······ order by desc limit 1, 3,追加了desc limit 1,3所以可以进行降序排序和分页。

4、分页查询年龄在18 - 50且gender为0、姓名为tom的用户:

条件构造器除了EntityWrapper,还有Condition。用Condition来处理一下这个需求:

 List<Employee> employees = emplopyeeDao.selectPage(
                new Page<Employee>(1,2),
                Condition.create()
                        .between("age",18,50)
                        .eq("gender","0")
 );

注:Condition和EntityWrapper的区别就是,创建条件构造器时,EntityWrapper是new出来的,而Condition是调create方法创建出来。

5、根据条件更新:

@Test
public void testEntityWrapperUpdate(){
        Employee employee = new Employee();
        employee.setLastName("苍老师");
        employee.setEmail("cjk@sina.com");
        employee.setGender(0);
        emplopyeeDao.update(employee,
                new EntityWrapper<Employee>()
                .eq("last_name","tom")
                .eq("age",25)
        );
}

注:该案例表示把last_name为tom,age为25的所有用户的信息更新为employee中设置的信息。

6、根据条件删除:

emplopyeeDao.delete(
        new EntityWrapper<Employee>()
        .eq("last_name","tom")
        .eq("age",16)
);

注:该案例表示把last_name为tom、age为16的所有用户删除

Wrappers使用的坑点

假设param对象中存在一个list集合,如果list集合不为空是时,取list集合最后一条的数据作为条件

public void test(Param param){
    LambdaQueryWrapper<TeacherModel> wrapper = Wrappers.lambdaQuery();
    wrapper.eq(collUtil.isNotEmpty(param.getList()), Entity::condition, param.getList().get(param.getList().size() - 1); // 编译通过,执行时,如果param中的list为null,则报null pointer异常,这是因为mp在拼接条件时,会将三个参数带入到eq方法,因此param.getList()为null时,param.getList().get(param.getList().size() - 1) 变成了 null..get(param.getList().size() - 1),所以导致了空指针
    list(wrapper);
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Boot四大神器之CLI的具体使用

    Spring Boot四大神器之CLI的具体使用

    本文主要介绍了Spring Boot四大神器之CLI的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Java并发编程之详解CyclicBarrier线程同步

    Java并发编程之详解CyclicBarrier线程同步

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口,ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue,BlockingDeque接口,ConcurrentHashMap,CountDownLatch,本文为系列文章第十篇,需要的朋友可以参考下
    2021-06-06
  • Java线程池FutureTask实现原理详解

    Java线程池FutureTask实现原理详解

    这篇文章主要介绍了Java线程池FutureTask实现原理详解,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • java在网页上面抓取邮件地址的方法

    java在网页上面抓取邮件地址的方法

    这篇文章主要介绍了java在网页上面抓取邮件地址的方法,是比较典型的Java正则匹配应用实例,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • Java如何实现字符串每隔4位加空格

    Java如何实现字符串每隔4位加空格

    这篇文章主要介绍了Java如何实现字符串每隔4位加空格,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • IDEA常量字符串过长问题及解决方案

    IDEA常量字符串过长问题及解决方案

    在编译Java项目时遇到“常量字符串过长”错误,可以通过修改编译器设置解决,具体方法是进入IDE的设置(File>>Settings>>Build, Execution, Deployment>>Compiler>>Java Compiler),将使用的编译器更改为Eclipse,如果问题依旧
    2024-10-10
  • JAVA中跳出当前多重嵌套循环的方法详解

    JAVA中跳出当前多重嵌套循环的方法详解

    今天在看面试题时,发现了这个问题,因为在PHP中跳出多次循环可以使用break数字来跳出多层循环,但这在java中并不好使,这篇文章主要给大家介绍了关于JAVA中跳出当前多重嵌套循环的相关资料,需要的朋友可以参考下
    2022-01-01
  • Spring定时任务@scheduled多线程使用@Async注解示例

    Spring定时任务@scheduled多线程使用@Async注解示例

    这篇文章主要为大家介绍了Spring定时任务@scheduled多线程使用@Async注解示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • MyBatisPlus标准数据层CRUD的使用详解

    MyBatisPlus标准数据层CRUD的使用详解

    这篇文章主要介绍了MyBatisPlus标准数据层CRUD的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 从零开始Java实现Parser Combinator

    从零开始Java实现Parser Combinator

    这篇文章主要为大家介绍了从零开始Java实现Parser Combinator过程及原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论