Spring boot Mybatis Thymeleaf Spring MVC(2)实现分页查询

本项目在之前项目(Spring boot Mybatis Thymeleaf Spring MVC(1))上增加而来

相关链接:https://blog.csdn.net/qq_40938444/article/details/102720808

本次新加功能实现分页查询,项目要求是有按钮实现我们数据库分页查询,如图:

我们可以根据导航栏调转到相对应的页面,查询对应页面数据库中的值的访问。

我们当前项目的结构如图(圈起来的是新建的文件):


  • 增加Page类,保存相关页数信息

Page类放在entity包下,Page中有一下属性:

  • public int pageNum: 当前页,如上图的:1
  • public int start:当前导航栏开始访问页数,如上图的:1
  • public int end:当前导航栏结束访问页数,如上图的:5
  • public int[] pageNumArr:当前导航栏上可以访问到的页数,如上图的:1,2,3,4,5
  • public int pageSize:每页显示的数据条数,如上图的:5
  • public int totalRecord: 总的记录条数
  • public int totalPage:总页数 totalRecord/pageSize
  • public int startIndex: 當前開始索引位置 pageNum*pageSize
  • public List<T> list: 存儲當前檢索的數據
package com.example.MavenDome_6.entity;

import java.util.List;

/**
 * 
 * 
 * <p>
 * Title: Page
 * </p>
 * 
 * @author Qiuran
 * 
 * @date 2019年10月26日
 */
public class Page<T> {
	// 已知数据
	private int pageNum; // 当前页。
	public int[] pageNumArr;
	private int pageSize; // 每页显示的数据条数。
	private int totalRecord; // 总的记录条数。

	// 需要计算得来
	private int totalPage; // 总页数 totalRecord/pageSize
	private int startIndex;// 當前開始索引位置 pageNum*pageSize
	private List<T> list;// 存儲當前檢索的數據

	// 分页显示的页数,比如在页面上显示1,2,3,4,5页,start就为1,end就为5,这个也是算过来的
	private int start;
	private int end;

	public Page(int pageNum, int pageSize, int totalRecord) {
		this.pageSize = pageSize;
		this.totalRecord = totalRecord;
		this.pageNum = pageNum;
		// totalPage 总页数
		if (totalRecord % pageSize == 0) {
			// 说明整除,正好每页显示pageSize条数据,没有多余一页要显示少于pageSize条数据的
			this.totalPage = totalRecord / pageSize;
		} else {
			// 不整除,就要在加一页,来显示多余的数据。
			this.totalPage = totalRecord / pageSize + 1;
		}

		// 开始索引
		this.startIndex = (pageNum - 1) * pageSize;
		// 显示5页,这里自己可以设置,想显示几页就自己通过下面算法修改
		this.start = 1;
		this.end = 5;
		// 显示页数的算法

		if (totalPage <= 5) {
			// 总页数都小于5,那么end就为总页数的值了。
			this.end = this.totalPage;
			pageNumArr = new int[end];
			for (int i = 0; i < end; i++) {
				pageNumArr[i] = start + i;
			}
		} else {
			// 总页数大于5,那么就要根据当前是第几页,来判断start和end为多少了,
			pageNumArr = new int[5];
			this.start = pageNum - 2;
			this.end = pageNum + 2;

			if (start <= 0) {
				// 比如当前页是第1页,或者第2页,那么就不如和这个规则,
				this.start = 1;
				this.end = 5;
			}
			if (end >= this.totalPage) {
				// 比如当前页是倒数第2页或者最后一页,也同样不符合上面这个规则
				this.end = totalPage;
				this.start = end - 5;
			}

			for (int i = 0; i < 5; i++) {
				pageNumArr[i] = start + i;
			}
		}
	}

	// get、set方法。
	public int getPageNum() {
		return pageNum;
	}

	public void setPageNum(int pageNum) {
		this.pageNum = pageNum;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getTotalRecord() {
		return totalRecord;
	}

	public void setTotalRecord(int totalRecord) {
		this.totalRecord = totalRecord;
	}

	public int getTotalPage() {
		return totalPage;
	}

	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}

	public int getStartIndex() {
		return startIndex;
	}

