首页 > 其他分享 >Mybatis-Plus条件构造器

Mybatis-Plus条件构造器

时间:2023-05-07 22:22:24浏览次数:32  
标签:queryWrapper name QueryWrapper age 构造 Plus user Mybatis email

Wrapper 介绍

image-20230507210613126

  • Wrapper : 条件构造抽象类,最顶端父类
    • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
      • QueryWrapper : 查询条件封装
      • UpdateWrapper : Update 条件封装
      • AbstractLambdaWrapper : 使用Lambda 语法
        • LambdaQueryWrapper :用于Lambda语法使用的查询Wrappe
        • LambdaUpdateWrapper : Lambda 更新封装Wrapper

QueryWrapper

组装查询条件

@Test
public void test1() {
    //查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
    //SELECT id,name,age,email FROM t_user WHERE (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
    QueryWrapper<User> queryWrapper = new QueryWrapper();
    queryWrapper.like("name", "a")
        .between("age", 20, 30)
        .isNotNull("email");
    List list = this.userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

组装排序条件

@Test
public void test2() {
    //按年龄降序查询用户,如果年龄相同则按id升序排列
    //SELECT id,name,age,email FROM t_user ORDER BY age DESC,id ASC
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.orderByDesc("age").orderByAsc("id");
    List list = this.userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

组装删除条件

@Test
public void test3() {
    //删除email为空的用户
    //DELETE FROM t_user WHERE (email IS NULL)
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.isNull("email");
    int result = this.userMapper.delete(queryWrapper);
    System.out.println("result:" + result);
}

条件的优先级

将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改:

@Test
public void test4() {
    //将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
    //UPDATE t_user SET age=?, email=? WHERE (age > ? AND name LIKE ? OR email IS NULL)
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.gt("age", 20).like("name", "a").or().isNull("email");
    User user = new User();
    user.setAge(18);
    user.setEmail("[email protected]");
    int result = this.userMapper.update(user, queryWrapper);
    System.out.println("result:" + result);
}

将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改:

lambda表达式内的逻辑会优先运算

@Test
public void test5() {
    //将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
    //UPDATE t_user SET age=?, email=? WHERE (name LIKE ? AND (age > ? OR email IS NULL))
    //lambda表达式内的逻辑优先运算
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("name", "a").and(i -> i.gt("age", 20).or().isNull("email"));
    User user = new User();
    user.setAge(18);
    user.setEmail("[email protected]");
    int result = this.userMapper.update(user, queryWrapper);
    System.out.println("result:" + result);
}

组装select子句

@Test
public void test6() {
    //查询用户信息的name和age字段
    //SELECT name,age FROM t_user
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("name", "age");
    //selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值为null
    List<Map<String, Object>> maps = this.userMapper.selectMaps(queryWrapper);
    maps.forEach(System.out::println);
}

实现子查询

@Test
public void test7() {
    //查询id小于等于3的用户信息
    //SELECT id,name,age,email FROM t_user WHERE (id IN (select id from t_user where id <= 3))
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.inSql("id", "select id from t_user where id <= 3");
    List<User> users = this.userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

使用condition组装条件

在真正开发的过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因 此我们在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若 没有选择则一定不能组装,以免影响SQL执行的结果

@Test
public void test8() {
    //定义查询条件,有可能为null(用户未输入或未选择)
    //SELECT id,name,age,email FROM t_user WHERE (age >= ? AND age <= ?)
    //        String username = null;
    //        Integer ageBegin = 10;
    //        Integer ageEnd = 24;

    //SELECT id,name,age,email FROM t_user WHERE (name LIKE ? AND age <= ?)
    String username = "a";
    Integer ageBegin = null;
    Integer ageEnd = 24;
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like(StringUtils.isNotBlank(username), "name", username)
        .ge(ageBegin != null, "age", ageBegin)
        .le(ageEnd != null, "age", ageEnd);
    List<User> users = this.userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

UpdateWrapper

@Test
public void test9() {
    //将(年龄大于20或邮箱为null)并且用户名中包含有a的用户信息修改
    //方式一:
    //UPDATE t_user SET name=?,age=? WHERE (name LIKE ? AND (age > ? OR email IS NULL))
    //        UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    //        userUpdateWrapper.set("name", "张三").set("age", 18)
    //                .like("name", "a")
    //                .and(i -> i.gt("age", 20).or().isNull("email"));
    //        this.userMapper.update(null, userUpdateWrapper);

    //方式二:
    //UPDATE t_user SET name=?, age=? WHERE (name LIKE ? AND (age > ? OR email IS NULL))
    UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
    userUpdateWrapper.like("name", "a")
        .and(i -> i.gt("age", 20).or().isNull("email"));
    User user = new User();
    user.setName("张三");
    user.setAge(18);
    this.userMapper.update(user, userUpdateWrapper);
}

LambdaQueryWrapper

@Test
public void test10() {
    //定义查询条件,有可能为null(用户未输入或未选择)
    //SELECT id,name,age,email FROM t_user WHERE (name LIKE ? AND age <= ?)
    String username = "a";
    Integer ageBegin = null;
    Integer ageEnd = 24;
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.like(StringUtils.isNotBlank(username), User::getName, username)
        .ge(ageBegin != null, User::getAge, ageBegin)
        .le(ageEnd != null, User::getAge, ageEnd);
    List<User> users = this.userMapper.selectList(lambdaQueryWrapper);
    users.forEach(System.out::println);
}

LambdaUpdateWrapper

@Test
public void test11() {
    //将(年龄大于20或邮箱为null)并且用户名中包含有a的用户信息修改
    //UPDATE t_user SET name=?,age=? WHERE (name LIKE ? AND (age > ? OR email IS NULL))
    LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
    lambdaUpdateWrapper.set(User::getName, "张三")
        .set(User::getAge, 18)
        .like(User::getName, "a")
        .and(i -> i.gt(User::getAge, 20).or().isNull(User::getEmail));
    this.userMapper.update(null, lambdaUpdateWrapper);
}

标签:queryWrapper,name,QueryWrapper,age,构造,Plus,user,Mybatis,email
From: https://www.cnblogs.com/1963942081zzx/p/17380309.html

相关文章

  • Mybatis-Plus常用注解
    @TableName@TableName设置实体类对应表名。在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表,只是在Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表。MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决定,且默认操作的表名和实体类型......
  • Mybatis-Plus基本CRUD——通用Service
    通用ServiceCRUD封装IService接口,进一步封装CRUD采用get查询单行remove删除list查询集合page分页前缀命名方式区分Mapper层避免混淆。MyBatis-Plus中有一个接口IService和其实现类ServiceImpl,封装了常见的业务层逻辑。创建Service接口和实现类IUserService......
  • Mybatis-Plus基本CRUD——通用Mapper
    BaseMapper接口MyBatis-Plus中的基本CRUD在内置的BaseMapper中都已得到了实现,我们可以直接使用,接口如下:/***Mapper继承该接口后,无需编写mapper.xml文件,即可获得CRUD功能*<p>这个Mapper支持id泛型</p>**@authorhubin*@since2016-01-23*/publicinter......
  • Mybatis缓存机制
    1.ORM映射:将数据库中的一条语句映射到Java对象。2.MyBatis缓存机制:执行查询语句时候,将查询结果放到缓存当中(内存),如果下一次还是执行完全相同的查询语句,直接从缓存中拿数据。不再查数据库。不再去硬盘上找数据。目的是为了提高效率,通过减少IO的方式提高效率。3.缓存指针对查询语......
  • Mybatis-Plus 简介及入门案例
    Mybatis简介MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。官网地址:https://www.baomidou.com/特性无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本CURD,性能基本......
  • 在vue3中使用elementPlus的el-select时样式穿透问题
    下拉框的option样式只能在全局样式里改,千万不能用scope,否则不生效<el-selectclass="select":popper-append-to-body="false"v-model="selectValue"placeholder="请选择"popper-class="select-option"><......
  • springboot集成下,mybatis的mapper代理对象究竟是如何生成的
    springboot集成下,mybatis的mapper代理对象究竟是如何生成的 前情回顾Mybatis源码解析-mapper代理对象的生成,你有想过吗,我们讲到了mybatis操作数据库的流程:先创建SqlSessionFactory,然后创建SqlSession,然后再创建获取mapper代理对象,最后利用mapper代理对象完成数据库......
  • MyBatis-02CRUD操作及配置解析01
    上集回顾:第一个程序namespace将上面案例中的UserMapper接口改名为UserDao;将UserMapper.xml中的namespace改为为UserDao的路径.再次测试结论:配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致!1CRUD操作及配置解析1.1selectselect标......
  • 使用set构造bug
    目录使用set构造BUG原理:std::set的insert相同obj只会保留一个使用set构造BUG原理:std::set的insert相同obj只会保留一个当我们setA.insert(1),setA.insert(2),setA.insert(3)后,会发现setA里的1,2分别只有1个,故可以使用重载对象的operator==来让一个对象可能无法insert展开查......
  • Mybatis设计模式
    创建型建造者模式,工厂模式我们在单独Mybatis框架执行SQL语句的时候,需要获得SqlSession实例来直接执行已映射的SQL语句,在获得SqlSession实例的过程中,就使用了建造者模式和工厂模式。我们来看看一下调用过程:1Stringresource="org/mybatis/example/mybatis-config.xml";2......