作者平台:
| CSDN:https://blog.csdn.net/qq_41153943(ID:江夏、)
| 掘金:https://juejin.cn/user/651387938290686(ID:jiangxia_1024)
| 知乎:https://www.zhihu.com/people/1024-paper-96(ID:江夏)
| GitHub:https://github.com/JiangXia-1024?tab=repositories
| 微信公众号:1024笔记
本文一共2314字,预计阅读15分钟
1、MyBatis
MyBatis原生支持分页功能,可以在SQL语句中通过LIMIT和OFFSET来进行分页查询。LIMIT后表示每页显示的记录数,OFFSET后表示查询的起始记录行数。
对于大数据量的分页查询,可以使用Mybatis的分页插件来实现更高效的分页操作。其基本的原理是在执行SQL查询之后,通过AOP拦截器将查询结果进行拦截,并将查询的结果集进行再处理以得到分页结果。常见的分页插件如为PageHelper、Mybatis-Plus等。
下面是一个基于Mybatis分页插件PageHelper进行分页查询的示例代码:
1. 首先需要在pom.xml文件中引入PageHelper依赖
<!-- PageHelper分页插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.3.0</version></dependency>
2. 在Mybatis-config.xml文件中添加分页插件配置
<plugins><!-- 分页插件 --><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="dialect" value="mysql"/></plugin></plugins>
3. 编写Controller层代码,进行分页查询
@RestController@RequestMapping("/user")public class UserController {@Autowiredprivate UserService userService;/*** 分页查询用户列表*/@GetMapping("/list")public PageInfo<User> list(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "10") Integer pageSize) {PageHelper.startPage(pageNum, pageSize);List<User> userList = userService.getUserList();return new PageInfo<>(userList);}}
在Controller层中,我们首先通过@Autowired注入了UserService实例。在进行分页查询时,需要调用PageHelper的startPage()方法,并传递当前页数pageNum和每页显示数量pageSize。然后执行UserService的getUserList()方法获取用户列表数据,最后将结果包装成PageInfo对象返回即可。
2、MyBatis-plus
目前很多企业都在使用更加强大、灵活、简单的MyBatis-plus。
MyBatis-Plus是一个基于MyBatis的增强工具,为开发者简化与数据库交互操作。MyBatis-Plus提供了很多实用的增删改查API,并对MyBatis的注解、XML配置和Mapper接口进行了增强,使得使用MyBatis更加方便快捷。
MyBatis-Plus基于Mybatis的分页原理是在底层查询语句中添加额外的Limit限制和Offset偏移量,通过这种方式获取指定区间的数据集合,从而实现分页展示。同时,MyBatis-plus还提供了方便易用的分页API,允许用户无需手写SQL语句,只需要配置好相关参数即可完成分页操作。
下面以一个SpringBoot项目为例,演示如何使用MyBatis-Plus进行分页操作。
1. 引入Mybatis-Plus依赖
在pom.xml文件中添加以下依赖:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency>
2. 配置Mybatis-Plus
在application.yml或application.properties中添加如下配置:
mybatis-plus:mapper-locations: classpath:mapper/*.xml # mapper映射文件存放的位置global-config:db-config:id-type: auto # 主键id自动配置,默认值0,表示使用全局的AUTO主键策略field-strategy: not_empty # 指定表字段填充策略insert-strategy: not_null # 字段填充,插入时自动填充update-strategy: not_null # 字段填充,更新时自动填充logic-delete-value: '1' # 逻辑删除 1、已删除 0、未删除logic-not-delete-value: '0'configuration:map-underscore-to-camel-case: true # 驼峰命名
这里我们进行了全局配置的设置,包括了主键策略、字段填充策略、逻辑删除标志位以及驼峰命名等。
3. 使用Mybatis-Plus的分页API
在Mapper接口中,引入Page类并实现多条件查询和统计总记录数功能,在查询方法上添加Page对象就可以进行分页操作。以下是示例代码:
public interface UserMapper extends BaseMapper<User> {/*** 根据条件分页查询用户列表** @param page 分页对象* @param queryWrapper 查询条件* @return 查询结果*/IPage<User> selectPageVo(Page<User> page, @Param(Constants.WRAPPER) QueryWrapper<User> queryWrapper);}
其中,BaseMapper为Mybatis-plus提供的通用Mapper,可直接继承使用,无需再写基本的CRUD代码,而IPage则表示分页信息。
在Controller层进行查询时,需要进行如下设置:
@RestController@RequestMapping("/user")public class UserController {@Autowiredprivate UserService userService;/*** 分页查询用户列表*/@GetMapping("/list")public IPage<User> list(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "10") Integer pageSize) {Page<User> page = new Page<>(pageNum, pageSize);QueryWrapper<User> queryWrapper = new QueryWrapper<>();// TODO: 添加查询条件return userService.selectPageVo(page, queryWrapper);}}
在这个例子中,我们将查询条件封装在queryWrapper对象中,并传递给selectPageVo方法中的参数。Page对象表示分页信息,包括当前页码和每页显示记录数等。
Mybatis-Plus提供了非常便利的查询API,支持使用Wrapper作为查询条件,在Wrapper中可以设置条件筛选、排序、分组、聚合等操作。
下面是一些常见的查询示例:
4. 查询全部数据
List<User> userList = userMapper.selectList(null);
这里传递的参数为 null 表示不加任何查询条件,查询所有数据。
5. 条件查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("name", "张三").eq("age", 20);List<User> userList = userMapper.selectList(queryWrapper);
在 QueryWrapper 对象中,使用 eq 方法表示等于某一字段的值。同时多个 eq 可以同时连写,表示多个查询条件间为与的关系,即 name 等于"张三"并且 age 等于"20"的数据。
6. 模糊查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("name", "张");List<User> userList = userMapper.selectList(queryWrapper);
在 QueryWrapper 对象中,使用 like 方法表达模糊查询,"%"符号表示通配符。
7. 排序与分页查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.orderByAsc("age").orderByDesc("create_time"); // 根据 age 升序, create_time 降序排列IPage<User> pageData = new Page<>(1, 10); // 第1页,每页显示10条记录IPage<User> result = userMapper.selectPage(pageData, queryWrapper);List<User> userList = result.getRecords(); // 分页查询结果long total = result.getTotal(); // 总记录数
在 QueryWrapper 对象中使用 orderByAsc 和 orderByDesc 方法表达排序操作。同时使用 Page 对象设置分页信息,调用 selectPage 方法实现分页查询。
3、总结
MyBatis原生支持分页查询,而使用分页插件可以更高效、方便地进行大数据量分页操作。分页插件的原理是通过AOP拦截并处理查询结果,以得到分页信息。
Mybatis-Plus提供的查询API简洁易用,且支持灵活的条件筛选、排序、分组和聚合等操作,使得开发者可以轻松实现各种数据查询需求。
最后感谢大家的关注!
-END-




