mybatis-plus中wrapper的用法(详细)
1、根据主键或者简单的查询条件进行查询/*** 通过单个ID主键进行查询*/@Test/*** 通过多个ID主键查询*/@Test/*** 通过Map参数进行查询*/@Testparams.put("name", "张雨琪");
·
一、条件构造器关系介绍

二、项目实例

1、根据主键或者简单的查询条件进行查询
/**
* 通过单个ID主键进行查询
*/
@Test
public void selectById() {
User user = userMapper.selectById(1094592041087729666L);
System.out.println(user);
}
/**
* 通过多个ID主键查询
*/
@Test
public void selectByList() {
List<Long> longs = Arrays.asList(1094592041087729666L, 1094590409767661570L);
List<User> users = userMapper.selectBatchIds(longs);
users.forEach(System.out::println);
}
/**
* 通过Map参数进行查询
*/
@Test
public void selectByMap() {
Map<String, Object> params = new HashMap<>();
params.put("name", "张雨琪");
List<User> users = userMapper.selectByMap(params);
users.forEach(System.out::println);
}
2、MyBatis-Plus还提供了Wrapper条件构造器,具体使用看如下代码:
/**
* 名字包含雨并且年龄小于40
* <p>
* WHERE name LIKE '%雨%' AND age < 40
*/
@Test
public void selectByWrapperOne() {
QueryWrapper<User> wrapper = new QueryWrapper();
wrapper.like("name", "雨").lt("age", 40);
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 名字包含雨
* 年龄大于20小于40
* 邮箱不能为空
* <p>
* WHERE name LIKE '%雨%' AND age BETWEEN 20 AND 40 AND email IS NOT NULL
*/
@Test
public void selectByWrapperTwo() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.like("name", "雨").between("age", 20, 40).isNotNull("email");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 名字为王性
* 或者年龄大于等于25
* 按照年龄降序排序,年龄相同按照id升序排序
* <p>
* WHERE name LIKE '王%' OR age >= 25 ORDER BY age DESC , id ASC
*/
@Test
public void selectByWrapperThree() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.likeRight("name", "王").or()
.ge("age", 25).orderByDesc("age").orderByAsc("id");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 查询创建时间为2019年2月14
* 并且上级领导姓王
* <p>
* WHERE date_format(create_time,'%Y-%m-%d') = '2019-02-14' AND manager_id IN (select id from user where name like '王%')
*/
@Test
public void selectByWrapperFour() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.apply("date_format(create_time,'%Y-%m-%d') = {0}", "2019-02-14")
.inSql("manager_id", "select id from user where name like '王%'");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 查询王姓
* 并且年龄小于40或者邮箱不为空
* <p>
* WHERE name LIKE '王%' AND ( age < 40 OR email IS NOT NULL )
*/
@Test
public void selectByWrapperFive() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.likeRight("name", "王").and(qw -> qw.lt("age", 40).or().isNotNull("email"));
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 查询王姓
* 并且年龄大于20 、年龄小于40、邮箱不能为空
* <p>
* WHERE name LIKE ? OR ( age BETWEEN ? AND ? AND email IS NOT NULL )
*/
@Test
public void selectByWrapperSix() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.likeRight("name", "王").or(
qw -> qw.between("age", 20, 40).isNotNull("email")
);
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* (年龄小于40或者邮箱不为空) 并且名字姓王
* WHERE ( age < 40 OR email IS NOT NULL ) AND name LIKE '王%'
*/
@Test
public void selectByWrapperSeven() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.nested(qw -> qw.lt("age", 40).or().isNotNull("email"))
.likeRight("name", "王");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 查询年龄为30、31、32
* WHERE age IN (?,?,?)
*/
@Test
public void selectByWrapperEight() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.in("age", Arrays.asList(30, 31, 32));
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 查询一条数据
* limit 1
*/
@Test
public void selectByWrapperNine() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.in("age", Arrays.asList(30, 31, 32)).last("limit 1");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
三、具体使用操作
**注意:**以下条件构造器的方法入参中的column?均表示数据库字段
1、ge、gt、le、lt、isNull、isNotNull
@Test
public void testDelete() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper
.isNull("name")
.ge("age", 12)
.isNotNull("email");
int result = userMapper.delete(queryWrapper);
System.out.println("delete return count = " + result);
}
SQL:UPDATE user SET deleted=1 WHERE deleted=0 AND name IS NULL AND age >= AND email IS NOT NULL
2、eq、ne
注意:seletOne返回的是一条实体记录,当出现多条时会报错
@Test
public void testSelectOne() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "Tom");
User user = userMapper.selectOne(queryWrapper);
System.out.println(user);
}
3、between、notBetween
包含大小边界
@Test
public void testSelectCount() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.between("age", 20, 30);
Integer count = userMapper.selectCount(queryWrapper);
System.out.println(count);
}
SELECT COUNT(1) FROM user WHERE deleted=0 AND age BETWEEN 20 AND 30
4、allEq
@Test
public void testSelectList() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
Map<String, Object> map = new HashMap<>();
map.put("id", 2);
map.put("name", "Jack");
map.put("age", 20);9
queryWrapper.allEq(map);
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
SELECT id,name,age,email,create_time,update_time,deleted,version FROM user WHERE deleted=0 AND name = "Jack" AND id = 2 AND age = 20
5、like、notLike、likeLeft、likeRight
selectMaps返回Map集合列表
@Test
public void testSelectMaps() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper
.notLike("name", "e")
.likeRight("email", "t");
List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表
maps.forEach(System.out::println);
}
SELECT id,name,age,email,create_time,update_time,
deleted,version FROM user
WHERE deleted=0 AND name NOT LIKE "e" AND email LIKE RIGHT "t"
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)
@Test
public void testSelectObjs() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//queryWrapper.in("id", 1, 2, 3);
queryWrapper.inSql("id", "select id from user where id < 3");
List<Object> objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表
objects.forEach(System.out::println);
}
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 < 3)
7、or、and
注意:这里使用的是 UpdateWrapper 不调用or则默认为使用 and 连
@Test
public void testUpdate1() {
//修改值
User user = new User();
user.setAge(99);
user.setName("Andy");
//修改条件
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper
.like("name", "h")
.or()
.between("age", 20, 30);
int result = userMapper.update(user, userUpdateWrapper);
System.out.println(result);
}
UPDATE user SET name="Andy", age=99
WHERE deleted=0 AND name LIKE "h" OR age BETWEEN 20 AND 30
8、嵌套or、嵌套and
这里使用了lambda表达式,or中的表达式最后翻译成sql时会被加上圆括号
@Test
public void testUpdate2() {
//修改值
User user = new User();
user.setAge(99);
user.setName("Andy");
//修改条件
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper
.like("name", "h")
.or(i -> i.eq("name", "李白").ne("age", 20));
int result = userMapper.update(user, userUpdateWrapper);
System.out.println(result);
}
UPDATE user SET name=, age=, update_time=
WHERE deleted=0 AND name LIKE
OR ( name = AND age <> )
9、orderBy、orderByDesc、orderByAsc
@Test
public void testSelectListOrderBy() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("id");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
SELECT id,name,age,email,create_time,update_time,deleted,version
FROM user WHERE deleted=0 ORDER BY id DESC
10、last
直接拼接到 sql 的最后
注意:只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用
@Test
public void testSelectListLast() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.last("limit 1");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
SELECT id,name,age,email,create_time,update_time,deleted,version
FROM user WHERE deleted=0 limit 1
11、指定要查询的列
@Test
public void testSelectListColumn() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id", "name", "age");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
SELECT id,name,age FROM user WHERE deleted=0
12、set、setSql
最终的sql会合并 user.setAge(),以及 userUpdateWrapper.set() 和 setSql() 中 的字段
@Test
public void testUpdateSet() {
//修改值
User user = new User();
user.setAge(99);
//修改条件
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper
.like("name", "h")
.set("name", "老李头")//除了可以查询还可以使用set设置修改的字段
.setSql(" email = '123@qq.com'");//可以有子查询
int result = userMapper.update(user, userUpdateWrapper);
}
UPDATE user SET age=, update_time=, name=, email = '123@qq.com'
WHERE deleted=0 AND name LIKE
四、项目中实际应用代码实例
实例1–包含 eq相等的比较方法

