原文网址:Mybatis-Plus--QueryWrapper--使用/实例_IT利刃出鞘的博客-CSDN博客

简介

本文介绍Mybatis-Plus中的QueryWrapper的用法。

全量查询

通过设置实体类的值来查询:若某一项设置为null,则不会拼接sql。

通过Map和allEq来查询:若某一项设置为null,则会拼接sql。(若想过滤null项,allEq的第二个参数设为false)

select示例:new QueryWrapper<>() .select("name", "age")......

等值查询

查询名字叫“Tony”的,年龄等于20的。

  1. seletOne返回的是一条实体记录,当出现多条时会报错。
  2. 如果需要有多条记录时只取一条,可以使用IService.java的getOne(Wrapper<T>, Boolean)方法,指定第二个参数为false。

方案1:直接用eq

    public void testSelectEqList() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("name", "张三");queryWrapper.eq("age", 28);queryWrapper.eq("last_name", null);// 这样也可以// queryWrapper.eq("name", "张三").eq("age", 28).eq("last_name", null);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);}

执行结果

==>  Preparing: SELECT id,name,last_name,email,gender,age FROM tb_user WHERE (name = ? AND age = ? AND last_name = ?)
==> Parameters: 张三(String), 28(Integer), null
<==      Total: 0

方案2:传实体类 

    public void testSelectList() {User user = new User();user.setName("张");user.setAge(28);user.setLastName(null);QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);//User user = userMapper.selectOne(queryWrapper);  //查询一条记录//System.out.println(user);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);}

执行结果

==>  Preparing: SELECT id,name,last_name,email,gender,age FROM tb_user WHERE name=? AND age=?
==> Parameters: 张(String), 28(Integer)
<==      Total: 0

方案3:Map+allEq

    public void selectWrapper13() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();Map<String, Object> map = new HashMap<>();// 普通查询map.put("name", "张三");map.put("age",28);map.put("last_name",null);queryWrapper.allEq(map);   // queryWrapper.allEq(map, false);// 传入false自动过滤为null的// 自动过滤name参数//queryWrapper.allEq((key, value) -> !key.equals("name"), map);//User user = userMapper.selectOne(queryWrapper);  //查询一条记录//System.out.println(user);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);}

执行结果

==>  Preparing: SELECT id,name,last_name,email,gender,age FROM tb_user WHERE (name = ? AND last_name IS NULL AND age = ?)
==> Parameters: 张三(String), 28(Integer)
<==      Total: 0

传入false执行结果

==>  Preparing: SELECT id,name,last_name,email,gender,age FROM tb_user WHERE (name = ? AND age = ?)
==> Parameters: 张三(String), 28(Integer)
<==      Total: 0

多条件查询

多条件查询

查询姓王的,年龄大于等于20,小于等于40.并且email不为空

public void selectWrapper01() {QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.likeRight("name", "王");queryWrapper.between("age", 20, 40);queryWrapper.isNotNull("email");// 这样写也可以// queryWrapper.likeRight("name", "王")//             .between("age", 20, 40)//             .isNotNull("email");List list = userMapper.selectList(queryWrapper);list.forEach(System.out::println);
}

多条件查询并排序

查询姓王的,或者年龄大于30。按照年龄降序,如果年龄相同按照id升序

public void selectWrapper02() {QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.likeRight("name", "王");queryWrapper.or();queryWrapper.ge("age", 30);queryWrapper.orderByDesc("age");queryWrapper.orderByAsc("id");// 这样写也可以// queryWrapper.likeRight("name", "王")//             .or()//             .ge("age", 30)//             .orderByDesc("age")//             .orderByAsc("id");List list = userMapper.selectList(queryWrapper);list.forEach(System.out::println);
}

返回部分字段

法1:返回需要的字段

返回多个列

public void selectWrapper09() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select("name", "age", "phone").likeRight("name", "王").le("age", 30);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

注意,返回单个列时,不能直接赋值给List<String>,因为userMapper对应的泛型是User实体, 返回时的泛型也是List<User>。如果想返回List<String>,必须自定义SQL,将实体直接定为Object。

法2:返回需要的字段

public void selectWrapper12() {User user = new User();user.setName("张");user.setAge(28);QueryWrapper<User> queryWrapper = new QueryWrapper<>(user, "id", "last_name");List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

执行结果

==>  Preparing: SELECT id,last_name FROM tb_user WHERE name=? AND age=?
==> Parameters: 张(String), 28(Integer)
<==      Total: 0

法3:过滤不需要的字段 

public void selectWrapper10() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select(User.class, p -> !p.getColumn().equals("parent_id") && !p.getColumn().equals("create_time")).likeRight("name", "王");List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

condition

简介

所有的执行条件前边都有一个boolean类型,表示是否加入sql语句。示例:

QueryWrapper<User> wrapper = new QueryWrapper<>();
//下边这两种是等效的
if(user.getName() != null){wrapper.eq("name", user.getName());
}
wrapper.eq(user.getName() != null, "name", user.getName()));
QueryWrapper<User> wrapper = new QueryWrapper<>();
//下边这两种是不等效的
if(ids != null){wrapper.in("id", Arrays.asList(ids));
}
wrapper.in(ids != null, "id", Arrays.asList(ids));

