Mybaits 分页【mybaits】

本文详细介绍MyBatis中三种分页方式:Limit分页、RowBounds分页及PageHelper插件分页,涵盖具体实现步骤与代码示例,帮助开发者有效管理大量数据。

分页

为什么要分页?

  • 减少数据的处理量

1、使用Limit分页

语法:SELECT * from user limit startIndex,pageSize;
      SELECT * from user limit 3; #[0,n]

使用Mybaits实现分页,核心SQL:

1.接口

    /**
     * 分页查询
     */
    public List<User> findByLimit(Map<String,Integer> map);

2.Mapper.xml

  <!--分页查询-->
    <select id="findByLimit" resultType="user" parameterType="map">
        select * from user limit #{startIndex},#{pageSize}
    </select>

3.测试

/**
 * 分页查询
 */
@Test
public  void testLimit(){
    SqlSession sqlSession = MybaitsUtils.getSqlSession();
    UserDao mapper = sqlSession.getMapper(UserDao.class);

    HashMap<String, Integer> map = new HashMap<String, Integer>();
    map.put("startIndex",1);
    map.put("pageSize",3);

    List<User> users = mapper.findByLimit(map);
    for (User user : users) {
        System.out.println(user);
    }

    sqlSession.close();
}

2、RowBounds分页

不使用SQL实现分页:

1.接口

	/**
     * 分页查询2
     */
    public List<User> findByRowBounds();

2.mapper.xml

	<!--分页查询2-->
    <select id="findByRowBounds" resultType="user">
        select * from user
    </select>

3.测试

    /**
     * 分页查询2
     */
    @Test
    public  void findByRowBounds(){
        SqlSession sqlSession = MybaitsUtils.getSqlSession();

        RowBounds rowBounds = new RowBounds(1, 2);

        List<User> users = sqlSession.selectList("com.chif.dao.UserDao.findByRowBounds",null,rowBounds);

        for (User user : users) {
            System.out.println(user);
        }


        sqlSession.close();
    }

3、分页插件

在这里插入图片描述
第一步、引入分页插件-导入依赖

 <!--PageHelper-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.1.2</version>
    </dependency>

第二步、配置到spring 和mybait 整合的配置文件中
特别注意,新版拦截器是 com.github.pagehelper.PageInterceptorcom.github.pagehelper.PageHelper 现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。

<!--3.创建sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!--配置mybatis 插件-->
<property name="plugins">
    <set>
        <!--配置pageHelper 分页插件-->
        <bean class="com.github.pagehelper.PageInterceptor">
            <property name="properties">
                <props>
                    <!--方言:-->
                    <prop key="helperDialect">mysql</prop>
                </props>
            </property>
        </bean>
    </set>
</property>
</bean>

第三步、方法调用
使用PageHelper.startPage 静态方法调用startPage :
特点:

  1. 静态方法,传递两个参数(当前页码,每页查询条数)
  2. 使用pageHelper 分页的时候,不再关注分页语句,查询全部的语句
  3. 自动的对PageHelper.startPage 方法下的第一个sql 查询进行分页
    PageHelper.startPage(1,5);
    //紧跟着的第一个select 方法会被分页
    List list = countryMapper.findAll();

也就是说再Service层PageHelper.startPage(1,5);语句后一定是紧跟查询语句。

Service层示例代码

 @Override
    public PageInfo<Order> pageHelperTest(int currentPage,int pageSize) {
        // 分页查询(紧跟在其后的第一条查询sql将会被分页)
        PageHelper.startPage(currentPage,pageSize);
        List<Order> orders = orderMapper.queryAllOrderDESC();
        PageInfo<Order> pageInfo = new PageInfo<Order>(orders);
        return pageInfo;
    }

返回的信息就是pageInfo对象,该类是插件里的类,这个类里面的属性还是值得看一看

public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow 和endRow 不常用,这里说个具体的用法
//可以在页面中"显示startRow 到endRow 共size 条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//前一页
private int prePage;
//下一页
private int nextPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
传智播客——专注于Java、.Net 和Php、网页平面设计工程师的培训
北京市昌平区建材城西路金燕龙办公楼一层电话:400-618-9090
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;
}

第四步、前端页面获取Controller层返回的pageInfo数据,使用其属性进行页面展示

vue页面axios方法案例

  //分页
            page(currentPage){
                let _this=this;
                _this.loading=true;
                _this.axios.get("/order/queryAllByPageHelper?pageSize=11&currentPage="+currentPage).then(res=>{
                    _this.currentPage=res.data.pageNum;
                    _this.pageTotal=res.data.pages;
                    _this.total=res.data.total;
                    _this.pageSize=res.data.pageSize;
                    let orders=[];
                    for (let i = 0; i < res.data.list.length; i++) {
                        let list=res.data.list[i];
                        orders[i]={
                            orid: list.orid,
                            bus:list.bus,
                            origin: list.origin,
                            destination: list.destination,
                            beginTime: list.beginTime,
                            endTime: list.endTime,
                            expectTime: Math.ceil((new Date(list.endTime)-new Date(list.beginTime))/3600000),
                            client: list.client,
                            seller: list.seller,
                            createTime: list.createTime,
                            cost: list.cost,
                            costStatus: list.costStatus
                        };
                    }
                    this.Orders=orders;
                    _this.loading=false;
                });
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值