前言
基于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>
结果展示
点击下方按钮首页-》尾页,发送请求,查询分页数据;修改和删除功能暂未实现。