PageHelper

MyBatis 使用第三方插件对功能进行扩展,分页助手 PageHelper 是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据。PageHelper 是一个用于 MyBatis 或 MyBatis-Plus 的分页插件,它提供了简单易用的分页功能。它通过拦截 SQL 查询,在查询时自动添加分页条件,从而实现数据的分页查询。

基本功能

PageHelper 可以帮助我们在使用 MyBatis 时自动进行分页查询,避免手动编写复杂的分页逻辑。它通过拦截器的方式,在执行查询时动态地将分页参数传入 SQL 语句,并通过设置分页对象来获取分页结果。

工作原理

PageHelper 的核心功能是通过拦截器修改 SQL,添加分页的参数。它在查询执行前,会根据提供的分页参数修改原始的 SQL 查询,添加 LIMIT、OFFSET 等分页条件,然后返回分页结果。分页信息通过 Page 类提供,分页对象封装了总记录数、总页数等信息。

开发步骤

  • 导入通用 PageHelper 的坐标
  • 在 MyBatis 核心配置文件中配置 PageHelper 插件
  • 测试分页数据获取

导入pom

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>3.5.1</version>
</dependency>

插件配置

<plugin interceptor="com.github.pagehelper.PageHelper">
  <property name="dialect" value="mysql"/>
</plugin>

代码实现

public class WzkicuPage01 {

    public static void main(String[] args) throws Exception {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        PageHelper.startPage(2, 1);
        List<WzkUser> dataList = userMapper.findAll();
        for (WzkUser wzk : dataList) {
            System.out.println(wzk);
        }
    }
}

执行结果

WzkUser(id=2, username=wzk2, password=icu2, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=null)

配置 PageHelper

在 Spring 配置文件中配置 PageHelper 插件,通常是在 application.properties 或 application.yml 文件中:

pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true

PageInfo类

PageInfo 是 PageHelper 用于封装分页查询结果的一个重要类。它包含了分页相关的信息:

  • getTotal():总记录数
  • getPages():总页数
  • getPageNum():当前页码
  • getPageSize():每页大小
  • getList():当前页的数据

注意事项

  • 在使用 PageHelper 时,分页查询必须放在调用 PageHelper.startPage() 之后,执行查询之前
  • 如果使用了 @Mapper 注解的 Mapper 接口,PageHelper 可以自动与 MyBatis 配合工作
  • 对于需要分页的查询,返回的结果必须是一个 List 类型

通用 mapper

简单介绍

通用 mapper 就是为了解决单表的增删改查,基于 MyBatis 的插件机制,开发人员不需要编写 SQL,不需要在 DAO 中增加方法,只要写好实体类,就可以有增删改查方法。

引入依赖

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper</artifactId>
    <version>3.5.1</version>
</dependency>

设置主键

@Table(name = "wzk_user")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class WzkUser implements Serializable {
    private int id;
    private String username;
    private String password;
    private Date birthday;
    private List<WzkOrder> orderList;
    private List<WzkRole> roleList;
}

修改DAO

public interface UserMapper extends Mapper<WzkUser> {
    // 省略之前的内容
}

编写代码

public class WzkMapper01 {

    public static void main(String[] args) throws Exception {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        MapperHelper mapperHelper = new MapperHelper();
        mapperHelper.registerMapper(UserMapper.class);
        mapperHelper.processConfiguration(sqlSession.getConfiguration());
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<WzkUser> dataList = userMapper.selectAll();
        for (WzkUser each : dataList) {
            System.out.println(each);
        }
        sqlSession.close();
    }
}

执行结果

WzkUser(id=0, username=wzk2, password=icu2, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=null)

Example 用法

public class WzkMapper02 {

    public static void main(String[] args) throws Exception {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        MapperHelper mapperHelper = new MapperHelper();
        mapperHelper.registerMapper(UserMapper.class);
        mapperHelper.processConfiguration(sqlSession.getConfiguration());
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        Example example = new Example(WzkUser.class);
        example.createCriteria().andEqualTo("username", "wzk2");
        List<WzkUser> dataList = userMapper.selectByExample(example);
        for (WzkUser each : dataList) {
            System.out.println(each);
        }
        sqlSession.close();
    }
}

执行结果

WzkUser(id=0, username=wzk2, password=icu2, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=null)