当前位置:   article > 正文

MybatisPlus Wrapper构造器(查询篇)_mybatisplus wrapper查询

mybatisplus wrapper查询
  1. 笔记:
  2. * 依赖MybatisPlus 3.5.5
  3. * 自动映射:
  4. a) 表名和实体类的映射 -> t_stu 表 Student 实体类:
  5. 1.当表名和实体类名不一样的时候再实体类类名上加上@TableName注解@TableName("t_stu")
  6. 2.也可以在配置文件中配置数据库表名的前缀,配置之后只要类名称与表名一致就无需@TableName注解
  7. mybatis-plus.global-config.db-config.table-prefix: tb_
  8. b) 字段名和实体类属性名(不是变量名,属性名是get/set方法中的setStuName中的StuName)的映射
  9. c) 字段名下划线命名方式和实体类属性小驼峰命名方式映射:
  10. mybatis-plus.configuration.map-underscore-to-camel-case: true
  11. d) 字段映射:
  12. 1.字段名称与实体类属性名称不一致时,使用@TableField注解指定字段的名称即可完成封装@TableField(value= "XXX")
  13. 2.字段失效,不希望该属性被查询,隐藏这个字段@TableField(select= false)
  14. e) 视图属性:
  15. 有些字段不需要数据库存储,但需要展示,实体类中有这个有这个属性但数据库中不存在,叫视图属性。@TableField(exist = false)
  16. * 查询:(条件构造器、等值查询、范围查询、判断为空、包含查询、分组查询、聚合查询、排序查询、
  17. func查询、逻辑查询、自定义条件查询、last查询、exists查询、字段查询)
  18. 1.条件构造器介绍(自己看源码):Wrapper、AbstractWrapper、AbstractLambdaWrapper、QueryWrapper、LambdaQueryWrapper:
  19. a) Wrapper
  20. 抽象类、子类是AbstractWrapper
  21. b) AbstractWrapper
  22. 抽象类、子类是AbstractLambdaWrapper、QueryWrapper
  23. c) AbstractLambdaWrapper
  24. 抽象类、子类是LambdaQueryWrapper
  25. d) QueryWrapper(重点掌握)
  26. 继承于AbstractWrapper,非抽象类,字符串方式表示字段,创建该类对象。继承AbstractWrapper
  27. e) LambdaQueryWrapper(重点掌握)
  28. 继承于AbstractLambdaWrapper,非抽象类,方法引用方式表示字段,创建该类对象
  29. 2.等值(eq)/不等值(ne)查询:
  30. a) 单个等值条件查询:
  31. QueryWrapper queryWrapper = new QueryWrapper();
  32. queryWrapper.eq("stu_name", "张三");
  33. LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper();
  34. lambdaQueryWrapper.eq(Student::getStuName, "张三");
  35. * 如果传递参数的值为null,将不作为查询条件(当参数不为null的时候作为查询条件)
  36. lambdaQueryWrapper.eq("param" != null, Student::getStuName, null);
  37. b) 多个条件查询,再加一个eq(),或者使用allEq(Map)或者allEq(Map, false),后者设置false表示为null的字段舍弃,不进行查询。
  38. c) 范围查询:
  39. 大于(gt): lambdaQueryWrapper.gt(Student::getStuAge, 18);
  40. 大于等于(ge): lambdaQueryWrapper.ge(Student::getStuAge, 18);
  41. 小于(lt): lambdaQueryWrapper.lt(Student::getStuAge, 18);
  42. 小于等于(le): lambdaQueryWrapper.le(Student::getStuAge, 18);
  43. 范围之间(between): lambdaQueryWrapper.between(Student::getStuAge, 18, 50);
  44. 不在范围之间(notBetween): lambdaQueryWrapper.notBetween(Student::getStuAge, 18, 50);
  45. d) 模糊查询:
  46. like/notLike/likeLeft/likeRight/notLikeLeft/notLikeRight等
  47. lambdaQueryWrapper.like(Student::getStuName, "张");
  48. .......
  49. e) 判空查询:
  50. isNull/isNotNull
  51. lambdaQueryWrapper.isNull(Student::getStuName, "张");
  52. .....
  53. f) 包含查询: in/notIn/inSql
  54. in/notIn:
  55. ArrayList<Integer> arrayList = new ArrayList<>();
  56. Collections.addAll(arrayList, 18,50,12);
  57. lambdaQueryWrapper.in(Student::getStuAge, arrayList);
  58. lambdaQueryWrapper.notIn(Student::getStuAge, arrayList);
  59. inSql: notInSql 反之
  60. ArrayList<Integer> arrayList = new ArrayList<>();
  61. Collections.addAll(arrayList, "18,50,13");
  62. demo1:
  63. lambdaQueryWrapper.inSql(Student::getStuAge, arrayList);
  64. demo2: 还可以传sql语句查询的结果
  65. lambdaQueryWrapper.inSql(Student::getStuAge, "select stu_age from t_stu where stu_age > 20");
  66. g) 分组查询:
  67. 假设数据库的分组语句:select stu_sex,count(*) as sex_count from t_stu group by stu_sex;
  68. QueryWrapper queryWrapper = new QueryWrapper();
  69. // 指定分组的字段
  70. queryWrapper.groupBy("stu_sex");
  71. // 展示的字段
  72. queryWrapper.select("stu_sex,count(*) as sex_count");
  73. // 查询结果
  74. List<Map<String, Object>> list = studentMapper.selectMaps(queryWrapper);
  75. h) 聚合查询:
  76. 假设数据库的分组语句(不能使用where):
  77. select stu_sex,count(*) as sex_count from t_stu group by stu_sex having sex_count > 3;
  78. QueryWrapper queryWrapper = new QueryWrapper();
  79. // 指定分组的字段
  80. queryWrapper.groupBy("stu_sex");
  81. // 展示的字段
  82. queryWrapper.select("stu_sex,count(*) as sex_count");
  83. // 聚合条件筛选
  84. queryWrapper.having("sex_count >3");
  85. // 查询结果
  86. List<Map<String, Object>> list = studentMapper.selectMaps(queryWrapper);
  87. i) 排序查询: asc/desc
  88. 1.orderByAsc:
  89. LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper();
  90. // 指定一个字段
  91. lambdaQueryWrapper.orderByAsc(Student::getStuAge);
  92. // 指定两个字段
  93. //lambdaQueryWrapper.orderByAsc(Student::getStuAge, Student::getId);
  94. studentMapper.selectList(lambdaQueryWrapper);
  95. 2.orderByDesc ===> 同上 orderByAsc改为orderByDesc
  96. 3.orderBy
  97. orderBy(boolean condition, boolean isAsc, R column);
  98. a) condition – 执行条件,如果排序字段的值为null的时候, 是否还要作为排序字段
  99. b) isAsc – 是否是 ASC 排序
  100. c) column – 单个字段
  101. lambdaQueryWrapper.orderBy(true,true,Student::getStuAge);
  102. j) func查询:内嵌逻辑查询
  103. LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper();
  104. // 拼接不同的查询条件
  105. lambdaQueryWrapper.func(studentLambdaQueryWrapper -> {
  106. // 根据自己实际情况来做判断
  107. if (true) {
  108. studentLambdaQueryWrapper.gt(Student::getStuAge, 30);
  109. } else {
  110. studentLambdaQueryWrapper.gt(Student::getStuAge, 10);
  111. }
  112. });
  113. studentMapper.selectList(lambdaQueryWrapper);
  114. k) 逻辑查询: and/or
  115. a) and逻辑查询,sql: select * from t_stu where stu_age > 10 and stu_age < 30;
  116. LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper();
  117. lambdaQueryWrapper.gt(Student::getStuAge, 10).lt(Student::getStuAge, 30);
  118. studentMapper.selectList(lambdaQueryWrapper);
  119. b) and嵌套查询,sql: select * from t_stu where stu_sex = '女' and (stu_age> 18 or stu_age < 25);
  120. lambdaQueryWrapper.eq(Student::getStuSex, "女").and(studentLambdaQueryWrapper -> {
  121. studentLambdaQueryWrapper.gt(Student::getStuAge, 18).or().lt(Student::getStuAge, 25);
  122. });
  123. studentMapper.selectList(lambdaQueryWrapper);
  124. c) or逻辑查询:
  125. lambdaQueryWrapper.lt(Student::getStuAge, 30).or().gt(Student::getStuAge, 10);
  126. studentMapper.selectList(lambdaQueryWrapper);
  127. d) or内嵌套查询与and嵌套查询
  128. ......
  129. e) nested逻辑查询: where后面拼接多个条件
  130. lambdaQueryWrapper.nested(i -> i.eq(Student::getStuName, "小舞")
  131. .ne(Student::getStuAge, 40).eq(Student::getStuSex, "女"));
  132. 拼接后的Sql: WHERE ((stu_name = ? AND stu_age <> ? AND stu_sex = ?))
  133. l) 自定义条件查询apply:直接写sql语句
  134. lambdaQueryWrapper.apply("id < 5");
  135. 拼接后的Sql: WHERE (id < 5)
  136. m) last查询: 也是拼接字符串,拼接在SQL语句的最后面
  137. lambdaQueryWrapper.last("limit 0,3");
  138. 拼接后的Sql: FROM t_stu limit 0,3
  139. n) exists查询:
  140. Sql: select * from t_stu where exists (select id from t_stu where stu_age = 1000);
  141. 主查询: select * from t_stu
  142. 子查询: (select id from t_stu where stu_age = 1000)
  143. 当我们的子查询出的结果有值/结果集的时候,exists函数返回true,否者false
  144. select * from t_stu where true // 能讲所有数据查询出来
  145. select * from t_stu where false // 查询结果无数据
  146. 1.exists函数返回的是boolean
  147. // 构建查询条件
  148. lambdaQueryWrapper.exists("select id from t_stu where stu_age = 18");
  149. 拼接后的Sql: WHERE (EXISTS (select id from t_stu where stu_age = 18))
  150. 2.notExists相反
  151. o) 字段查询:
  152. // select 查询要展示的字段
  153. lambdaQueryWrapper.select(Student::getId, Student::getStuAge,Student::getStuName);
  154. 打印出的Sql: SELECT id,stu_age,stu_name FROM t_stu

