Spring Boot学习随笔- 集成MyBatis-Plus(二)条件查询QueryWrapper、聚合 ...

打印 上一主题 下一主题

主题 960|帖子 960|积分 2884

学习视频:【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备!
查询方法详解

<ul>普通查询
  1. // 根据主键id去查询单个结果的。
  2. @Test
  3. public void selectById() {
  4.     User user = userMapper.selectById(1739970502337392641L);
  5.     System.out.println(user);
  6. }
  7. //根据多个主键id批量查询结果的
  8. @Test
  9. public void selectIds() {
  10.     List<Long> list = Arrays.asList(1739970502337392641L, 1739983903621038082L, 1739984905459900417L);
  11.     List<User> userList = userMapper.selectBatchIds(list);
  12.     userList.forEach(System.out::println);
  13. }
  14. // 根据多个条件查询结果的
  15. @Test
  16. public void selectByMap() {
  17.     // map.put("name","小明")
  18.     // map.put("age",30)
  19.     // 相当于 where name ="小明" and age=30
  20.     Map<String, Object> columnMap = new HashMap<>();
  21.     columnMap.put("name", "小刚");
  22.     columnMap.put("age", "18");
  23.     List<User> userList = userMapper.selectByMap(columnMap);
  24.     userList.forEach(System.out::println);
  25. }
复制代码
条件构造器查询 【重要】
AbstractWrapper 是 MyBatis Plus 中的一个抽象类,用于构建 SQL 查询条件。定义了泛型 TC 和 Children。其中,T 表示实体类的类型,C 表示查询条件的类型,Children 表示子类的类型,用于支持链式调用。它提供了一系列方法,用于构建 SQL 查询条件,包括设置查询字段、设置查询条件、排序等。
常用实现类包括 QueryWrapper 和 UpdateWrapper。这两个类都是 MyBatis Plus 提供的具体实现,用于构建查询条件和更新条件。
条件构造器查询示例
  1. @SpringBootTest
  2. public class SelectTests {
  3.     @Autowired
  4.     private UserMapper userMapper;
  5.     /**
  6.      * 1.名字中包含刘且年龄大于20
  7.      * name like '%刘%' and age>20
  8.      */
  9.     @Test
  10.     public void selectByWrapper() {
  11.         // 创建queryWrapper的两种方式
  12.         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  13. //        QueryWrapper<User> queryWrapper1 = Wrappers.<User>query();
  14.         queryWrapper.like("name", "刘").gt("age", 20);
  15.         List<User> list = userMapper.selectList(queryWrapper);
  16.         list.forEach(System.out::println);
  17.     }
  18.     /**
  19.      * 2.名字中包含刘且年龄大于等于20且小于30并且email不为空
  20.      * name like ‘%刘’ and age between 20 and 30 and email is not null
  21.      */
  22.     @Test
  23.     public void selectByWrapper2() {
  24.         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  25.         queryWrapper.like("name", "刘").between("age", 20, 30).isNull("email");
  26.         List<User> list = userMapper.selectList(queryWrapper);
  27.         list.forEach(System.out::println);
  28.     }
  29.     /**
  30.      * 3.名字中包含刘或年龄大于等于20,按照年龄降序排序,年龄相同按照id升序排列
  31.      * name like ‘%刘’ and age between 20 and 30 and email is not null
  32.      */
  33.     @Test
  34.     public void selectByWrapper3() {
  35.         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  36.         queryWrapper.like("name", "刘").or().ge("age",20)
  37.                 .orderByDesc("age")
  38.                 .orderByAsc("user_id");
  39.         List<User> list = userMapper.selectList(queryWrapper);
  40.         list.forEach(System.out::println);
  41.     }
  42.     /**
  43.      * 4.创建日期为2023年12月17日并且直属上级为王姓
  44.      * date_format(create_time,'%Y-%m-$d') and manager_id in(select id from user where name like '王%'
  45.      */
  46.     @Test
  47.     public void selectByWrapper4() {
  48.         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  49.         queryWrapper.apply("date_format(create_time,'%Y-%m-%d')={0}", "2023-12-27") //  使用占位符避免sql注入的风险
  50.                 .inSql("manager_id","select user_id from mp_user where name like '王%'");
  51.         List<User> list = userMapper.selectList(queryWrapper);
  52.         list.forEach(System.out::println);
  53.     }
  54.     /**
  55.      * 5.名字为刘姓且年龄小于30或者邮箱不为空
  56.      * name like '王%' and (age<20 or email is not null)
  57.      */
  58.     @Test
  59.     public void selectByWrapper5() {
  60.         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  61.         queryWrapper.likeRight("name", "刘")
  62.                 .and(wq -> wq.lt("age", 30).or().isNotNull("email"));
  63.         List<User> list = userMapper.selectList(queryWrapper);
  64.         list.forEach(System.out::println);
  65.     }
  66.     /**
  67.      * 6.名字为刘姓或者(年龄小于30且大于20并且邮箱不为空)
  68.      * name like '刘%' or (age<30 and age>20 and email is not null)
  69.      */
  70.     @Test
  71.     public void selectByWrapper6() {
  72.         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  73.         queryWrapper.likeRight("name", "刘")
  74.                 .or(wq -> wq.lt("age", 30).gt("age", 20)
  75.                         .isNotNull("email"));
  76.         List<User> list = userMapper.selectList(queryWrapper);
  77.         list.forEach(System.out::println);
  78.     }
  79.     /**
  80.      * 7.(年龄小于30且邮箱不为空)并且名字为刘姓
  81.      *  (age<30 or email is not null) and name like '刘%'
  82.      */
  83.     @Test
  84.     public void selectByWrapper7() {
  85.         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  86.         queryWrapper.nested(wq -> wq.lt("age", 30)
  87.                         .or().isNotNull("email"))
  88.                 .likeRight("name", "刘");
  89.         List<User> list = userMapper.selectList(queryWrapper);
  90.         list.forEach(System.out::println);
  91.     }
  92.     /**
  93.      * 8. 年龄为 21 25 33
  94.      *  age in(21,25,33)
  95.      */
  96.     @Test
  97.     public void selectByWrapper8() {
  98.         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  99.         queryWrapper.in("age", 21, 25, 33);
  100.         List<User> list = userMapper.selectList(queryWrapper);
  101.         list.forEach(System.out::println);
  102.     }
  103.     /**
  104.      * 9. 只返回满足条件的其中一条语句即可
  105.      *  limit 1
  106.      */
  107.     @Test
  108.     public void selectByWrapper9() {
  109.         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  110.         queryWrapper.in("age", 21, 25, 33).last("limit 1"); // last() 有sql注入的风险,谨慎使用
  111.         List<User> list = userMapper.selectList(queryWrapper);
  112.         list.forEach(System.out::println);
  113.     }
  114. }
