Mybatis分页助手_pageHelper

本文介绍了PageHelper作为Mybatis的优秀分页插件,支持多种数据库,包括添加坐标、配置插件的两种方式,以及控制层、业务层和持久层的集成步骤。同时推荐了了解手动分页的实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pageHelper是国内非常优秀的一款开源的mybatis分页插件,他支持常用的数据库,例如MySQL、Oracle、SQLite等
1.添加pageHelper坐标:

<!-- mybatis提供的分页助手 -->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.1.2</version>
    </dependency>

2.配置mybatis的插件:
方式一,在applicationContext.xml里配置mybatis的pageHelper插件:

<!-- 配置SqlSessionFactory -->  
      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      	<property name="dataSource" ref="dataSource"></property>
          <!--配置分页助手-->
          <property name="plugins">
              <array>
                  <!-- 引入插件类型 -->
                  <bean class="com.github.pagehelper.PageInterceptor">
                      <!-- 指定使用的数据库-->
                      <property name="properties">
                          <!--因为分页插件支持多种数据库,需指明当前所用数据库 ,helperDialect  mysql数据库(方言)-->
                          <props>
                              <prop key="helperDialect">mysql</prop>
                          </props>
                      </property>
                  </bean>
              </array>
          </property>
      	<!-- 引入sqlMapConfig.xml文件 -->
        <property name="configLocation" value="classpath:sqlMapConfig.xml"></property>
      	<!-- 配置别名 -->
      	<property name="typeAliasesPackage" value="com.ld.domain"></property>
      </bean>

方式二,在sqlMapConfig.xml里配置mybatis的pageHelper插件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!--引入分页插件,不用指定数据库方言,mybatis自动选择-->
	<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
	</plugins>
</configuration>

3.项目集成pageHelper:
控制层:

@Controller
@RequestMapping("/order")
public class OrderController {
    @Autowired
    OrderService orderService;
    /**
     * 分页助手--查询所有订单信息
     * @param model
     * @param currPage
     * @param pageSize
     * @return
     */
    @RequestMapping("/findAll")
    public ModelAndView findAll(ModelAndView model, @RequestParam(name = "currPage",defaultValue="1") Integer currPage,@RequestParam(name = "pageSize",defaultValue = "5") Integer pageSize){
        PageInfo<Order> pageInfo = orderService.findByPageHelper(currPage, pageSize);
        //将数据库查询结果封装到model
        model.addObject("pageInfo",pageInfo);
        //设置视图页面
        model.setViewName("order-list");
        return model;
    }
    }

业务层:

public interface OrderService {
    /**
     * 分页助手的查询方法
     * @param currPage 当前页
     * @param pageSize 每页显示的数据量
     * @return
     */
    PageInfo<Order> findByPageHelper(Integer currPage,Integer pageSize);
    }
@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    OrderDao orderDao;
    @Override
    public PageInfo<Order> findByPageHelper(Integer currPage, Integer pageSize) {
        PageHelper.startPage(currPage,pageSize);//设置开始页
        List<Order> list = orderDao.findAll();//获取所有订单信息
        //创建PageInfo对象(参数1-list:所有订单信息集合,参数2-navigatePages:页面显示页码的数量)
        PageInfo<Order> pageInfo = new PageInfo<>(list,3);
        //打印观察pageHelper常用的API
        System.out.println("当前页:"+pageInfo.getPageNum());
        System.out.println("每页查多少:"+pageInfo.getPageSize());
        System.out.println("总条数:"+pageInfo.getTotal());
        System.out.println("总页数:"+pageInfo.getPages());
        System.out.println("每页显示的数据:"+pageInfo.getList().size());
        System.out.println("上一页页码:"+pageInfo.getPrePage());
        System.out.println("下一页页码:"+pageInfo.getNextPage());
        System.out.println("页面显示的第一个页码:"+pageInfo.getNavigateFirstPage());
        System.out.println("页面显示的最后一个页码:"+pageInfo.getNavigateLastPage());
        return pageInfo;
    }
    }

持久层:

public interface OrderDao {
    //查询所有订单信息
    List<Order> findAll();
    }
<?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.ld.dao.OrderDao">
    <resultMap id="base_map" type="order">
        <id property="id" column="id"></id>
        <result property="orderNum" column="orderNum"></result>
        <result property="orderTime" column="orderTime"></result>
        <result property="peopleCount" column="peopleCount"></result>
        <result property="orderDesc" column="orderDesc"></result>
        <result property="payType" column="payType"></result>
        <result property="orderStatus" column="orderStatus"></result>
        <!--关联属性-->
        <association property="product" javaType="product">
            <result property="productName" column="productName"></result>
        </association>
    </resultMap>
    <select id="findAll" resultMap="base_map">
        select o.*,p.productName from orders o left join product p on o.productid=p.id
    </select>