分页

  1. 1.创建一个拦截器。给sql语句增加一个拦截器,然后把分页语句/参数拼接上去
  2. a) 创建mybatisPlus配置文件MybatisPlusConfig,在配置文件中添加分页插件
  3. // 官网 https://baomidou.com/pages/97710a/#%E6%94%AF%E6%8C%81%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93
  4. /**
  5. * 添加分页插件
  6. */
  7. @Bean
  8. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  9. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  10. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加
  11. //interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType
  12. return interceptor;
  13. }
  14. b) 测试:方式一
  15. LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  16. // 指定一个分页对象,包含对象的分页信息 IPage
  17. // long current 当前页, long size 每页显示条数
  18. // Page 是 IPage的接口实现类
  19. IPage<Student> studentPage = new Page<>(1, 3);
  20. // 执行查询
  21. IPage<Student> iPage = studentMapper.selectPage(studentPage, lambdaQueryWrapper);
  22. // 获取分页查询的信息
  23. System.out.println("当前页: " + iPage.getCurrent());
  24. System.out.println("每页显示的条数: " + iPage.getSize());
  25. System.out.println("总条数: " + iPage.getTotal());
  26. System.out.println("总页数: " + iPage.getPages());
  27. // 接受查询的结果
  28. List<Student> records = iPage.getRecords();
  29. records.forEach(i -> System.out.println(i));
  30. c) 测试:方式二
  31. 1. Mapper层:
  32. // 自定义Sql查询
  33. IPage<Student> selectByStuName(IPage<Student> page, String stuName);
  34. 2. XML:
  35. <select id="selectByStudentName" resultType="Student">
  36. select * from t_stu where stu_name = #{stuName}
  37. </select>
  38. 3.运行:
  39. @Test
  40. void test02() {
  41. IPage<Student> studentPage = new Page<>(1,5);
  42. IPage<Student> iPage = studentMapper.selectByStudentName(studentPage, "安妮");
  43. List<Student> students = iPage.getRecords();
  44. students.forEach(i -> System.out.println(i));
  45. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号