当前位置: 首页 > article >正文

mybatis-plus中wrapper的用法(详细)

转载自:https://blog.csdn.net/alan_liuyue/article/details/121162237

用到了wrapper,整理资料记录一下,以备后续复习。

目录------------(可点击相应目录直接跳转)

目录

一、条件构造器关系介绍

条件构造器关系介绍 :

 wapper介绍 :

二、项目实例

1、根据主键或者简单的查询条件进行查询

2、MyBatis-Plus还提供了Wrapper条件构造器,具体使用看如下代码:

三、具体使用操作

1、ge、gt、le、lt、isNull、isNotNull 

2、eq、ne

3、between、notBetween

4、allEq

5、like、notLike、likeLeft、likeRight

6、in、notIn、inSql、notinSql、exists、notExists

7、or、and

8、嵌套or、嵌套and

9、orderBy、orderByDesc、orderByAsc 

10、last

11、指定要查询的列

12、set、setSql


一、条件构造器关系介绍

条件构造器关系介绍 :

  •         上图绿色框为抽象类abstract
  •         蓝色框为正常class类,可new对象
  •         黄色箭头指向为父子类关系,箭头指向为父类

 
wapper介绍 :

  • Wrapper : 条件构造抽象类,最顶端父类
  • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
  • QueryWrapper : Entity 对象封装操作类,不是用lambda语法
  • UpdateWrapper : Update 条件封装,用于Entity对象更新操作
  • AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
  • LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
  •  LambdaUpdateWrapper : Lambda 更新封装Wrapper

二、项目实例

 

1、根据主键或者简单的查询条件进行查询

  1. /**
  2.      * 通过单个ID主键进行查询
  3.      */
  4. @Test
  5. public void selectById() {
  6. User user = userMapper.selectById(1094592041087729666L);
  7. System.out.println(user);
  8. }
  9. /**
  10.      * 通过多个ID主键查询
  11.      */
  12. @Test
  13. public void selectByList() {
  14. List<Long> longs = Arrays.asList(1094592041087729666L, 1094590409767661570L);
  15. List<User> users = userMapper.selectBatchIds(longs);
  16. users.forEach(System.out::println);
  17. }
  18. /**
  19.      * 通过Map参数进行查询
  20.      */
  21. @Test
  22. public void selectByMap() {
  23. Map<String, Object> params = new HashMap<>();
  24. params.put("name", "张雨琪");
  25. List<User> users = userMapper.selectByMap(params);
  26. users.forEach(System.out::println);
  27. }


