Mybatis-Plus--QueryWrapper--使用/实例
原文网址: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的。
- seletOne返回的是一条实体记录,当出现多条时会报错。
- 如果需要有多条记录时只取一条,可以使用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--使用/实例相关推荐
- hikari如何切换数据源_spring boot+mybatis 多数据源切换(实例讲解)
由于公司业务划分了多个数据库,开发一个项目会同事调用多个库,经过学习我们采用了注解+aop的方式实现的 1.首先定义一个注解类 @Retention(RetentionPolicy.RUNTIME) ...
- mybatis 传入id_想深入理解MyBatis架构及原理实例分析 把握这些就够了
前言 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询 ...
- java mybatis 返回map_mybatis返回map集合的格式是什么?mybatis返回map集合实例
Mybatis因为会与数据库交互,所以经常会有返回map集合的场景,那一般mybatis返回map集合的格式是什么呢?下面小编就用一些实例与你分享分享吧. 例1:返回key不定:返回key为学员id, ...
- mybatis生成的Example实例函数使用及详解
一.mapper接口中的方法解析 mapper接口中的函数及方法 方法 功能说明 int countByExample(UserExample example) thorws SQLException ...
- 【Mybatis】动态SQL 实例
目录 1. if 2. where 3. set 4. foreach 5. choose.when.otherwise 6. 完整项目实例 0. 简介 动态 SQL 是 MyBatis 的强大特性之 ...
- Mybatis的xml配置实例
主表: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC &quo ...
- Springboot整合mybatis框架(含实例Demo)
最近要交一份project项目作业,前后端分离,我负责后端,选用了Springboot+mybatis进行整合操作. 一.前期准备: 开发使用的IDE为IntelliJ IDEA:https://ww ...
- 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 ...
- Mybatis批量update修改实例
UserMapper.xml 配置: <sql id="condition4Update"><where><if test="orgNo ! ...
- spring+mybatis之声明式事务管理初识(小实例)
前几篇的文章都只是初步学习spring和mybatis框架,所写的实例也都非常简单,所进行的数据访问控制也都很简单,没有加入事务管理.这篇文章将初步接触事务管理. 1.事务管理 理解事务管理之前,先通 ...
最新文章
- 仓库无证如何处罚_“非现场执法”查处无证网约车,罚款15万!滴哥:怎们罚的都不知道!...
- python购物车实现的功能是什么_Python3实现购物车功能
- 西瓜创客python编程进阶收费_西瓜创客和编程猫有什么不同?哪个更值得报名?...
- 记一次线上cpu飙升100%的排查过程
- 可视化工具Navicat for MySQL-操作三
- POJ-2533 Longest Ordered Subsequence
- C语言学习笔记---一个简单的文件压缩示例
- hadoop2.X集群安装与应用
- 霍夫斯特拉大学计算机科学专业排名,Hofstra University霍夫斯特拉大学介绍及排名信息...
- 兔子吃萝卜java游戏下载_巴迪兔子吃萝卜
- 使用批处理实现分组多用户的创建和权限分配
- 最快路由器服务器地址,路由器中radius服务器IP地址要用什么样的IP
- qt实现windows系统下录屏功能
- 小程序模板报价_小程序模板价格_小程序模板使用多少钱
- 沙滩啤酒win7主题【rmzt】
- HTML作业简单注册界面
- hdu 1205 吃糖果 抽屉原理
- rust外服组建战队_rust怎么把人拉入队伍 | 手游网游页游攻略大全
- 苹果一体机安装windows7黑屏解决方法
- 【Matlab系列】matlab中数据归一化方法
热门文章
- win7驱动程序未经签名可以使用吗_w7禁用驱动程序签名
- 【C语言初阶】C语言%(%d,%c...)
- 以太森林:全民绿色环保
- [面试题]java中final finally finalized 的区别是什么?
- 中秋快乐 | 千里共婵娟,云上爱团圆
- 无线渗透--‘钓鱼’wifi
- 联想发布全球首款5G笔记本电脑,或成其SIoT战略强力抓手
- 【Bleak】三、扫描(指定设备地址)
- 凸包问题的快包算法代码(C语言)
- [python爬虫]--爬取豆瓣音乐topX