MyBatis 中如何实现分页 ?

1. MyBatis 中如何实现分页 ?

MyBatis 中的分页有两种实现方式:物理分页 or 逻辑分页

【物理分页】

1.1 原生 SQL 物理分页

物理分页是通过 SQL 查询语句,LIMIT 语法进行分页的,它是在数据库引擎层面实现的。

<select id="getAll" resultType="UserInfo">
    select * from userinfo
    limit #{limit} offset #{offset}
</select>

1.2 PageHepler 插件实现分页

物理分页还可以使用 PageHepler 插件来实现。

代码示例:

  1. service、dao、xml 层查询整表数据 - getALl()
  2. service 接口,以及实现类新增分页方法 getAllByPage()
  3. controller 层调用分页方法即可。
@Resource
private UserMapper userMapper;

public List<UserInfo> getAll() {
    return userMapper.getAll();
}

public PageInfo<UserInfo> getAllByPage(Integer pIndex, Integer pSize) {
    PageHelper.startPage(pIndex, pSize); // 关键代码
    List<UserInfo> list = userMapper.getAll();
    PageInfo<UserInfo> pageInfo = new PageInfo<>(list); // 关键代码
    return pageInfo;
}

【逻辑分页】

        使用 MyBatis 自带的 RowBounds 进行分页就是逻辑分页,它是一次性将符合条件的所有数据查询出来放到内存中,然后在内存中进行分页的,而且内存中是没有索引的,所以数据量非常大的时候,不建议使用。

关键代码:

RowBounds rowBounds = new RowBounds(offset,limit);
List<UserInfo> results = sqlSession.selectList("getUserList",null,rowBounds);

面试官问:RowBounds 是一次性查询全部数据吗 ?

        答案是否。首先 MyBatis 是对 JDBC 的封装,而在 JDBC 驱动中有一个 Fetch Size 的配置,它规定了每次最多从数据库中查询出多少条数据。这个 Fetch Size 的默认值是 1000.

于是我们可以在 xml 的 <select> 标签中添加 fetchSize 属性来指定 Fetch Size 的值:

<select id="getAll" resultType="UserInfo" fetchSize="100">
    select * from userinfo;
</select>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_hl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值