2、MyBatis-Plus还提供了Wrapper条件构造器,具体使用看如下代码:

  1. /**
  2.      * 名字包含雨并且年龄小于40
  3.      * <p>
  4.      * WHERE name LIKE '%雨%' AND age < 40
  5.      */
  6. @Test
  7. public void selectByWrapperOne() {
  8. QueryWrapper<User> wrapper = new QueryWrapper();
  9. wrapper.like("name", "雨").lt("age", 40);
  10. List<User> users = userMapper.selectList(wrapper);
  11. users.forEach(System.out::println);
  12. }
  13. /**
  14.      * 名字包含雨
  15.      * 年龄大于20小于40
  16.      * 邮箱不能为空
  17.      * <p>
  18.      * WHERE name LIKE '%雨%' AND age BETWEEN 20 AND 40 AND email IS NOT NULL
  19.      */
  20. @Test
  21. public void selectByWrapperTwo() {
  22. QueryWrapper<User> wrapper = Wrappers.query();
  23. wrapper.like("name", "雨").between("age", 20, 40).isNotNull("email");
  24. List<User> users = userMapper.selectList(wrapper);
  25. users.forEach(System.out::println);
  26. }
  27. /**
  28.      * 名字为王性
  29.      * 或者年龄大于等于25
  30.      * 按照年龄降序排序,年龄相同按照id升序排序
  31.      * <p>
  32.      * WHERE name LIKE '王%' OR age >= 25 ORDER BY age DESC , id ASC
  33.      */
  34. @Test
  35. public void selectByWrapperThree() {
  36. QueryWrapper<User> wrapper = Wrappers.query();
  37. wrapper.likeRight("name", "王").or()
  38. .ge("age", 25).orderByDesc("age").orderByAsc("id");
  39. List<User> users = userMapper.selectList(wrapper);
  40. users.forEach(System.out::println);
  41. }
  42. /**
  43.      * 查询创建时间为2019年2月14
  44.      * 并且上级领导姓王
  45.      * <p>
  46.      * WHERE date_format(create_time,'%Y-%m-%d') = '2019-02-14' AND manager_id IN (select id from user where name like '王%')
  47.      */
  48. @Test
  49. public void selectByWrapperFour() {
  50. QueryWrapper<User> wrapper = Wrappers.query();
  51. wrapper.apply("date_format(create_time,'%Y-%m-%d') = {0}", "2019-02-14")
  52. .inSql("manager_id", "select id from user where name like '王%'");
  53. List<User> users = userMapper.selectList(wrapper);
  54. users.forEach(System.out::println);
  55. }
  56. /**
  57.      * 查询王姓
  58.      * 并且年龄小于40或者邮箱不为空
  59.      * <p>
  60.      * WHERE name LIKE '王%' AND ( age < 40 OR email IS NOT NULL )
  61.      */
  62. @Test
  63. public void selectByWrapperFive() {
  64. QueryWrapper<User> wrapper = Wrappers.query();
  65. wrapper.likeRight("name", "王").and(qw -> qw.lt("age", 40).or().isNotNull("email"));
  66. List<User> users = userMapper.selectList(wrapper);
  67. users.forEach(System.out::println);
  68. }
  69. /**
  70.      * 查询王姓
  71.      * 并且年龄大于20 、年龄小于40、邮箱不能为空
  72.      * <p>
  73.      * WHERE name LIKE ? OR ( age BETWEEN ? AND ? AND email IS NOT NULL )
  74.      */
  75. @Test
  76. public void selectByWrapperSix() {
  77. QueryWrapper<User> wrapper = Wrappers.query();
  78. wrapper.likeRight("name", "王").or(
  79. qw -> qw.between("age", 20, 40).isNotNull("email")
  80. );
  81. List<User> users = userMapper.selectList(wrapper);
  82. users.forEach(System.out::println);
  83. }
  84. /**
  85.      * (年龄小于40或者邮箱不为空) 并且名字姓王
  86.      * WHERE ( age < 40 OR email IS NOT NULL ) AND name LIKE '王%'
  87.      */
  88. @Test
  89. public void selectByWrapperSeven() {
  90. QueryWrapper<User> wrapper = Wrappers.query();
  91. wrapper.nested(qw -> qw.lt("age", 40).or().isNotNull("email"))
  92. .likeRight("name", "王");
  93. List<User> users = userMapper.selectList(wrapper);
  94. users.forEach(System.out::println);
  95. }
  96. /**
  97.      * 查询年龄为30、31、32
  98.      * WHERE age IN (?,?,?)
  99.      */
  100. @Test
  101. public void selectByWrapperEight() {
  102. QueryWrapper<User> wrapper = Wrappers.query();
  103. wrapper.in("age", Arrays.asList(30, 31, 32));
  104. List<User> users = userMapper.selectList(wrapper);
  105. users.forEach(System.out::println);
  106. }
  107. /**
  108.      * 查询一条数据
  109.      * limit 1
  110.      */
  111. @Test
  112. public void selectByWrapperNine() {
  113. QueryWrapper<User> wrapper = Wrappers.query();
  114. wrapper.in("age", Arrays.asList(30, 31, 32)).last("limit 1");
  115. List<User> users = userMapper.selectList(wrapper);
  116. users.forEach(System.out::println);
  117. }


三、具体使用操作

        注意:以下条件构造器的方法入参中的 column 均表示数据库字段