</mapper>

PageInfo是一个分页工具类,里面的参数详细介绍,请参考:

https://blog.youkuaiyun.com/IT_LD/article/details/107924553

order-list.jsp:

<!--数据列表-->
						<table id="dataList"
							class="table table-bordered table-striped table-hover dataTable">
							<thead>
								<tr>
									<th class="" style="padding-right: 0px;"><input
										id="selall" type="checkbox" class="icheckbox_square-blue">
									</th>
									<th class="sorting_asc">ID</th>

									<th class="sorting">订单编号</th>
									<th class="sorting">下单时间</th>
									<th class="sorting">出行人数</th>
									<th class="sorting">支付方式</th>
									<th class="sorting">订单状态</th>
									<th class="sorting">产品名称</th>
								
									<th class="text-center">操作</th>
								</tr>
							</thead>
							<tbody>
								
								<c:forEach items="${pageInfo.list}" var="order">
								<tr>
									<td><input name="ids" type="checkbox"></td>
									<td>${order.id}</td>

									<td>${order.orderNum}</td>
									<td>
										<fmt:formatDate value="${order.orderTime}" pattern="yyyy-MM-dd HH:mm"/>
									</td>
									<td>${order.peopleCount}</td>
									<td>
										${order.payType=="0"?"支付宝":order.payType=="1"?"微信":"其他"}
										<!-- 
										<c:if test='${order.payType=="0"}'>支付宝</c:if>
										<c:if test='${order.payType=="1"}'>微信</c:if>
										<c:if test='${order.payType=="2"}'>其他</c:if>
										 -->
									</td>
									<td>${order.orderStatus=="0"?"未支付":"已支付"}</td>
									<td>${order.product.productName}</td>
									
									<td class="text-center">
										<button type="button" class="btn bg-olive btn-xs"
											onclick='location.href="${pageContext.request.contextPath}/pages/order-show.jsp"'>订单</button>
										<button type="button" class="btn bg-olive btn-xs"
											onclick='location.href="${pageContext.request.contextPath}/pages/order-show.jsp"'>查看</button>
									</td>
								</tr>

								</c:forEach>
							

							</tbody>

						</table>

<div class="box-footer">
					<div class="pull-left">
						<div class="form-group form-inline">
							总共${pageInfo.pages} 页,共${pageInfo.total} 条数据。 每页
							<%--如果切换下拉数字,默认从第1页开始显示--%>
							<select class="form-control" id="pageSize" onclick="gotoPage(1)">
								<%--value的值就是页面pageSize的值--%>
								<option value="3">3</option>
								<option value="5" selected="selected">5</option>
								<option value="10">10</option>
								<option value="15">15</option>
							</select></div>
					</div>

					<div class="box-tools pull-right">
						<ul class="pagination">
							<li><a href="javascript:gotoPage(1)" aria-label="Previous">首页</a></li>
							<li><a href="javascript:gotoPage(${pageInfo.prePage})">上一页</a></li>
							<c:forEach begin="${pageInfo.navigateFirstPage}" end="${pageInfo.navigateLastPage}" var="i">
								<li><a href="javascript:gotoPage(${i})">${i}</a></li>
							</c:forEach>
							<li><a href="javascript:gotoPage(${pageInfo.nextPage})">下一页</a></li>
							<li><a href="javascript:gotoPage(${pageInfo.pages})" aria-label="Next">尾页</a></li>
						</ul>
					</div>

				</div>

<script
		src="${pageContext.request.contextPath}/plugins/jQuery/jquery-2.2.3.min.js"></script>
	<script type="text/javascript">
		//当选中下拉列表中的pageSize时,给当前<option>加上属性selected=selected
		//组合选择器 id+元素+属性
		$("#pageSize option[value=${pageInfo.pageSize}]").prop("selected","selected");
		//分页相关内容
		function gotoPage(currPage) {
		 //获取下拉列表中pageSize的值
			var pageSize=$("#pageSize").val();
			//判断控制页码范围
			if (currPage<1){
				return;//终止代码执行
			}
			if (currPage>${pageInfo.total}){
				return;//终止代码执行
			}
			location.href="${pageContext.request.contextPath}/order/findAll?currPage="+currPage+"&pageSize="+pageSize;
		}
	</script>

效果:
在这里插入图片描述
在这里插入图片描述
这个分页助手虽然很nice,但是手动分页也需要掌握,熟悉实现原理
请参考:

https://blog.youkuaiyun.com/IT_LD/article/details/107945783

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值