Mybatis-Plus中Wrapper条件构造器的使用(一)

简介: Mybatis-Plus中Wrapper条件构造器的使用(一)

Wrapper条件构造器

 条件构造器wrapper就是用来封装CRUD方法参数条件的一个接口,其底层有很多的子类,最主要的就是最下面的四个子类:


queryWrapper可以用来删改查

updateWrapper可以在修改操作时不必创建实体类对象的操作

LambdaQueryWrapper和LambdaUpdateWrapper则是在字段参数的调用上进行了升级,其他都一样

因为增删改查中的增加记录不需要条件即可完成,所以增加方法无需条件构造器wrapper,其他的删改查则是有这个条件构造器参数的

image.png


1 queryWrapper构造器

1.1 组装删改查条件

组装查询条件

 查询条件为:名字里包含a字母、年龄在20~30之间、email不为空的所有值,且查询到的值按照年龄降序排序,若年龄相同则按照id升序排序

 查询返回name、age、email字段


@Test
public void selectListTest() {
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
   queryWrapper.select("name", "age", "email")
       .like("name", "a")
           .between("age", 20, 30)
           .isNotNull("email")
           .orderByDesc("age")
           .orderByAsc("id");
   // SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL) ORDER BY age DESC,id ASC
   List<Map<String, Object>> maps = mapper.selectMaps(queryWrapper);
   maps.forEach(System.out::println);
   System.out.println("========================================================================================");
   List<User> users = mapper.selectList(queryWrapper);
   users.forEach(System.out::println);
}


⚠  selectMaps和selectList的区别在于:selectMaps会将查询到的结果封装在一个元素类型为map集合的list集合中,集合中只有查询返回字段所对应的键值对;而selectList的返回值也是一个list集合,只不过元素类型为对应的泛型,包含泛型所有的字段,查询返回字段之外的值都为null组装删除条件

image.png

 删除条件:email不为空


@Test
public void deleteTest() {
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
   queryWrapper.isNull("email");
   // UPDATE user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)
   int result = mapper.delete(queryWrapper);
   System.out.println("删除的行数为" + result);
}


组装修改条件

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


@Test
public void updateTest() {
   User user = new User();
   user.setAge(20);
   user.setEmail("temporary.com");
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
   queryWrapper.gt("age", 20)
           .like("name", "a")
           .or()
           .isNull("email");
   // UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
   int result = mapper.update(user, queryWrapper);
   System.out.println("修改的行数为" + result);
}


1.2 条件优先级

 使用queryWrapper组装复杂条件的时候,存在一个且或条件的优先级问题,也就是说在实现多条件拼接的时候且或条件该如何拼接到一起,接下来就挑取两个例子来了解一下


// (年龄大于20并且用户名中包含有a) 或 邮箱为null
// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
queryWrapper.gt("age", 20)
                .like("name", "a")
                .or()
                .isNull("email");
// 用户名中包含有a 且 (年龄大于18或邮箱为null)
// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
queryWrapper.like("name", "a")
                .and(i -> i.gt("age", 18).or().isNull("email"));


 总结一下:Lambda表达式中的条件会被当做一个整体优先执行,如果不括起来影响结果的话就需要使用Lambda表达式的写法,具体的使用要根据业务SQL语句来定


1.3 实现子查询

@Test
public void sonSelectTest() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.inSql("id", "select id from user where id <= 100");
    // SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (id IN (select id from user where id <= 100))
    List<User> users = mapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}


2 updateWrapper构造器

2.1 升级修改方法(无需创建对象)

组装修改条件

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


@Test
public void updateWrapperTest() {
   UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
   updateWrapper.like("name", "a")
           .and(i -> i.gt("age", 20).or().isNull("email"));
   updateWrapper.set("name", "小黑").set("email", "dhsjfghr");
   // UPDATE user SET name=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
   int result = mapper.update(null, updateWrapper);
   System.out.println("修改的行数为" + result);
}


由SQL可见,使用updateWrapper和queryWrapper完成的修改功能一样,且调用的方法也一样(mapper.update),二者的区别就是updateWrapper不用创建实体类对象,直接使用set方法就可以设置修改的字段值


相关文章
|
10月前
|
SQL 关系型数据库 MySQL
Mybatis-plus4条件构造器方式
Mybatis-plus4条件构造器方式
42 0
|
1月前
|
SQL
条件构造器,MybatisPlus支持各种复杂的where条件,其实就是Wrapper,eq是等于的意思,相当于等于那个数值,ne就是不等于,gt大于的意思,ge大于等于,QueryWrapper是做
条件构造器,MybatisPlus支持各种复杂的where条件,其实就是Wrapper,eq是等于的意思,相当于等于那个数值,ne就是不等于,gt大于的意思,ge大于等于,QueryWrapper是做
|
3天前
|
SQL Java
6、Mybatis-Plus wrapper的使用
这篇文章详细介绍了Mybatis-Plus中Wrapper的使用,包括QueryWrapper和UpdateWrapper的基本概念、组装查询、排序、删除、修改条件的方法,以及如何设置条件优先级、组装SELECT子句和实现子查询等高级用法。
6、Mybatis-Plus wrapper的使用
|
22天前
|
Java 数据库连接 数据库
mybatis plus 中增删改查及Wrapper的使用
mybatis plus 中增删改查及Wrapper的使用
24 3
|
1月前
|
SQL
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
自定义SQL,可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,如何自定义SQL呢?利用MyBatisPlus的Wrapper来构建Wh,在mapper方法参数中用Param注
|
3月前
|
SQL
【MybatisPlus】条件构造器、自定义SQL、Service接口
【MybatisPlus】条件构造器、自定义SQL、Service接口
66 0
【MybatisPlus】条件构造器、自定义SQL、Service接口
|
3月前
|
SQL 存储 算法
Mybatis-Plus- CRUD接口-主键策略-自动填充和乐观锁-分页-逻辑删除-条件构造器和常用接口
Mybatis-Plus- CRUD接口-主键策略-自动填充和乐观锁-分页-逻辑删除-条件构造器和常用接口
|
SQL 数据库
MyBatisPlus 之 条件查询 <条件构造器>
MyBatisPlus 之 条件查询 <条件构造器>
142 0
mysql-MybatisPlus的条件构造器
MybatisPlus的条件构造器
|
3月前
|
SQL XML Java
MyBatis Plus通用CRUD与条件构造器使用及SQL自动注入原理分析
MyBatis Plus通用CRUD与条件构造器使用及SQL自动注入原理分析
193 0