因为带boolean条件的方法,仍会将所有参数往下传。对于in或者notIn来说,会执行Arrays.asList(ids),如果ids为null,则会报异常:

java.lang.NullPointerExceptionat java.util.Objects.requireNonNull(Objects.java:203)at java.util.Arrays$ArrayList.<init>(Arrays.java:3813)at java.util.Arrays.asList(Arrays.java:3800)

执行条件用来简化代码

private void condition(String name, String email) {QueryWrapper<User> wrapper = new QueryWrapper<>();// 需要六行,太麻烦//  if(StringUtils.isNotBlank(name)){//      wrapper.like("name",name);//  }//  if(StringUtils.isNotBlank(name)){//      wrapper.like("name",name);//  }// 用此法只需两行wrapper.like(StringUtils.isNotBlank("name"), "name", name).like(StringUtils.isNotBlank("email"), "email", email);List<User> users = userMapper.selectList(wrapper);for (User user : users) {System.out.println(user.toString());}
}

nested、and、in

多条件查询(nested)

(年龄小于40或邮箱不为空),并且名字为王姓

public void selectWrapper06() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.nested(qw -> qw.lt("age", 40).or().isNotNull("email")).likeRight("name", "王");List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

多条件查询(and)

名字为王姓,并且年龄小于40或邮箱不为空

public void selectWrapper04() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.likeRight("name", "王");queryWrapper.and(qw -> qw.lt("age", 40).or().isNotNull("email"));List list = userMapper.selectList(queryWrapper);list.forEach(System.out::println);
}

in

public void selectWrapper07() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.in("age", Arrays.asList(21, 26, 28));List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

其他操作

根据 Wrapper 条件,查询总记录数

public void selectCount() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("name", "lqf");Integer count = userMapper.selectCount(queryWrapper);System.out.println(count);
}

根据 wrapper  条件,查询全部记录

queryWrapper 实体对象封装操作类(可以为 null)为null查询全部

public void selectList() {List<User> list = userMapper.selectList(null);System.out.println(list);
}

根据 Wrapper 条件,返回maps

queryWrapper 实体对象封装操作类(可以为 null)

    public void testSelectNull() {QueryWrapper<User> queryWrapper = new QueryWrapper<>(null);List<Map<String, Object>> mapList = userMapper.selectMaps(queryWrapper);mapList.forEach(System.out::println);}

打印结果

{gender=1, last_name=东方不败, id=321eece6b1620ab97123785edbdef490, email=dfbb@163.com, age=20}
{gender=1, last_name=Tony, id=101eece6b1620ab97ffa8c8edbdef490, email=aaa@163.com, age=20}
{gender=2, last_name=Pepper, id=9d532cbadd8ea0beb7ea5a7c867bc863, email=123@163.com, age=20}

根据 entity 条件,删除记录

QueryWrapper实体对象封装操作类(可以为 null),下方获取到queryWrapper后删除的查询条件为name字段为null的and年龄大于等于12的and email字段不为null的

public void delete() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.isNull("name").ge("age", 12).isNotNull("email");int delete = userMapper.delete(queryWrapper);System.out.println("delete return count = " + delete);
}

根据 entity 条件,查询全部记录(并翻页)

page         分页查询条件(可以为 RowBounds.DEFAULT)
queryWrapper 实体对象封装操作类(可以为 null)

public void selectPage() {Page<User> page = new Page<>(1, 5);QueryWrapper<User> queryWrapper = new QueryWrapper<>();IPage<User> userIPage = userMapper.selectPage(page, queryWrapper);System.out.println(userIPage);
}//需要在项目中加入分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();
}

打印结果                                                           
==>  Preparing: SELECT COUNT(1) FROM user                          
==> Parameters:                                                    
<==    Columns: COUNT(1)                                           
<==        Row: 100                                                
==>  Preparing: SELECT id,name,age,email,status FROM user LIMIT 0,5
==> Parameters:                                                    
<==    Columns: id, name, age, email, status                       
<==        Row: 1046282328366391319, lqf, 12, lqf@163.com, 0       
<==        Row: 1046282328366391320, lqf, 12, lqf@163.com, 0       
<==        Row: 1046282328366391321, lqf, 12, lqf@163.com, 0       
<==        Row: 1046282328366391322, lqf, 12, lqf@163.com, 0       
<==        Row: 1046282328366391323, lqf, 12, lqf@163.com, 0       
<==      Total: 5

 根据 Wrapper 条件,查询全部记录(并翻页)

