MyBatis-Plus 条件查询QueryWrapper、聚合函数的使用、Lambda条件查询、定义SQL、分页实现(PaginationInterceptor )、更新和删除
一 、普通查询
// 根据主键id去查询单个结果的。 @Test public void selectById() { User user = userMapper.selectById(1739970502337392641L); System.out.println(user); } //根据多个主键id批量查询结果的 @Test public void selectIds() { List list = Arrays.asList(1739970502337392641L, 1739983903621038082L, 1739984905459900417L); List userList = userMapper.selectBatchIds(list); userList.forEach(System.out::println); } // 根据多个条件查询结果的 @Test public void selectByMap() { // map.put("name","小明") // map.put("age",30) // 相当于 where name ="小明" and age=30 Map columnMap = new HashMap(); columnMap.put("name", "小刚"); columnMap.put("age", "18"); List userList = userMapper.selectByMap(columnMap); userList.forEach(System.out::println); }
条件构造器查询 【重要】
AbstractWrapper 是 MyBatis Plus 中的一个抽象类,用于构建 SQL 查询条件。定义了泛型 T、C 和 Children。其中,T 表示实体类的类型,C 表示查询条件的类型,Children 表示子类的类型,用于支持链式调用。它提供了一系列方法,用于构建 SQL 查询条件,包括设置查询字段、设置查询条件、排序等。
常用实现类包括 QueryWrapper 和 UpdateWrapper。这两个类都是 MyBatis Plus 提供的具体实现,用于构建查询条件和更新条件。
————————————————
@SpringBootTest public class SelectTests { @Autowired private UserMapper userMapper; /** * 1.名字中包含刘且年龄大于20 * name like '%刘%' and age>20 */ @Test public void selectByWrapper() { // 创建queryWrapper的两种方式 QueryWrapper queryWrapper = new QueryWrapper(); // QueryWrapper queryWrapper1 = Wrappers.query(); queryWrapper.like("name", "刘").gt("age", 20); List list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 2.名字中包含刘且年龄大于等于20且小于30并且email不为空 * name like ‘%刘’ and age between 20 and 30 and email is not null */ @Test public void selectByWrapper2() { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.like("name", "刘").between("age", 20, 30).isNull("email"); List list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 3.名字中包含刘或年龄大于等于20,按照年龄降序排序,年龄相同按照id升序排列 * name like ‘%刘’ and age between 20 and 30 and email is not null */ @Test public void selectByWrapper3() { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.like("name", "刘").or().ge("age",20) .orderByDesc("age") .orderByAsc("user_id"); List list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 4.创建日期为2023年12月17日并且直属上级为王姓 * date_format(create_time,'%Y-%m-$d') and manager_id in(select id from user where name like '王%' */ @Test public void selectByWrapper4() { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.apply("date_format(create_time,'%Y-%m-%d')={0}", "2023-12-27") // 使用占位符避免sql注入的风险 .inSql("manager_id","select user_id from mp_user where name like '王%'"); List list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 5.名字为刘姓且年龄小于30或者邮箱不为空 * name like '王%' and (age wq.lt("age", 30).or().isNotNull("email")); List list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 6.名字为刘姓或者(年龄小于30且大于20并且邮箱不为空) * name like '刘%' or (age20 and email is not null) */ @Test public void selectByWrapper6() { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.likeRight("name", "刘") .or(wq -> wq.lt("age", 30).gt("age", 20) .isNotNull("email")); List list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 7.(年龄小于30且邮箱不为空)并且名字为刘姓 * (age wq.lt("age", 30) .or().isNotNull("email")) .likeRight("name", "刘"); List list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 8. 年龄为 21 25 33 * age in(21,25,33) */ @Test public void selectByWrapper8() { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.in("age", 21, 25, 33); List list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 9. 只返回满足条件的其中一条语句即可 * limit 1 */ @Test public void selectByWrapper9() { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.in("age", 21, 25, 33).last("limit 1"); // last() 有sql注入的风险,谨慎使用 List list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } }
select 不列出全部字段
/** * 10.名字中包含刘且年龄小于30(需求1加强版) */ @Test public void selectByWrapper() { QueryWrapper queryWrapper = new QueryWrapper(); // queryWrapper.select("user_id","name","age").like("name", "刘").lt("age", 30); // 包含字段 queryWrapper.like("name", "刘").lt("age", 30) .select(User.class, info -> !info.getColumn().equals("create_time") && !info.getColumn().equals("manager_id"));// 排除字段 List list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); }
condition作用
根据判断决定查询条件是否加到sql语句里面
@Test public void testCondition() { String name = "东"; String email = ""; condition(name, email); } private void condition(String name, String email) { QueryWrapper queryWrapper = new QueryWrapper(); // if (StringUtils.isNotEmpty(name)) { // queryWrapper.like("name", name); // } // if (StringUtils.isNotEmpty(email)) { // queryWrapper.like("email", email); // } queryWrapper.like(StringUtils.isNotEmpty(name), "name", name) .like(StringUtils.isNotEmpty(email), "email", email); List list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); }
实体作为条件构造器构造方法的参数
@Test public void selectByWrapperEntity() { User user = new User(); user.setRealName("小刚"); user.setAge(18); QueryWrapper queryWrapper = new QueryWrapper(user); List list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } 运行结果的sql语句:SELECT * FROM mp_user WHERE **name=? AND age=?** 会把set注入的属性和值映射到where条件中
通过SqlCondition 更改查询条件
用法 @TableField(condition = SqlCondition.LIKE) private String name; @TableField(condition = "%s<#{%s}") //根据定义的常量,自己也可以参考并更改 private Integer age; 运行结果:SELECT * FROM mp_user WHERE **name LIKE CONCAT('%',?,'%')** AND AND age select * FROM `mp_user` ${ew.customSqlSegment}
@Test public void selectMy() { LambdaQueryWrapper lambda= Wrappers.lambdaQuery(); lambda.likeRight(User::getName,"刘") .and(lqw->lqw.lt(User::getAge,30) .or().isNotNull(User::getEmail)); List userList = userMapper.selectAll(lambda); userList.forEach(System.out::println); }
分页
在MyBatis Plus中,物理分页和内存分页是两种不同的分页方式。
**物理分页【推荐】是在数据库层面进行分页操作,通过SQL语句的LIMIT和OFFSET**关键字来实现。这种分页方式直接在数据库中进行数据的截取和返回,因此适用于大数据量的分页查询。
**内存分页【了解】**是在应用程序内存中进行分页操作,即先将所有数据查询出来,然后在内存中进行分页处理。这种分页方式适用于数据量较小的情况,因为需要将所有数据加载到内存中,可能会导致内存占用过高。
配置插件
@Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
分页实现
@Test public void selectPage() { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.ge("age", 30); Page page = new Page(1, 2,false);// fasle指的是不查询总记录数,提高性能 // IPage iPage = userMapper.selectPage(page, queryWrapper); // List userList = iPage.getRecords(); // selectMapsPage IPage iPage = userMapper.selectMapsPage(page, queryWrapper); System.out.println("总页数 = " + iPage.getPages()); System.out.println("总记录数 = " + iPage.getTotal()); List userList = iPage.getRecords(); userList.forEach(System.out::println); }
自定义分页
UserMapper
IPage selectUserPage(Page page, @Param(Constants.WRAPPER) Wrapper wrapper); }
UserMapper.xml
select * from mp_user ${ew.customSqlSegment}
@Test public void selectMyPage() { QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.ge("age", 30); Page page = new Page(1, 2); IPage iPage = userMapper.selectUserPage(page, queryWrapper); System.out.println("总页数 = " + iPage.getPages()); System.out.println("总记录数 = " + iPage.getTotal()); List userList = iPage.getRecords(); userList.forEach(System.out::println); }
Update,更新方法详解
@Test public void updateById() { User user = new User(); user.setUserId(3L); user.setAge(28); user.setEmail("xiao@163.com"); // 传入实体对象作为参数,自动根据id字段定位对应的记录,根据其他set的值进行更新 int rows = userMapper.updateById(user); System.out.println("rows = " + rows); } /** * 条件构造器更新 */ @Test public void updateByWrapper() { UpdateWrapper updateWrapper = new UpdateWrapper(); updateWrapper.eq("name", "小刚").eq("age", 18); // where条件 // set更新条件 User user = new User(); user.setAge(28); user.setEmail("xiao@163.com"); // 传入实体对象作为参数,自动根据id字段定位对应的记录,根据其他set的值进行更新 int rows = userMapper.update(user, updateWrapper); System.out.println("rows = " + rows); } /** * 快速更新少量字段 */ @Test public void updateByWrapper2() { UpdateWrapper updateWrapper = new UpdateWrapper(); updateWrapper.eq("name", "李刚").eq("age", 29).set("age", 30); int rows = userMapper.update(null,updateWrapper); System.out.println("rows = " + rows); } /** * lambda表达式 */ @Test public void updateByWrapper3() { LambdaUpdateWrapper lambdaUpdate = Wrappers.lambdaUpdate(); lambdaUpdate.eq(User::getName, "小刚").eq(User::getAge, 28).set(User::getAge, 31); int rows = userMapper.update(null,lambdaUpdate); System.out.println("rows = " + rows); } /** * lambda表达式链式调用 */ @Test public void updateByWrapper4() { boolean update = new LambdaUpdateChainWrapper(userMapper) .eq(User::getName, "小刚").eq(User::getAge, 31).set(User::getAge,28).update(); System.out.println("update = " + update); }
Delete 删除
@Test public void deleteById() { int rows = userMapper.deleteById(1739970502337392641L); System.out.println("rows = " + rows); } @Test public void deleteByMap() { Map map = new HashMap(); map.put("name", "小刚"); map.put("age", "25"); // DELETE FROM mp_user WHERE name = ? AND age = ? int rows = userMapper.deleteByMap(map); System.out.println("rows = " + rows); } @Test public void deleteBatchIds() { int rows = userMapper.deleteBatchIds(Arrays.asList(121111123010L, 126372731123L, 127381787813L)); // 相当于 where id in(?,?,?) System.out.println("rows = " + rows); } @Test public void deleteByWrapper() { LambdaQueryWrapper lambdaQuery = Wrappers.lambdaQuery(); lambdaQuery.eq(User::getAge, 28) .or().gt(User::getAge, 41); int rows = userMapper.delete(lambdaQuery); System.out.println("rows = " + rows); }
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。