1、ge、gt、le、lt、isNull、isNotNull
 

  1. @Test
  2. public void testDelete() {
  3. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  4. queryWrapper
  5. .isNull("name")
  6. .ge("age", 12)
  7. .isNotNull("email");
  8. int result = userMapper.delete(queryWrapper);
  9. System.out.println("delete return count = " + result);
  10. }

SQL:UPDATE user SET deleted=1 WHERE deleted=0 AND name IS NULL AND age >= ? AND email IS NOT NULL

2、eq、ne

  1. 注意:seletOne返回的是一条实体记录,当出现多条时会报错
  2. @Test
  3. public void testSelectOne() {
  4. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  5. queryWrapper.eq("name", "Tom");
  6. User user = userMapper.selectOne(queryWrapper);
  7. System.out.println(user);
  8. }

3、between、notBetween

  1. 包含大小边界
  2. @Test
  3. public void testSelectCount() {
  4. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  5. queryWrapper.between("age", 20, 30);
  6. Integer count = userMapper.selectCount(queryWrapper);
  7. System.out.println(count);
  8. }

SELECT COUNT(1) FROM user WHERE deleted=0 AND age BETWEEN ? AND ? 

4、allEq

  1. @Test
  2. public void testSelectList() {
  3. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  4. Map<String, Object> map = new HashMap<>();
  5. map.put("id", 2);
  6. map.put("name", "Jack");
  7. map.put("age", 20);9
  8. queryWrapper.allEq(map);
  9. List<User> users = userMapper.selectList(queryWrapper);
  10. users.forEach(System.out::println);
  11. }

SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name = ? AND id = ? AND age = ? 

5、like、notLike、likeLeft、likeRight

  1. selectMaps返回Map集合列表
  2. @Test
  3. public void testSelectMaps() {
  4. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  5. queryWrapper
  6. .notLike("name", "e")
  7. .likeRight("email", "t");
  8. List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表
  9. maps.forEach(System.out::println);
  10. }

SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name NOT LIKE ? AND email LIKE ? 

6、in、notIn、inSql、notinSql、exists、notExists

  1. in、notIn:
  2. notIn("age",{1,2,3})--->age not in (1,2,3)
  3. notIn("age", 1, 2, 3)--->age not in (1,2,3)
  4. inSql、notinSql:可以实现子查询
  5. 例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)
  6. 例: inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)
  7. @Test
  8. public void testSelectObjs() {
  9. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  10. //queryWrapper.in("id", 1, 2, 3);
  11. queryWrapper.inSql("id", "select id from user where id < 3");
  12. List<Object> objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表
  13. objects.forEach(System.out::println);
  14. }

SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND id IN (select id from user where id < 3) 

7、or、and

  1. 注意:这里使用的是 UpdateWrapper 不调用or则默认为使用 and
  2. @Test
  3. public void testUpdate1() {
  4. //修改值
  5. User user = new User();
  6. user.setAge(99);
  7. user.setName("Andy");
  8. //修改条件
  9. UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
  10. userUpdateWrapper
  11. .like("name", "h")
  12. .or()
  13. .between("age", 20, 30);
  14. int result = userMapper.update(user, userUpdateWrapper);
  15. System.out.println(result);
  16. }

UPDATE user SET name=?, age=?, update_time=? WHERE deleted=0 AND name LIKE ? OR age BETWEEN ? AND ?

8、嵌套or、嵌套and

  1. 这里使用了lambda表达式,or中的表达式最后翻译成sql时会被加上圆括号
  2. @Test
  3. public void testUpdate2() {
  4. //修改值
  5. User user = new User();
  6. user.setAge(99);
  7. user.setName("Andy");
  8. //修改条件
  9. UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
  10. userUpdateWrapper
  11. .like("name", "h")
  12. .or(i -> i.eq("name", "李白").ne("age", 20));
  13. int result = userMapper.update(user, userUpdateWrapper);
  14. System.out.println(result);
  15. }

UPDATE user SET name=?, age=?, update_time=? 