实例2–包含 ge le ge等比较方法,及分页查询方法

实例3
/**
* 名字包含雨并且年龄小于40
* <p>
* WHERE name LIKE '%雨%' AND age < 40
*/
@Test
public void selectByWrapperOne() {
QueryWrapper<User> wrapper = new QueryWrapper();
wrapper.like("name", "雨").lt("age", 40);
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 名字包含雨
* 年龄大于20小于40
* 邮箱不能为空
* <p>
* WHERE name LIKE '%雨%' AND age BETWEEN 20 AND 40 AND email IS NOT NULL
*/
@Test
public void selectByWrapperTwo() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.like("name", "雨").between("age", 20, 40).isNotNull("email");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 名字为王性
* 或者年龄大于等于25
* 按照年龄降序排序,年龄相同按照id升序排序
* <p>
* WHERE name LIKE '王%' OR age >= 25 ORDER BY age DESC , id ASC
*/
@Test
public void selectByWrapperThree() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.likeRight("name", "王").or()
.ge("age", 25).orderByDesc("age").orderByAsc("id");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 查询创建时间为2019年2月14
* 并且上级领导姓王
* <p>
* WHERE date_format(create_time,'%Y-%m-%d') = '2019-02-14' AND manager_id IN (select id from user where name like '王%')
*/
@Test
public void selectByWrapperFour() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.apply("date_format(create_time,'%Y-%m-%d') = {0}", "2019-02-14")
.inSql("manager_id", "select id from user where name like '王%'");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 查询王姓
* 并且年龄小于40或者邮箱不为空
* <p>
* WHERE name LIKE '王%' AND ( age < 40 OR email IS NOT NULL )
*/
@Test
public void selectByWrapperFive() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.likeRight("name", "王").and(qw -> qw.lt("age", 40).or().isNotNull("email"));
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 查询王姓
* 并且年龄大于20 、年龄小于40、邮箱不能为空
* <p>
* WHERE name LIKE ? OR ( age BETWEEN ? AND ? AND email IS NOT NULL )
*/
@Test
public void selectByWrapperSix() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.likeRight("name", "王").or(
qw -> qw.between("age", 20, 40).isNotNull("email")
);
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* (年龄小于40或者邮箱不为空) 并且名字姓王
* WHERE ( age < 40 OR email IS NOT NULL ) AND name LIKE '王%'
*/
@Test
public void selectByWrapperSeven() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.nested(qw -> qw.lt("age", 40).or().isNotNull("email"))
.likeRight("name", "王");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 查询年龄为30、31、32
* WHERE age IN (?,?,?)
*/
@Test
public void selectByWrapperEight() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.in("age", Arrays.asList(30, 31, 32));
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 查询一条数据
* limit 1
*/
@Test
public void selectByWrapperNine() {
QueryWrapper<User> wrapper = Wrappers.query();
wrapper.in("age", Arrays.asList(30, 31, 32)).last("limit 1");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 名字包含雨并且年龄小于40
* <p>
* 只显示id、name 两列
*/
@Test
public void selectByWrapper1() {
QueryWrapper<User> wrapper = new QueryWrapper();
wrapper.like("name", "雨").lt("age", 40)
.select("id","name");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 名字包含雨并且年龄小于40
* <p>
* 除了create_time、manager_id 其他列都显示
*/
@Test
public void selectByWrapper2() {
QueryWrapper<User> wrapper = new QueryWrapper();
wrapper.like("name", "雨").lt("age", 40)
.select(User.class,i -> !i.getColumn().equals("create_time")
&& !i.getColumn().equals("manager_id"));
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)