复制代码
select 不列出全部字段
  1. /**
  2.    * 10.名字中包含刘且年龄小于30(需求1加强版)
  3.    */
  4.   @Test
  5.   public void selectByWrapper() {
  6.       QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  7. //        queryWrapper.select("user_id","name","age").like("name", "刘").lt("age", 30); // 包含字段
  8.       queryWrapper.like("name", "刘").lt("age", 30)
  9.               .select(User.class, info ->
  10.                       !info.getColumn().equals("create_time") && !info.getColumn().equals("manager_id"));// 排除字段
  11.       List<User> list = userMapper.selectList(queryWrapper);
  12.       list.forEach(System.out::println);
  13.   }
复制代码
condition作用
根据判断决定查询条件是否加到sql语句里面
  1. @Test
  2.     public void testCondition() {
  3.         String name = "东";
  4.         String email = "";
  5.         condition(name, email);
  6.     }
  7.     private void condition(String name, String email) {
  8.         QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  9. //        if (StringUtils.isNotEmpty(name)) {
  10. //            queryWrapper.like("name", name);
  11. //        }
  12. //        if (StringUtils.isNotEmpty(email)) {
  13. //            queryWrapper.like("email", email);
  14. //        }
  15.         queryWrapper.like(StringUtils.isNotEmpty(name), "name", name)
  16.                 .like(StringUtils.isNotEmpty(email), "email", email);
  17.         List<User> list = userMapper.selectList(queryWrapper);
  18.         list.forEach(System.out::println);
  19.     }
复制代码
实体作为条件构造器构造方法的参数
  1. @Test
  2. public void selectByWrapperEntity() {
  3.     User user = new User();
  4.     user.setRealName("小刚");
  5.     user.setAge(18);
  6.     QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
  7.     List<User> list = userMapper.selectList(queryWrapper);
  8.     list.forEach(System.out::println);
  9. }
  10. 运行结果的sql语句:SELECT * FROM mp_user WHERE **name=? AND age=?**
  11. 会把set注入的属性和值映射到where条件中
复制代码
<ul>通过SqlCondition 更改查询条件

[code]用法@TableField(condition = SqlCondition.LIKE)private String name;@TableField(condition = "%s<#{%s}") //根据定义的常量,自己也可以参考并更改private Integer age;运行结果:SELECT * FROM mp_user WHERE **name LIKE CONCAT('%',?,'%')** AND AND age

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表