Wrapper条件构造器
条件构造器wrapper就是用来封装CRUD方法参数条件的一个接口,其底层有很多的子类,最主要的就是最下面的四个子类:
queryWrapper可以用来删改查
updateWrapper可以在修改操作时不必创建实体类对象的操作
LambdaQueryWrapper和LambdaUpdateWrapper则是在字段参数的调用上进行了升级,其他都一样
因为增删改查中的增加记录不需要条件即可完成,所以增加方法无需条件构造器wrapper,其他的删改查则是有这个条件构造器参数的
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组装删除条件
删除条件: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方法就可以设置修改的字段值