• 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的。

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

    方案1:直接用eq

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

    执行结果 

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

    方案2:传实体类 

    1. public void testSelectList() {
    2. User user = new User();
    3. user.setName("张");
    4. user.setAge(28);
    5. user.setLastName(null);
    6. QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
    7. //User user = userMapper.selectOne(queryWrapper); //查询一条记录
    8. //System.out.println(user);
    9. List<User> users = userMapper.selectList(queryWrapper);
    10. users.forEach(System.out::println);
    11. }

    执行结果

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

    方案3:Map+allEq

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

     执行结果

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

    传入false执行结果

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

    多条件查询

    多条件查询

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

    1. public void selectWrapper01() {
    2. QueryWrapper queryWrapper = new QueryWrapper();
    3. queryWrapper.likeRight("name", "王");
    4. queryWrapper.between("age", 20, 40);
    5. queryWrapper.isNotNull("email");
    6. // 这样写也可以
    7. // queryWrapper.likeRight("name", "王")
    8. // .between("age", 20, 40)
    9. // .isNotNull("email");
    10. List list = userMapper.selectList(queryWrapper);
    11. list.forEach(System.out::println);
    12. }

    多条件查询并排序

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

    1. public void selectWrapper02() {
    2. QueryWrapper queryWrapper = new QueryWrapper();
    3. queryWrapper.likeRight("name", "王");
    4. queryWrapper.or();
    5. queryWrapper.ge("age", 30);
    6. queryWrapper.orderByDesc("age");
    7. queryWrapper.orderByAsc("id");
    8. // 这样写也可以
    9. // queryWrapper.likeRight("name", "王")
    10. // .or()
    11. // .ge("age", 30)
    12. // .orderByDesc("age")
    13. // .orderByAsc("id");
    14. List list = userMapper.selectList(queryWrapper);
    15. list.forEach(System.out::println);
    16. }

    返回部分字段

    法1:返回需要的字段

    返回多个列 

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

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

    法2:返回需要的字段

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

    执行结果 

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

    法3:过滤不需要的字段 

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

    condition

    简介

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

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

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

    1. java.lang.NullPointerException
    2. at java.util.Objects.requireNonNull(Objects.java:203)
    3. at java.util.Arrays$ArrayList.<init>(Arrays.java:3813)
    4. at java.util.Arrays.asList(Arrays.java:3800)

    执行条件用来简化代码

    1. private void condition(String name, String email) {
    2. QueryWrapper<User> wrapper = new QueryWrapper<>();
    3. // 需要六行,太麻烦
    4. // if(StringUtils.isNotBlank(name)){
    5. // wrapper.like("name",name);
    6. // }
    7. // if(StringUtils.isNotBlank(name)){
    8. // wrapper.like("name",name);
    9. // }
    10. // 用此法只需两行
    11. wrapper.like(StringUtils.isNotBlank("name"), "name", name)
    12. .like(StringUtils.isNotBlank("email"), "email", email);
    13. List<User> users = userMapper.selectList(wrapper);
    14. for (User user : users) {
    15. System.out.println(user.toString());
    16. }
    17. }

    nested、and、in

    多条件查询(nested)

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

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

    多条件查询(and)

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

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

    in

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

    其他操作

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

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

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

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

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

    根据 Wrapper 条件,返回maps

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

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

     打印结果                                                                   

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

    根据 entity 条件,删除记录

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

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

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

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

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

     打印结果                                                           
    ==>  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 实体对象封装操作类 
    和上个分页同理只是返回类型不同

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

  • 相关阅读:
    DotNet 中 npgsql无法正常使用的处理
    Android-Jetpack Compose的简单运用
    Java SqlSessionFactoryBean.setMapperLocations方法代码示例
    【数据分析】:搭建数据分析业务工作流程
    LVS+Keepalived高可用群集
    flink MemoryStateBackend 和 RocksDBStateBackend 切换导致任务出现bug
    工业设计的特点和流程
    Docker‘s Network
    Spring Boot中使用XMl文件配置MyBatis
    QFile文件读写操作QFileInFo文件信息读取
  • 原文地址:https://blog.csdn.net/feiying0canglang/article/details/125508511