分页插件PageHelper的高效案例实现与优化策略

前言

基于SSM框架+PageHelper实现分页功能

案例实现

实现登陆功能,和分页查看操作。SSM框架的搭建是一切的前提,整合步骤比较多,这里不在赘述,如何整合SSM可以参考我以往的博客

PageHelper基础配置

1.添加依赖

pom.xml

 <!--分页插件-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>4.0.0</version>
    </dependency>

2.创建mybatis-config.xml配置文件

mybatis-config.xml

<?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>
    <plugins>
        <!-- com.github.pagehelper为PageHelper类所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!-- 4.0.0以后版本可以不设置该参数 -->
            <property name="dialect" value="mysql"/>
            <!-- 该参数默认为false -->
            <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
            <!-- 和startPage中的pageNum效果一样-->
            <property name="offsetAsPageNum" value="true"/>
            <!-- 该参数默认为false -->
            <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
            <property name="rowBoundsWithCount" value="true"/>
            <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
            <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
            <property name="pageSizeZero" value="true"/>
            <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
            <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
            <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
            <property name="reasonable" value="true"/>
            <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
            <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
            <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->
            <!-- 不理解该含义的前提下,不要随便复制该配置 -->
            <property name="params" value="pageNum=start;pageSize=limit;"/>
            <!-- 支持通过Mapper接口参数来传递分页参数 -->
            <property name="supportMethodsArguments" value="true"/>
            <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->
            <property name="returnPageInfo" value="check"/>
        </plugin>
    </plugins>
</configuration>

3.将Mybtais-config配置文件添加到spring-mybatis.xml配置中

    <!--扫描mapper-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

 案例分析

实现分页,要考虑这几个事情,一个是总记录数,即有多少数据,每页显示多少记录数,即每页展示多少数据,以及总页数。查询总记录数和查询总页数需要SQL支持和业务逻辑支持。

导入PageUtil工具类

public class PageUtil {

    //每页显示的条数
    public static final int PAGE_SIZE = 4;


    /**
     * 计算出总页数
     *
     * @param count
     * @param pageSize
     * @return
     */
    public static int getTotalPage(int count, int pageSize) {
        return count % pageSize == 0 ? count / pageSize : count / pageSize + 1;

    }
}

作用是获取总页数和,固定每页显示记录数(每页显示数据个数) 

书写Dao层

UserDao

public interface UserDao  {

    public List<User> selectAllUsers();

    public User selectUserByUserNameAndPassword(User user);

    //获取总条数
    int getTotal();
}

查询所有用户(分页支持),根据用户名和密码查询指定用户(登陆功能),查询总条数(总记录数)

UserDao.xml

<?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为映射的根节点,用来管理DAO接口 
    namespace指定DAO接口的完整类名,表示mapper配置文件管理哪个DAO接口(包.接口名)
    mybatis会依据这个接口动态创建一个实现类去实现这个接口,而这个实现类是一个Mapper对象
 -->
<mapper namespace="com.csx.dao.UserDao">
    <select id="selectAllUsers" parameterType="com.csx.entity.User" resultType="com.csx.entity.User">
        select * from t_user
    </select>
    <select id="selectUserByUserNameAndPassword" resultType="com.csx.entity.User">
        select * from t_user where user_name=#{user_name} and password=#{password}
    </select>
    <select id="getTotal" resultType="java.lang.Integer">
        select count(1) from t_user
    </select>
</mapper>

书写业务逻辑:

  •  getAllUsers():查询所有用户信息
  • login(User user):登陆功能
  • getTotal():获取总记录数
  • getPageUsers(int pageSize,int pageIndex):获取分页数据
    • pagSize:每页查询个数
    • pageIndex:起始查询页码(从1开始)

 书写Service层

UserService

public interface UserService {
    public List<User>  getAllUsers();

    public User login(User user);
    int getTotal();

    List<User> getPageUsers(int pageSize, int pageIndex);
}

UserServiceImpl

@Service("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;
    @Override
    public List<User> getAllUsers() {
        return userDao.selectAllUsers();
    }

    @Override
    public User login(User user) {
        return userDao.selectUserByUserNameAndPassword(user);
    }

    @Override
    public int getTotal() {
        return userDao.getTotal();
    }

    @Override
    public List<User> getPageUsers(int pageSize, int pageIndex) {
        PageHelper.startPage(pageIndex,pageSize);
        return userDao.selectAllUsers();
    }
}

书写Controller层

UserController

@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/userLogin")
    public ModelAndView userLogin(User user, HttpSession session) {
        ModelAndView mv = new ModelAndView();
        User u = userService.login(user);
        if (u != null) {
            //往seesion存值
            session.setAttribute("user",u);
            //转发请求
            mv.setViewName("forward:getUsers.do");
        } else {
            mv.setViewName("login");
        }
        return mv;
    }

    @RequestMapping("/getUsers")
    public ModelAndView getUsers(@RequestParam(defaultValue = "1",required = true)int pageIndex ){
        ModelAndView mv =new ModelAndView();
        List<User> list=userService.getPageUsers(PageUtil.PAGE_SIZE,pageIndex);
        int totalPage = PageUtil.getTotalPage(userService.getTotal(), PageUtil.PAGE_SIZE);
        mv.addObject("list",list);
        mv.addObject("pageIndex",pageIndex);
        mv.addObject("totalPage",totalPage);
        mv.setViewName("main");
        return mv;

    }
}
  • userLogin(User user,HttpSession session): 进行登陆判断
    • 如果登陆成功,将用户对象存入session中,并将请求转发到getUsers()方法
  • getUsers(@RequestParam(defaultValue = "1",required = true)int pageIndex )

    • 进行分页查询操作,接收前端传入的pageIndex参数,进行分页查询。

    • 将list(分页后用户列表),pageIndex(查询页码),totalPage(总页数)放入request域中,便于页面获取并判断

  • 方法返回值为ModelAndView,设置了视图名为main,由视图解析器,解析为main.jsp页面并跳转

登陆界面

login.jsp

<%--
  Created by IntelliJ IDEA.
  User: 21038
  Date: 2024/10/12
  Time: 17:39
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/user/userLogin.do" method="post">
    用户名: <input type="text" id="user_name" name="user_name"> <br/>
    密码: <input type="password" id="password" name="password"> <br/>
    <input type="submit" value="登录">
</form>
</body>
</html>

 分页展示

main.jsp

<%--
  Created by IntelliJ IDEA.
  User: 21038
  Date: 2024/10/14
  Time: 13:59
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${sessionScope.user.user_name},登录成功 <br>

<center>
    <table border="1px">
        <tr>
            <th>编号</th>
            <th>名字</th>
            <th>操作</th>
        </tr>

        <c:forEach items="${list}" var="u">
            <tr>
                <td>${u.user_id}</td>
                <td>${u.user_name}</td>
                <td>
                    <a href=" ">修改</a>
                    <a href="">删除</a>
                </td>
            </tr>
        </c:forEach>

        <tr>
            <td colspan="3">
                <a href="/user/getUsers.do">首页</a>
                <a href="/user/getUsers.do?pageIndex=${pageIndex-1}">上一页</a>
                <a href="/user/getUsers.do?pageIndex=${pageIndex+1}">下一页</a>
                <a href="/user/getUsers.do?pageIndex=${totalPage}">尾页</a>
            </td>
        </tr>

    </table>
</center>
</body>
</html>

结果展示

点击下方按钮首页-》尾页,发送请求,查询分页数据;修改和删除功能暂未实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值