Spring Boot学习随笔- 集成MyBatis-Plus(三)自定义SQL、分页实现(PaginationInterceptor )、更新和删除详细方法
1.Spring Boot学习随笔-SpringBoot的引言,回顾传统SSM开发2.Spring Boot学习随笔-第一个SpringBoot项目快速启动(org.springframework.boot、@SpringBootApplication、application.yml)3.Spring Boot学习随笔- @SpringBootApplication详解、加载绝对路径配置文件、工厂创建对象(@ConfigurationProperties、@Value)4.Spring Boot学习随笔- 集成JSP模板(配置视图解析器)、整合Mybatis(@MapperScan注解的使用)5.Spring Boot学习随笔- 本地化测试(@SpringBootTest)、热部署(spring-boot-devtools)、日志Logback常用级别使用、指定包级别输出6.Spring Boot学习随笔- JSP小项目-员工管理系统(验证码生成、增删改查)7.Spring Boot学习随笔- 实现AOP(JoinPoint、ProceedingJoinPoint、自定义注解类实现切面)8.Spring Boot学习随笔- 文件上传和下载(在线打开、附件下载、MultipartFile)9.Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署10.Spring Boot学习随笔- 第一个Thymeleaf应用(基础语法th:,request、session作用域取值)11.Spring Boot学习随笔- RestFul API(@RestController、@RequestBody、@PathVariable),使用ResponseEntity+HttpStatus作为返回值12.Spring Boot学习随笔- 后端实现全局异常处理(HandlerExceptionResolver),前后端解决跨域问题(@CrossOrigin(局部解决)自定义跨域配置类(全局))13.Spring Boot学习随笔- Jasypt加密数据库用户名和密码以及解密14.Spring Boot学习随笔- 集成MyBatis-Plus(一),第一个MP程序(环境搭建、@TableName、@TableId、@TableField示例)15.Spring Boot学习随笔- 集成MyBatis-Plus(二)条件查询QueryWrapper、聚合函数的使用、Lambda条件查询
16.Spring Boot学习随笔- 集成MyBatis-Plus(三)自定义SQL、分页实现(PaginationInterceptor )、更新和删除详细方法
自定义SQL
自定义mapper文件是为了应对一些更复杂的查询场景,首先先配置映射路径
mybatis-plus: mapper-locations: com/mp/dao/xml/*
由于这里的mapper文件放在java文件夹中,所以要在pom.xml里进行配置
<build> <resources> <resource> <!-- xml放在java目录下--> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <!--指定资源的位置(xml放在resources下,可以不用指定)--> <resource> <directory>src/main/java</directory> </resource> </resources> </build>
-
mapper
public interface UserMapper extends BaseMapper<User> { List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> wrapper); } <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.mp.dao.UserMapper"> <select id="selectAll" resultType="com.mp.entity.User"> select * FROM `mp_user` ${ew.customSqlSegment} </select> </mapper> -
测试
@Test public void selectMy() { LambdaQueryWrapper<User> lambda= Wrappers.<User>lambdaQuery(); lambda.likeRight(User::getName,"刘") .and(lqw->lqw.lt(User::getAge,30) .or().isNotNull(User::getEmail)); List<User> 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<User> queryWrapper = new QueryWrapper<>(); queryWrapper.ge("age", 30); Page<User> page = new Page<User>(1, 2,false);// fasle指的是不查询总记录数,提高性能 // IPage<User> iPage = userMapper.selectPage(page, queryWrapper); // List<User> userList = iPage.getRecords(); // selectMapsPage IPage<Map<String, Object>> iPage = userMapper.selectMapsPage(page, queryWrapper); System.out.println("总页数 = " + iPage.getPages()); System.out.println("总记录数 = " + iPage.getTotal()); List<Map<String, Object>> userList = iPage.getRecords(); userList.forEach(System.out::println); } -
自定义分页
-
UserMapper
IPage<User> selectUserPage(Page<User> page, @Param(Constants.WRAPPER) Wrapper<User> wrapper); } -
UserMapper.xml
<select id="selectUserPage" resultType="com.mp.entity.User"> select * from mp_user ${ew.customSqlSegment} </select> -
测试
@Test public void selectMyPage() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.ge("age", 30); Page<User> page = new Page<User>(1, 2); IPage<User> iPage = userMapper.selectUserPage(page, queryWrapper); System.out.println("总页数 = " + iPage.getPages()); System.out.println("总记录数 = " + iPage.getTotal()); List<User> 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<User> 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<User> 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<User> 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<User>(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<String,Object> 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<User> lambdaQuery = Wrappers.lambdaQuery(); lambdaQuery.eq(User::getAge, 28) .or().gt(User::getAge, 41); int rows = userMapper.delete(lambdaQuery); System.out.println("rows = " + rows); }
作者:扬眉剑出鞘
出处: https://www.cnblogs.com/eyewink/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~