MyBatis-Plus
中最常用的分页查询的方法是结合 IPage
接口和 Page
类来实现,也是 MyBatis-Plus
官方推荐的方式。PageHelper
插件进行分页查询,但这通常用于 MyBatis
原生集成,而不是 MyBatis-Plus
。MyBatis-Plus的 IPage 分页插件主要是通过AOP(面向切面编程)技术来实现的,它可以在运行时动态地拦截方法调用,并在方法执行前后添加额外的行为。这种方式使得分页功能可以很容易地集成到现有的代码中,而不需要对现有查询逻辑做出大的改动。其工作原理如下:
在Spring Boot项目中使用MyBatis-plus进行分页查询通常遵循以下步骤:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>版本号</version>
</dependency>
## mysql数据库
spring:
datasource:
dynamic:
datasource:
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true
username: root
password: root
## mybatis-plus配置信息
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
banner: false
enable-sql-runner: true
db-config:
id-type: ASSIGN_ID
logic-delete-field: DELETE_FLAG
logic-delete-value: DELETED
logic-not-delete-value: NOT_DELETE
mapper-locations: classpath*:com/test/**/mapping/*.xml,com/bstek/**/mapping/*.xml
type-handlers-package: com.test.common.handler
pagination:
type: OFFSET
records
任然会是全部的数据。@Configuration
public class MybatisPlusConfig {
/**
* IPage的分页使用的是拦截器,属于物理分页,好处就是处理大量数据时,查询速度快。
*
* @return MybatisPlus拦截器
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 向MybatisPlus拦截器链中添加分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
@GetMapping("/sys/page")
public IPage<SysDTO> page(SysPageParam sysPageParam) {
return sysService.page(sysPageParam);
}
public interface SysService extends IService<SysEntity> {
/**
* 获取最近使用分页
*/
IPage<SysRecentlyUsedDTO> page(SysRecentlyUsedPageParam sysRecentlyUsedPageParam);
}
/**
* 如果是单表操作,直接通过IService接口中提供的page方法进行分页查询
* 就不需要编写Mapper.xml
**/
@Service
public class SysServiceImpl extends ServiceImpl<SysMapper, SysEntity> implements SysService {
@Override
public IPage<SysDTO> page(SysPageParam sysPageParam) {
Page<SysDTO> page = new Page<>(sysPageParam.getCurrent(), sysPageParam.getSize());
QueryWrapper<SysOrg> queryWrapper = new QueryWrapper<>();
return this.page(page, queryWrapper);
}
}
/**
* 如果是复杂的查询,就需要通过xml中的自定义sql查询分页
*
**/
@Service
public class SysServiceImpl extends ServiceImpl<SysMapper, SysEntity> implements SysService {
@Resource
private SysMapper sysMapper;
@Override
public IPage<SysDTO> page(SysPageParam sysPageParam) {
Page<SysDTO> page = new Page<>(sysPageParam.getCurrent(), sysPageParam.getSize());
QueryWrapper<SysDTO> queryWrapper = new QueryWrapper<>();
return sysMapper.selectSysDto(page, queryWrapper);
}
}
public interface SysMapper extends BaseMapper<SysEntity> {
IPage<SysDTO> selectSysDto(Page<SysDTO> page, @Param("queryParam") QueryWrapper<SysDTO> queryWrapper);
}
<?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.test.web.sys.org.mapper.SysMapper">
<select id="selectSysDto" resultType="com.test.web.sys.org.dto.SysDTO">
SELECT
si.ORG_ID,
si.USER_ID,
o.NAME AS orgName,
u.NAME AS userName
FROM
SYS_INFO si
LEFT JOIN SYS_ORG o ON si.ORG_ID = o.ID
LEFT JOIN SYS_USER u ON si.USER_ID = u.ID
WHERE si.DELETE_FLAG = 'NOT_DELETE'
ORDER BY si.USED_TIME DESC
</select>
</mapper>
PageHelper分页插件的工作原理基于MyBatis的拦截器模式,通过拦截MyBatis的执行过程,动态地在查询语句前添加分页逻辑。具体步骤如下:
在Spring Boot项目中集成并使用PageHelper分页插件进行查询,通常需要以下步骤:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>版本号</version>
</dependency>
pagehelper:
reasonable: true # 是否进行分页合理化
supportMethodsArguments: true # 是否支持通过Mapper接口参数来传递分页参数
public interface UserMapper {
List<User> selectUsers();
}
startPage
来启用分页功能,然后执行查询操作。@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/users")
public PageInfo<User> listUsers(@RequestParam(defaultValue = "1") int pageNum,
@RequestParam(defaultValue = "10") int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectUsers();
return new PageInfo<>(users);
}
}
在上面的代码中,listUsers方法通过调用PageHelper.startPage方法来开启分页,并传入当前页码pageNum和每页大小pageSize。
随后执行userMapper.selectUsers()方法来查询数据。查询结果会自动包含分页信息。