1.wrapper简介

Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 QueryWrapper : Entity 对象封装操作类,不是用lambda语法 UpdateWrapper : Update 条件封装,用于Entity对象更新操作 AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。 LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper LambdaUpdateWrapper : Lambda 更新封装Wrapper。
2.AbstractWrapper
1)ge、gt、le、lt、isNull、isNotNull
//注意是逻辑删除。 UPDATE user SET deleted=1 WHERE deleted=0 AND name IS NULL AND age >= ? AND email IS NOT NULL
@Test
public void testDelete() {
QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
queryWrapper
.isNull("name")
.ge("age", 12)
.isNotNull("email");
int result = usersMapper.delete(queryWrapper);
System.out.println("delete return count = " + result);
}
2)eq、ne 注意:seletOne返回的是一条实体记录,当出现多条时会报错。
SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name = ?
@Test
public void testSelectOne() {
QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
queryWrapper
.eq("name", "admin")
.eq("email", "admin@qq.com");
Users user = usersMapper.selectOne(queryWrapper);
System.out.println(user);
}
3)between、notBetween
包含大小边界 SELECT COUNT(1) FROM user WHERE deleted=0 AND age BETWEEN ? AND ?
@Test
public void testSelectCount() {
QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
queryWrapper.between("age", 20, 30);
Integer count = usersMapper.selectCount(queryWrapper);
System.out.println(count);
}
4)allEq
SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name = ? AND id = ? AND age = ?
@Test
public void testSelectList2() {
QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
Map<String, Object> map = new HashMap<>();
map.put("id", 1);
map.put("name", "admin");
map.put("age", 21);
queryWrapper.allEq(map);
List<Users> users = usersMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
5)like、notLike、likeLeft、likeRight
| 方法 | 说明 |
|---|---|
| like("name","张") | %张% |
| likeLeft("name","张") | %张 |
| likeRight("name","张") | 张% |
selectMaps返回Map集合列表
SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name NOT LIKE ? AND email LIKE ?
@Test
public void testSelectMaps() {
QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
queryWrapper
.notLike("name", "admin")
.likeRight("email", "zhang");
List<Map<String, Object>> maps = usersMapper.selectMaps(queryWrapper);//返回值是Map列表
maps.forEach(System.out::println);
}
6)in、notIn、inSql、notinSql、exists、notExists
in、notIn: - notIn("age",{1,2,3})--->age not in (1,2,3) - notIn("age", 1, 2, 3)--->age not in (1,2,3)
inSql、notinSql:可以实现子查询 - 例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6) - 例: inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)
SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND id IN (select id from user where id < 5)
@Test
public void testSelectObjs() {
QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
//queryWrapper.in("id", 10, 20, 30);
queryWrapper.inSql("id", "select id from users where id < 5");
List<Object> objects = usersMapper.selectObjs(queryWrapper);//返回值是Object列表
objects.forEach(System.out::println);
}
7)or、and
注意:这里使用的是 UpdateWrapper 不调用or则默认为使用and 连接。 UPDATE user SET name=?, age=?, update_time=? WHERE deleted=0 AND name LIKE ? OR age BETWEEN ? AND ?
@Test
public void testUpdate1() {
//修改值
Users user = new Users();
user.setAge(99);
user.setName("Jerry");
//修改条件
UpdateWrapper<Users> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper
.like("name", "张")
.or()
.between("age", 20, 30);
int result = usersMapper.update(user, userUpdateWrapper);
System.out.println(result);
}
8)嵌套or、嵌套and 这里使用了lambda表达式,or中的表达式最后翻译成sql时会被加上圆括号。
UPDATE user SET name=?, age=?, update_time=? WHERE deleted=0 AND name LIKE ? OR ( name = ? AND age <> ? )
@Test
public void testUpdate2() {
Users user = new Users();
user.setAge(99);
user.setName("Andy");
//修改条件
UpdateWrapper<Users> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper
.like("name", "Tom")
.or(i -> i.eq("name", "Jerry").ne("age", 20));
int result = usersMapper.update(user, userUpdateWrapper);
System.out.println(result);
}
9)orderBy、orderByDesc、orderByAsc
SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 ORDER BY id DESC
@Test
public void testSelectListOrderBy() {
QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("id");
List<Users> users = usersMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
10)last 直接拼接到 sql 的最后 注意:只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用. SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 limit 1
@Test
public void testSelectListLast() {
QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
queryWrapper.last("limit 1");
List<Users> users = usersMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
11)指定要查询的列
SELECT id,name,age FROM user WHERE deleted=0
@Test
public void testSelectListColumn() {
QueryWrapper<Users> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id", "name", "age");
List<Users> users = usersMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
12)set、setSql 最终的sql会合并 user.setAge(),以及 userUpdateWrapper.set() 和 setSql() 中 的字段。
UPDATE user SET age=?, update_time=?, name=?, email = '123@qq.com' WHERE deleted=0 AND name LIKE ?
@Test
public void testUpdateSet() {
Users user = new Users();
user.setAge(99);
UpdateWrapper<Users> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper
.like("name", "Andy")
.set("name", "老李头")//除了可以查询还可以使用set设置修改的字段
.setSql(" email = '123@qq.com'");//可以有子查询
int result = usersMapper.update(user, userUpdateWrapper);
}