WHERE deleted=0 AND name LIKE ? 

OR ( name = ? AND age <> ? ) 

9、orderBy、orderByDesc、orderByAsc
 

  1. @Test
  2. public void testSelectListOrderBy() {
  3. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  4. queryWrapper.orderByDesc("id");
  5. List<User> users = userMapper.selectList(queryWrapper);
  6. users.forEach(System.out::println);
  7. }

SELECT id,name,age,email,create_time,update_time,deleted,version 

FROM user WHERE deleted=0 ORDER BY id DESC

10、last

  1. 直接拼接到 sql 的最后
  2. 注意:只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用
  3. @Test
  4. public void testSelectListLast() {
  5. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  6. queryWrapper.last("limit 1");
  7. List<User> users = userMapper.selectList(queryWrapper);
  8. users.forEach(System.out::println);
  9. }

SELECT id,name,age,email,create_time,update_time,deleted,version 

FROM user WHERE deleted=0 limit 1

 

11、指定要查询的列

  1. @Test
  2. public void testSelectListColumn() {
  3. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  4. queryWrapper.select("id", "name", "age");
  5. List<User> users = userMapper.selectList(queryWrapper);
  6. users.forEach(System.out::println);
  7. }

SELECT id,name,age FROM user WHERE deleted=0

12、set、setSql

  1. 最终的sql会合并 user.setAge(),以及 userUpdateWrapper.set()  和 setSql() 中 的字段
  2. @Test
  3. public void testUpdateSet() {
  4. //修改值
  5. User user = new User();
  6. user.setAge(99);
  7. //修改条件
  8. UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
  9. userUpdateWrapper
  10. .like("name", "h")
  11. .set("name", "老李头")//除了可以查询还可以使用set设置修改的字段
  12. .setSql(" email = '123@qq.com'");//可以有子查询
  13. int result = userMapper.update(user, userUpdateWrapper);
  14. }

UPDATE user SET age=?, update_time=?, name=?, email = '123@qq.com' WHERE deleted=0 AND name LIKE ?

-------------------------------------------------------------------------------------以下无正文-------------------

参考文档

1、https://blog.csdn.net/m0_37034294/article/details/82917234

2、https://blog.csdn.net/kepengs/article/details/112345870

3、https://blog.csdn.net/weixin_39615889/article/details/107086931

4、https://blog.csdn.net/weixin_38111957/article/details/91447509

http://www.lryc.cn/news/2415119.html

相关文章:

  • VPC 是什么
  • 软件测试用例经典方法 | 逻辑覆盖测试法及案例
  • Excel的VLOOKUP函数及其用法
  • suse linux 远程桌面,Xmanager 远程连接CentOS linux和SUSE linux
  • 前端学习究竟该学什么?要学哪些东西?(以Vue为例)
  • OpenGL 入门 6:GLM
  • 详细解释sprintf 函数(转)
  • 网络性能测试工具-Iperf
  • [前后端]JSP入门
  • 元素定位之XPath定位-学习
  • 【Nessus安装、使用】
  • Linux命令 | 常用命令之 find
  • 字符串函数---strstr()、memchr()、strchr()详解及实现
  • 【数据结构】树(一)—— 树的基础知识(C语言版)
  • CDSN文章转载方法
  • Git从入门到熟练第十讲 cloning
  • Mac安装brew,支持m芯片,5分钟安装成功亲测有效
  • 浅谈网络共享之samba服务
  • CSS预处理语言~~Less安装与使用
  • Java的byte类型详解
  • ICMP协议与ARP协议
  • unity基础(2)——3D对象基础概念与简单操作
  • 发现数学之美--微积分的起源和用途(一文搞懂微积分)
  • QEMU简介
  • 基于微信PC端小程序抓包方法
  • Hex文件解析
  • 超详细一文到底!软件测试基本流程
  • 富文本编辑器汇总
  • 一篇了解使用springSecurity
  • jar包的概念及作用(二)运行jar包、查看jar包内容