基于SSM框架的简单分页功能实现
简要说明项目结构分页原理实现代码(带详细注释)数据表(直接贴上表的字段 请自己手动建表 插数据)1.Page工具类 (比较重要的类,用来实现分页)2.UserDao.xml mybatis映射文件3.UserDao.java4.UserService.java5.UserServiceImpl.java6.DemoController.java (比较重要的类,会实现一些逻辑处理)7.User.java (差点漏了这个实体类)8.pagetext.jsp (重要的测试分页效果的页面)
关于jsp页面的部分代码解析效果github地址感谢
简要说明
环境是ssm框架,实现简单的物理分页,代码有详细注释,适合同我一样的菜鸟或者刚接触ssm的小白。有不对的地方请评论区留言指正,我会修正的。
项目结构
以上是大概的项目结构,后面整理好后我会传到github上。
分页原理
物理分页
实现原理: SELECT * FROM xxx [WHERE…] LIMIT #{param1}, #{param2} 第一个参数是开始数据的索引位置 第二个参数是要查询多少条数据优点: 不会造成内存溢出 缺点: 翻页的速度比较慢 逻辑分页
实现原理: 一次性将所有的数据查询出来放在内存之中,每次需要查询的时候就直接从内存之中去取出相应索引区间的数据优点: 分页的速度比较快 缺点: 可能造成内存溢出
实现代码(带详细注释)
数据表(直接贴上表的字段 请自己手动建表 插数据)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200109161316530.png)
1.Page工具类 (比较重要的类,用来实现分页)
package example.until;
public class Page {
int start; //开始数据的索引
int count; //每页数量
int total; //总数据量
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
/**
* 提供一个构造方法
*/
public Page(int start,int count){
super();
this.start = start;
this.count = count;
}
/**
* 判断是否有上一页
*/
public boolean isHasPreviouse(){
if(start == 0)
return false;
return true;
}
/**
* 判断是否有下一页
*/
public boolean isHasNext(){
if (start == getLast())
return false;
return true;
}
/**
* 计算得到的总页数
*/
public int getTotalPage(){
int totalPages;
if( 0 == total % count ){ //举个栗子 total = 20 count =10 total % count = 0 正好除尽 无余数 进入if
totalPages = total / count; // totalPages = 20/10 =2 一共就是两页啦
}else{//再举个栗子 total = 21 count =10 total % count = 1 没除尽 余数为1 进入else
totalPages = total / count +1; // totalPages = (21/10) +1 = 2 + 1 =3 一共就是3页 前两页每页10条数据 最后一页一条数据
}
//这种是特殊情况 total = 0 count =10 total % count = 0
//totalPages = 0/10 = 0 但是第一页不能为 0 呀 那就设值为 1 啦
if ( 0 == totalPages){
totalPages = 1; //设值为 1
}
return totalPages; //返回总页数
}
/**
* 计算尾页的第一条数据索引
*/
public int getLast(){
//这里指尾页的第一条数据索引,非页数 比如有36条数据 一共4页 最后一页的第一条数据索引就是 30
// (注意 :这里是按第一页第一条从0开始计算)
int last;
if( 0 == total % count ){ //举个栗子 total = 30 count =10 total % count = 0 正好除尽 无余数 进入if
last = total - count; // last = 30 - 10 最后一页第一条索引为 20
}else{ //再举个栗子 total = 36 count =10 total % count = 6 没除尽 余数为6 进入else
last = total - total % count ; // last = 36 - (36%10)=36-6 = 30 最后一页第一条索引为 30
}
//这种是特殊情况 total = 0 count =10 total % count = 0
//last = total - count =0 -10 = -10
// last
SELECT * FROM user
select * from user order by id asc limit #{start},#{count}
SELECT count(*) FROM user
3.UserDao.java
package example.dao;
import example.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserDao {
List findUser();
//获取用户list 用@Param 对mapper文件 进行多个参数的传递
List getlist(@Param("start") int start, @Param("count") int count);
Integer getTotal(); //获取用户总数
}
4.UserService.java
package example.service;
import example.pojo.User;
import java.util.List;
public interface UserService {
List findUser();
List getlist(int start,int count); //获取用户list
Integer getTotal(); //获取用户总数
}
5.UserServiceImpl.java
package example.service.impl;
import example.dao.UserDao;
import example.pojo.User;
import example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
@Service("userService")
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List findUser() {
return userDao.findUser();
}
@Override
public List getlist(int start,int count){ //获取用户list
List users = new ArrayList();
users = userDao.getlist(start,count);
return users;
}
@Override
public Integer getTotal() {
return userDao.getTotal();
} //获取用户总数
}
6.DemoController.java (比较重要的类,会实现一些逻辑处理)
package example.controller;
import example.pojo.User;
import example.service.UserService;
import example.until.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
//@RequestMapping("/home")
public class DemoController {
@Autowired
private UserService userService;
//获取用户list
@RequestMapping("/getlist")
public ModelAndView getList(HttpServletRequest request, HttpServletResponse response){
//new一个ModelAndView对象,通过addObject存储page和用户list 并利用setViewName设定跳转页面
ModelAndView modelView = new ModelAndView();
int start = 0; //初始化开始数据的索引 也就是所在页面的第一行 如第一页第一行是第0条,第二页第一行是第10条 以此类推
int count = 10; //每页显示的条目数
try{
start = Integer.parseInt(request.getParameter("page.start")); //从前台获取 开始数据的索引
count = Integer.parseInt(request.getParameter("page.count")); //从前台获取 每页显示的条目数
}catch (Exception e){
}
Page page = new Page(start,count); //将得到的值存入page对象中
//从数据库中取值 将 start 和count 传入
// 后台sql语句如下:
// SELECT * FROM user LIMIT #{start}, #{和count}
//第一个参数是开始数据的索引位置
//第二个参数是要查询多少条数据
//这里解释一下原理,每次从数据库中取出部分数据,可防止内存溢出
List userList = userService.getlist(page.getStart(),page.getCount()); //获取用户list
// 后台sql语句如下
// SELECT COUNT(*) FROM user
//获取user表中用户总个数
int total = userService.getTotal();
page.setTotal(total);//设置page对象的总数据量
//通过addObject存储page和用户list
modelView.addObject("page", page);
modelView.addObject("userList", userList);
//利用setViewName设定跳转页面
modelView.setViewName("pagetext");
//返回ModelAndView对象 跳转
return modelView;
}
}
7.User.java (差点漏了这个实体类)
package example.pojo;
import java.io.Serializable;
//这里我开了mybatis二级缓存 所以要实现序列化接口 Serializable
public class User implements Serializable {
private static final long serialVersionUID = -5809782578272943999L;
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
8.pagetext.jsp (重要的测试分页效果的页面)
Bootstrap 实例 - 默认的分页
//禁用功能
$(function () {
$("ul.pagination li.disabled a").click(function () {
return false;
})
});
用户列表 - 共${page.total}人
id
username
password
${s.id}
${s.username}
${s.password}
--%>
class="disabled" >
class="disabled" >
<
class="disabled">
class="current"
>${status.count}
class="disabled">
>
class="disabled">
>>
关于jsp页面的部分代码解析
class="disabled">
class="current"
>${status.count}
理解测试条件: -10 |