page         分页查询条件       
queryWrapper 实体对象封装操作类 
和上个分页同理只是返回类型不同

public void selectMapsPage() {Page<User> page = new Page<>(1, 5);QueryWrapper<User> queryWrapper = new QueryWrapper<>();IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, queryWrapper);System.out.println(mapIPage);
}

Mybatis-Plus--QueryWrapper--使用/实例相关推荐

  1. hikari如何切换数据源_spring boot+mybatis 多数据源切换(实例讲解)

    由于公司业务划分了多个数据库,开发一个项目会同事调用多个库,经过学习我们采用了注解+aop的方式实现的 1.首先定义一个注解类 @Retention(RetentionPolicy.RUNTIME) ...

  2. mybatis 传入id_想深入理解MyBatis架构及原理实例分析 把握这些就够了

    前言 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询 ...

  3. java mybatis 返回map_mybatis返回map集合的格式是什么?mybatis返回map集合实例

    Mybatis因为会与数据库交互,所以经常会有返回map集合的场景,那一般mybatis返回map集合的格式是什么呢?下面小编就用一些实例与你分享分享吧. 例1:返回key不定:返回key为学员id, ...

  4. mybatis生成的Example实例函数使用及详解

    一.mapper接口中的方法解析 mapper接口中的函数及方法 方法 功能说明 int countByExample(UserExample example) thorws SQLException ...

  5. 【Mybatis】动态SQL 实例

    目录 1. if 2. where 3. set 4. foreach 5. choose.when.otherwise 6. 完整项目实例 0. 简介 动态 SQL 是 MyBatis 的强大特性之 ...

  6. Mybatis的xml配置实例

    主表: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC &quo ...

  7. Springboot整合mybatis框架(含实例Demo)

    最近要交一份project项目作业,前后端分离,我负责后端,选用了Springboot+mybatis进行整合操作. 一.前期准备: 开发使用的IDE为IntelliJ IDEA:https://ww ...

  8. MyBatis基于Maven入门实例

    本地环境: 1. JDK: 1.8.0_161 2. Eclipse: Oxygen.3 Release (4.7.3) 3.   Maven:  apache-maven-3.5.3 4.   Da ...

  9. Mybatis批量update修改实例

    UserMapper.xml 配置: <sql id="condition4Update"><where><if test="orgNo ! ...

  10. spring+mybatis之声明式事务管理初识(小实例)

    前几篇的文章都只是初步学习spring和mybatis框架,所写的实例也都非常简单,所进行的数据访问控制也都很简单,没有加入事务管理.这篇文章将初步接触事务管理. 1.事务管理 理解事务管理之前,先通 ...

最新文章

  1. 仓库无证如何处罚_“非现场执法”查处无证网约车,罚款15万!滴哥:怎们罚的都不知道!...
  2. python购物车实现的功能是什么_Python3实现购物车功能
  3. 西瓜创客python编程进阶收费_西瓜创客和编程猫有什么不同?哪个更值得报名?...
  4. 记一次线上cpu飙升100%的排查过程
  5. 可视化工具Navicat for MySQL-操作三
  6. POJ-2533 Longest Ordered Subsequence
  7. C语言学习笔记---一个简单的文件压缩示例
  8. hadoop2.X集群安装与应用
  9. 霍夫斯特拉大学计算机科学专业排名,Hofstra University霍夫斯特拉大学介绍及排名信息...
  10. 兔子吃萝卜java游戏下载_巴迪兔子吃萝卜
  11. 使用批处理实现分组多用户的创建和权限分配
  12. 最快路由器服务器地址,路由器中radius服务器IP地址要用什么样的IP
  13. qt实现windows系统下录屏功能
  14. 小程序模板报价_小程序模板价格_小程序模板使用多少钱
  15. 沙滩啤酒win7主题【rmzt】
  16. HTML作业简单注册界面
  17. hdu 1205 吃糖果 抽屉原理
  18. rust外服组建战队_rust怎么把人拉入队伍 | 手游网游页游攻略大全
  19. 苹果一体机安装windows7黑屏解决方法
  20. 【Matlab系列】matlab中数据归一化方法

热门文章

  1. win7驱动程序未经签名可以使用吗_w7禁用驱动程序签名
  2. 【C语言初阶】C语言%(%d,%c...)
  3. 以太森林:全民绿色环保
  4. [面试题]java中final finally finalized 的区别是什么?
  5. 中秋快乐 | 千里共婵娟,云上爱团圆
  6. 无线渗透--‘钓鱼’wifi
  7. 联想发布全球首款5G笔记本电脑,或成其SIoT战略强力抓手
  8. 【Bleak】三、扫描(指定设备地址)
  9. 凸包问题的快包算法代码(C语言)
  10. [python爬虫]--爬取豆瓣音乐topX