06-条件构造器
十分重要:Wrapper 记住查看输出的SQL进行分析
AbstractWrapper
- 测试一:查询name不为空,email不为空,age大于18的数据
@Test
void testWrapper01() {
//参数是一个wrapper ,条件构造器,和刚才的map对比学习!
//查询name不为空,email不为空,age大于18的用户
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper
.isNotNull("name")
.isNotNull("email")
.ge("age", 18);
List<User> userList = userMapper.selectList(wrapper);
userList.forEach(System.out::println);
}
- 测试二:查询name为小芳的用户
@Test
void testWrapper02() {
// 查询name为小芳的用户
QueryWrapper<User> wrapper = new QueryWrapper<>();
//查询一个数据selectOne,若查询出多个会报错
//Expected one result (or null) to be returned by selectOne(), but found: *
//若出现多个结果使用list或map
wrapper.eq("name", "小芳");
User user = userMapper.selectOne(wrapper); //查询一个数据,若出现多个结果使用selectList或selectMap
System.out.println(user);
}
- 测试三: 查询age在10-20之间的用户
@Test
void testWrapper03() {
// 查询age在10-20之间的用户
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age", 10 , 20);
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
// 统计有多少数据
Integer count = userMapper.selectCount(wrapper);
System.out.println(count);
}
- 模糊查询
@Test
void testWrapper04() {
// 模糊查询
QueryWrapper<User> wrapper = new QueryWrapper<>();
// select * from user where name not like "%小%" and email like "t%"
// 查询name字段不带小并且email字段t开头的数据
wrapper.notLike("name", "小").likeRight("email", "t");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
- insql
@Test
void testWrapper05() {
// 模糊查询
// SELECT id,name,age,email,version,deleted,create_time,update_time
//FROM user
//WHERE deleted=0 AND id IN
//(select id from user where id<5)
QueryWrapper<User> wrapper = new QueryWrapper<>();
//id 在子查询中查出来
wrapper.inSql("id", "select id from user where id < 5");
List<Object> users = userMapper.selectObjs(wrapper);
users.forEach(System.out::println);
}
- 排序
@Test
public void testWrapper6() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
//通过id进行降序排序
wrapper.orderByDesc("id");
List<User> userList = userMapper.selectList(wrapper);
userList.forEach(System.out::println);
}
- 统计男女各多少人
实体类
private String sex;
添加字段
测试
// 分组查询
@Test
public void testWrapper07() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 统计男女各多少人
wrapper.select("sex, count(*) as count");
wrapper.groupBy("sex");
List<User> userList = userMapper.selectList(wrapper);
userList.forEach(System.out::println);
}
- or
// 查询id=1或者name=叶枫的数据
@Test
public void testWrapper08() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// select * from user where id = 1 or name = 小枫
wrapper.eq("id", 1L).or().eq("name", "小枫");
List<User> userList = userMapper.selectList(wrapper);
userList.forEach(System.out::println);
}
// or()嵌套查询
@Test
public void testWrapper09() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// select * from user where and(name = 小枫 and id <> 1)
wrapper.or(i -> i.eq("name", "小枫").ne("id", 1L)); // ne -> <>不等于
List<User> userList = userMapper.selectList(wrapper);
userList.forEach(System.out::println);
}
QueryWrapper
queryWrapper的select可以设置要查询的列
基本使用
select(String... sqlSelect)
select(Predicatepredicate)
select(ClassentityClass, Predicate predicate)
SQL语句如下
select id, name from user
mp写法如下
@Test
public void testWrapper10() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("id", "name");
List<User> userList = userMapper.selectList(wrapper);
userList.forEach(System.out::println);
}
UpdateWrapper
我们前面在使用update方法时需要创建一个实体类对象传入,用来指定要更新的列对应的值。但是如果要更新的列比较少,创建这么一个对象显得有点麻烦和复杂
我们可以使用updatewrapper的set方法来设置要更新的列及其值。同时这种方式也可以使用Wrapper去指定更复杂的更新条件
示例
Sql语句如下
update user set name = "小天" where id = 2;
写法如下
@Test
public void testWrapper10() {
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id", 1");
wrapper.set("name", "小天");
wrapper。update(null, wrapper);
}
lambda
我们前面在使用条件构造器时列名都是用字符串的形式去指定。这种方式无法在编译期确定列名的合法性。
所以MP提供了一个Lambda条件构造器可以让我们直接以实体类的方法引用的形式来指定列名。这样就可以弥补上述缺陷。
示例
要执行的SQL
select * from user where age > 18 and name = "小枫";
构造器如下
@Test
public void testWrapper12() {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.gt(User::getAge, 18);
List<User> userList = userMapper.selectList(wrapper);
userList.forEach(System.out::println);
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步