MyBatis分页功能
MyBatis 的分页功能是基于内存的分页,即先查询出所有记录,再按起始位置和页面容量取出结果。
本节我们为查询网站记录增加分页功能,要求结果列表按照 id 升序排列(本节示例基于《第一个MyBatis程序》一节的代码实现)。
WebsiteMapper 中方法如下。
相比原来的 selectWebsite 方法,增加了两个参数,起始位置(from)和页面容量(pageSize),用于实现分页查询。
修改 WebsiteMapper.xml 的查询语句,增加 limit 关键字,SQL 映射代码如下。
测试类代码如下。
运行结果如下。
注意:MyBatis 实现分页查询属于 DAO 层操作,由于 DAO 层不牵涉任何业务实现,所以实现分页的方法中第一个参数为 limit 的起始位置(下标从 0 开始),而不是用户输入的真正页码(页码从1开始)。在 JSP 教程的《JSP分页》一节已经学习过页码如何转换为 limit 的起始位置下标,即:起始位置下标=(页码-1)*页面容量,那么这个转换操作必然不能在 DAO 层实现,需要在业务层实现。所以我们在测试类中传入的参数为下标,而不是页码。
本节我们为查询网站记录增加分页功能,要求结果列表按照 id 升序排列(本节示例基于《第一个MyBatis程序》一节的代码实现)。
WebsiteMapper 中方法如下。
- /**
- *
- * @param site
- * @param currentPageNo 起始位置
- * @param pageSize 页面容量
- * @return
- */
- public List<Website> selectWebsite(@Param("site") Website site, @Param("from") Integer currentPageNo,
- @Param("pageSize") Integer pageSize);
修改 WebsiteMapper.xml 的查询语句,增加 limit 关键字,SQL 映射代码如下。
- <select id="selectWebsite" resultType="net.biancheng.po.Website">
- SELECT id,name,url,age,country
- FROM website
- <trim prefix="where" prefixOverrides="and">
- <if test="site.name != null and site.name !=''">
- AND name LIKE CONCAT ('%',#{site.name},'%')
- </if>
- <if test="site.url!= null and site.url !=''">
- AND url LIKE CONCAT ('%',#{site.url},'%')
- </if>
- ORDER BY id limit #{from},#{pageSize}
- </trim>
- </select>
- public static void main(String[] args) throws IOException {
- // 读取配置文件mybatis-config.xml
- InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
- // 根据配置文件构建
- SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
- // 通过SqlSessionFactory创建SqlSession
- SqlSession ss = ssf.openSession();
- Website site = new Website();
- // site.setname("编程");
- site.setUrl("http");
- Integer pageSize = 3;
- Integer currentPageNo = 0;
- List<Website> siteList = new ArrayList<Website>();
- siteList = ss.getMapper(WebsiteMapper.class).selectWebsite(site, currentPageNo, pageSize);
- for (Website ws : siteList) {
- System.out.println(ws);
- }
- }
DEBUG [main] - ==> Preparing: SELECT id,name,url,age,country FROM website where url like concat ('%',?,'%') ORDER BY id limit ?,?
DEBUG [main] - ==> Parameters: http(String), 0(Integer), 3(Integer)
DEBUG [main] - <== Total: 3
Website[id=1,name=编程帮,url=https://www.biancheng.net/,age=10,country=CN]
Website[id=2,name=C语言中文网,url=http://c.biancheng.net/,age=12,country=CN]
Website[id=3,name=百度,url=https://www.baidu.com/,age=18,country=CN]
注意:MyBatis 实现分页查询属于 DAO 层操作,由于 DAO 层不牵涉任何业务实现,所以实现分页的方法中第一个参数为 limit 的起始位置(下标从 0 开始),而不是用户输入的真正页码(页码从1开始)。在 JSP 教程的《JSP分页》一节已经学习过页码如何转换为 limit 的起始位置下标,即:起始位置下标=(页码-1)*页面容量,那么这个转换操作必然不能在 DAO 层实现,需要在业务层实现。所以我们在测试类中传入的参数为下标,而不是页码。