	public void setStartIndex(int startIndex) {
		this.startIndex = startIndex;
	}

	public List<T> getList() {
		return list;
	}

	public void setList(List<T> list) {
		this.list = list;
	}

	public int getStart() {
		return start;
	}

	public void setStart(int start) {
		this.start = start;
	}

	public int getEnd() {
		return end;
	}

	public void setEnd(int end) {
		this.end = end;
	}

	@Override
	public String toString() {
		return "Page [pageNum=" + pageNum + ", pageSize=" + pageSize + ", totalRecord=" + totalRecord + ", totalPage="
				+ totalPage + ", startIndex=" + startIndex + ", list=" + list + ", start=" + start + ", end=" + end
				+ "]";
	}
}

 

注意:为了方便,我把所有属性改成了public形式,所有get/set方法可以省略,正常的项目都应该是private!


  • 增加UserDao中数据库访问方法:

    • getTotalRecord:查询总数据条数
    • selectUsersPage:查询当前页的数据
package com.example.MavenDome_6.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.example.MavenDome_6.entity.User;

/**
 * 
 * 
 * <p>
 * Title: UserDao
 * </p>
 * 
 * @author Qiuran
 * 
 * @date 2019年10月24日
 */
//mapper 映射
@Mapper
public interface UserDao {
	int addUser(User u);// 添加用户

	int deleteUser(int id);// 按照id删除用户

	User seletOne(int id);// 通过id查询用户

	List<User> seletAll();// 查询所有用户,现在已经摒弃,可以删除

	Integer getTotalRecord();// 查询数据库中总数据条数

	List<User> selectUsersPage(Integer pageNum, Integer pageSize);// 查询当前页的数据
}

  • 添加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 namespace="com.example.MavenDome_6.dao.UserDao">
	<!--在配置文件中有mybatis.typeAliasesPackage=com.entity 所以resultType 中的User不需要写前面的包名 -->
	<!-- 查詢所有數據 -->
	<select id="seletAll" resultType="User">
		select * from user
	</select>

	<!-- 通過id查詢某條數據 -->
	<select id="seletOne" parameterType="int" resultType="User">
		select *
		from user where id = #{id}
	</select>

	<!-- 查詢某個頁面 -->
	<select id="selectUsersPage" resultType="User">
		select * from user order
		by id asc limit #{pageNum},#{pageSize}
	</select>

	<!-- 查詢數據庫中總的數據條數 -->
	<select id="getTotalRecord" resultType="int">
		select count(*) from user
	</select>

	<!-- 通過id刪除某個數據 -->
	<delete id="deleteUser" parameterType="int">
		delete from user
		where id
		=#{id}
	</delete>

	<!-- 添加某條數據 -->
	<insert id="addUser" parameterType="User">
		insert into user(name,sex,
		password)
		values(#{name},#{sex} ,#{password})
	</insert>
</mapper>

  • 添加一个service逻辑层,实现对dao的封装(我们这只对selectUsersPage()方法进行封装

    • 添加一个service包,在service包下添加UserDaoService.java文件

他主要实现Page对象的创建

package com.example.MavenDome_6.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.MavenDome_6.dao.UserDao;
import com.example.MavenDome_6.entity.Page;
import com.example.MavenDome_6.entity.User;

/**
 * 
 * <p>
 * Title: UserDaoService
 * </p>
 * 
 * @author Qiuran
 * 
 * @date 2019年10月26日
 */
@Service
public class UserDaoService {
	@Autowired
	UserDao userDao;

	public Page<User> seletOnePage(Integer pageNum, Integer pageSize) {
		int totalRecord = userDao.getTotalRecord();// 获取总数据条数
		Page<User> page = new Page<User>(pageNum, pageSize, totalRecord);// 创建Page对象
		page.setList(userDao.selectUsersPage(page.startIndex, pageSize));// 获取当前页信息
		return page;
	}
}

  • 在controller中增加对应的导航栏设置操作

修改seletAll方法,让他实现第一次访问默认查询首页,添加seletPage方法,让他实现访问当前你所选中的页面

UserController.java的部分代码:

// 实现查询用户的操作
	@RequestMapping("/index")
	public String seletAll(Model model, HttpServletRequest request) {
		int pageSize = 5;// 设置访问条数
		Page<User> page = userDaoService.seletOnePage(1, pageSize);// 首次访问,默认访问第一页,所有传1,
		model.addAttribute("page", page);
		request.getSession().setAttribute("totalPage", page.getTotalPage());//保存当前总页数
		return "index";
	}

	@RequestMapping("/seletPage")
	public String seletPage(Model model, Integer pageNum, HttpServletRequest request) {// 通过数据绑定,实现前台与后台的数据交互
		int pageSize = 5;
		int totalPage = (int) request.getSession().getAttribute("totalPage");//获取当前总页数
		if (pageNum < 1)
			pageNum = 1;
		if (pageNum >= totalPage)
			pageNum = totalPage - 1;
		Page<User> page = userDaoService.seletOnePage(pageNum, pageSize);// 根据pageNum传的参数,实现对应页面的访问
		model.addAttribute("page", page);
		return "index";
	}

 

UserController.java的总的代码:

package com.example.MavenDome_6.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.example.MavenDome_6.dao.UserDao;
import com.example.MavenDome_6.entity.Page;
import com.example.MavenDome_6.entity.User;
import com.example.MavenDome_6.service.UserDaoService;

/**
 * 
 * +
 * <p>
 * Title: UserController
 * </p>
 * 
 * @author Qiuran
 * 
 * @date 2019年10月24日
 */
//控制器
@Controller
public class UserController {
	// 自动注入Dao,用来实现数据库的相关操作
	@Autowired
	UserDao userDao;
	@Autowired
	UserDaoService userDaoService;

	// 网站的映射,创建相关的空的映射,实现网站的调转
	@RequestMapping("/seletOne")
	public String seletOne() {
		return "seletOne";
	}

	@RequestMapping("/addUser")
	public String addUser() {
		return "addUser";
	}

	@RequestMapping("/deleteOne")
	public String deleteOne() {
		return "deleteOne";
	}

	// 实现查询用户的操作
	@RequestMapping("/index")
	public String seletAll(Model model, HttpServletRequest request) {
		int pageSize = 5;// 设置访问条数
		Page<User> page = userDaoService.seletOnePage(1, pageSize);// 首次访问,默认访问第一页,所有传1,
		model.addAttribute("page", page);
		request.getSession().setAttribute("totalPage", page.getTotalPage());//保存当前总页数
		return "index";
	}

	@RequestMapping("/seletPage")
	public String seletPage(Model model, Integer pageNum, HttpServletRequest request) {// 通过数据绑定,实现前台与后台的数据交互
		int pageSize = 5;
		int totalPage = (int) request.getSession().getAttribute("totalPage");//获取当前总页数
		if (pageNum < 1)
			pageNum = 1;
		if (pageNum >= totalPage)
			pageNum = totalPage - 1;
		Page<User> page = userDaoService.seletOnePage(pageNum, pageSize);// 根据pageNum传的参数,实现对应页面的访问
		model.addAttribute("page", page);
		return "index";
	}

	// 实现查询某个用户
	@RequestMapping("/seletOnePages")
	public String seletOnePages(HttpServletRequest request, Model model) {
		int id = Integer.parseInt(request.getParameter("id"));
		User list = userDao.seletOne(id);
		model.addAttribute("list", list);
		return "seletOne";
	}

	// 实现添加用户操作
	@RequestMapping("/addUserPages")
	public String addUserPages(HttpServletRequest request, Model model) {
		String name = request.getParameter("name");
		String password = request.getParameter("password");
		String sex = request.getParameter("sex");
		User u = new User(name, sex, password);
		int n = userDao.addUser(u);
		if (n > 0)
			model.addAttribute("message", "添加成功");
		else
			model.addAttribute("message", "添加失败");
		return "message";// 此处返回到消息控制页面
	}

	// 实现删除用户操作
	@RequestMapping("/deleteOnePages")
	public String deleteOnePages(HttpServletRequest request, Model model) {
		int id = Integer.parseInt(request.getParameter("id"));
		int n = userDao.deleteUser(id);
		if (n > 0)
			model.addAttribute("message", "删除成功");
		else
			model.addAttribute("message", "删除失败");
		return "message";
	}

}

  • 修改对应index.html文件

在table下面添加导航即可

添加的部分:

<ul class="pagination pagination-lg">
	<li><a th:href="@{/seletPage(pageNum=1)}">首頁</a></li>
	<li><a th:href="@{/seletPage(pageNum=${page.pageNum-1})}">上一頁</a></li>
    <li th:each="num:${page.pageNumArr}"><a th:text="${num}"
		th:href="@{/seletPage(pageNum=${num})}"></a></li>
    <li><a th:href="@{/seletPage(pageNum=${page.pageNum+1})}">下一頁</a></li>
    <li><a th:href="@{/seletPage(pageNum=${page.totalPage})}">尾頁</a></li>
</ul>

总的index.html代码:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
	xmlns="http://www.w3.org/1999/xhtml"
	xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link
	href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.min.css"
	rel="stylesheet">
<link
	href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.css"
	rel="stylesheet">
<link
	href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap-theme.css"
	rel="stylesheet">
<link
	href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap-theme.min.css"
	rel="stylesheet">
<title>Insert title here</title>
</head>
<body>
	<div class="container">
		<div class="row clearfix">
			<div class="col-md-12 column">
				<ul class="nav nav-tabs">
					<li class="active"><a href="index">首页</a></li>
					<li><a href="seletOne">查询</a></li>
					<li class="disabled"><a href="addUser">添加</a></li>
					<li><a href="deleteOne">删除</a></li>
				</ul>

				<h3 class="text-center">查寻用户</h3>
				<table class="table table-bordered table-hover">
					<thead>
						<tr>
							<th>编号</th>
							<th>姓名</th>
							<th>性别</th>
							<th>密码</th>
						</tr>
					</thead>
					<tbody>
						<tr th:each="page:${page.list}"
							th:class="${page.id%2==0 ? 'success':'info'}">
							<td th:text="${page.id}"></td>
							<td th:text="${page.name}"></td>
							<td th:text="${page.sex}"></td>
							<td th:text="${page.password}"></td>
						</tr>
					</tbody>
				</table>
				<ul class="pagination pagination-lg">
					<li><a th:href="@{/seletPage(pageNum=1)}">首頁</a></li>
					<li><a th:href="@{/seletPage(pageNum=${page.pageNum-1})}">上一頁</a></li>
					<li th:each="num:${page.pageNumArr}"><a th:text="${num}"
						th:href="@{/seletPage(pageNum=${num})}"></a></li>
					<li><a th:href="@{/seletPage(pageNum=${page.pageNum+1})}">下一頁</a></li>
					<li><a th:href="@{/seletPage(pageNum=${page.totalPage})}">尾頁</a></li>
				</ul>
			</div>
		</div>
		<div class="row clearfix">
			<div class="col-md-4 column">
				<h2>查询用户</h2>
				<p>Donec id elit non mi porta gravida at eget metus. Fusce
					dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh,
					ut fermentum massa justo sit amet risus. Etiam porta sem malesuada
					magna mollis euismod. Donec sed odio dui.</p>
				<button type="button" class="btn btn-lg btn-block active">
					<a class="btn" href="seletOne">查询 </a>
				</button>
			</div>
			<div class="col-md-4 column">
				<h2>添加用户</h2>
				<p>Donec id elit non mi porta gravida at eget metus. Fusce
					dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh,
					ut fermentum massa justo sit amet risus. Etiam porta sem malesuada
					magna mollis euismod. Donec sed odio dui.</p>
				<button type="button" class="btn btn-lg btn-block active">
					<a class="btn" href="addUser">添加</a>
				</button>
			</div>
			<div class="col-md-4 column">
				<h2>删除用户</h2>
				<p>Donec id elit non mi porta gravida at eget metus. Fusce
					dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh,
					ut fermentum massa justo sit amet risus. Etiam porta sem malesuada
					magna mollis euismod. Donec sed odio dui.</p>
				<button type="button" class="btn btn-lg btn-block active">
					<a class="btn" href="deleteOne">删除</a>
				</button>
			</div>
		</div>

	</div>
</body>
</html>

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值