简单分页功能的实现效果图:
简单分页功能的实现思想:
1.后端根据前端传入的查询条件(班级号,页号,若页号为空,则设置页号为1),分页显示查询的结果
<!--根据班级号查询本班级的所有学生,并分页显示-->
<
select
id
="page"
parameterType
="java.util.Map"
resultMap
="TestStudentResult"
>
SELECT student_id,student_name,student_class_id FROM student
<
where
>
student_class_id = #{classID}
</
where
>
ORDER BY student_id limit #{page.dbIndex},#{page.dbNumber}
</
select
>
2.首先根据班级号,查询出所有数据的总条数count,将总条数传入Page实体类计算出总页数
<!--总条数-->
<
select
id
="count"
parameterType
="int"
resultType
="int"
>
SELECT
count
(
*
) FROM student
<
where
>
student_class_id = #{_parameter}
</
where
>
</
select
>
/**
* 根据总条数计算总页数
*/
if
(
this
.
totalNumber
%
this
.
pageNumber
>
0
){
/**
* 如果总条数小于每页显示的条数,那么总页数为1
*/
if
(
this
.
totalNumber
<
this
.
pageNumber
){
this
.
totalPage
=
1
;
}
else
{
this
.
totalPage
=(
this
.
totalNumber
/
this
.
pageNumber
)+
1
;
}
}
else
{
this
.
totalPage
=
this
.
totalNumber
/
this
.
pageNumber
; }
3.页号为空时,设置页号为以,从第一页开始显示,并计算limit的参数
/**
* 设置limit参数
*/
this
.
dbIndex
= (
this
.
currentPage
-
1
)*
this
.
pageNumber
;
this
.
dbNumber
=
this
.
pageNumber
;
4.最后将Page实体类与查询到的list集合以Map的形式传给前端(关于前后端的交互和前端界面的编写可以参考我的博客)
以下列出了核心代码:
①数据库的班级表
②分页对应的实体类Page
public class Page {
//总条数
private int totalNumber;
//总页数
private int totalPage;
//当前页数
private int currentPage;
public int getTotalNumber() {
return totalNumber;
}
public void setTotalNumber(int totalNumber) {
this.totalNumber = totalNumber;
this.count();
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
//数据库中limit的参数,从第几条开始取
private int dbIndex;
//数据库中limit的参数,总共取几条
private int dbNumber;
//每页显示几条
private int pageNumber=2;
public void count(){
/**
* 根据总条数计算总页数
*/
if (this.totalNumber%this.pageNumber>0){
/**
* 如果总条数小于每页显示的条数,那么总页数为1
*/
if (this.totalNumber<this.pageNumber){
this.totalPage=1;
}
else{
this.totalPage=(this.totalNumber/this.pageNumber)+1;
}
}
else { this.totalPage=this.totalNumber/this.pageNumber; }
// 设置当前页数
// 总页数小于当前页数,应将当前页数设置为总页数
if(this.totalPage < this.currentPage) {
this.currentPage = this.totalPage;
}
// 当前页数小于1设置为1
if(this.currentPage < 1) {
this.currentPage = 1;
}
/**
* 设置limit参数
*/
this.dbIndex = (this.currentPage-1)*this.pageNumber;
this.dbNumber = this.pageNumber;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
this.count();
}
public int getDbIndex() {
return dbIndex;
}
public void setDbIndex(int dbIndex) {
this.dbIndex = dbIndex;
}
public int getDbNumber() {
return dbNumber;
}
public void setDbNumber(int dbNumber) {
this.dbNumber = dbNumber;
}
public int getPageNumber() {
return pageNumber;
}
public void setPageNumber(int pageNumber) { this.pageNumber = pageNumber; }
public Page(int totalNumber, int totalPage, int currentPage, int dbIndex, int dbNumber, int pageNumber) {
this.totalNumber = totalNumber;
this.totalPage = totalPage;
this.currentPage = currentPage;
this.dbIndex = dbIndex;
this.dbNumber = dbNumber;
this.pageNumber = pageNumber;
}
public Page() {
}
}
③mybatis的mapper配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="algorithm.offer.dao.idao.IStudent">
<resultMap type="algorithm.offer.pojo.TestStudent" id="TestStudentResult">
<id column="student_id" jdbcType="INTEGER" property="studentId"/>
<result column="student_name" jdbcType="VARCHAR" property="studentName"/>
<result column="student_class_id" jdbcType="INTEGER" property="studentClassId"/>
</resultMap>
<!--分页的简单实现-->
<!--总条数-->
<select id="count" parameterType="int" resultType="int">
SELECT count(*) FROM student
<where>
student_class_id = #{_parameter}
</where>
</select>
<!--根据班级号查询本班级的所有学生,并分页显示-->
<select id="page" parameterType="java.util.Map" resultMap="TestStudentResult">
SELECT student_id,student_name,student_class_id FROM student
<where>
student_class_id = #{classID}
</where>
ORDER BY student_id limit #{page.dbIndex},#{page.dbNumber}
</select>
</mapper>
④DAO层接口(面向接口编程)
public interface IStudent {
int count(int classID);
List<TestStudent> page(Map<String,Object> map);
}
⑤service层的接口
public interface
IStudentService {
Map<String, Object> showStudentByPage(String classID, String pageNumber);
int
studentTotalCount(String classID);
}
service层实现类
@Service
public class
StudentServiceImp
implements
IStudentService{
DBAccess
dbAccess
=
new
DBAccess();
SqlSession
sqlSession
=
null
;
/**
* 分页显示
*/
/**
* 根据当前页数显示相应数据
* 设置了数据库的limit参数
*
@return
*/
@Override
public
Map<String, Object> showStudentByPage(String classID,String pageNumber){
try
{
//查询数据的总条数
int
totalNumber = studentTotalCount(classID);
Page page =
new
Page();
//计算出了总页数
page.setTotalNumber(totalNumber);
//计算limit参数
//如果当前页数为空,当前页数为1
if
(pageNumber==
null
||
""
.equals(pageNumber.trim())){page.setCurrentPage(
1
);}
//否则用传入的数据
else
{page.setCurrentPage(Integer.
valueOf
(pageNumber));}
//获取sqlSession
sqlSession
=
dbAccess
.getSqlSession();
//产生动态代理类
IStudent iStudent =
sqlSession
.getMapper(IStudent.
class
);
//page实体类与班级号的map,提供给DAO层使用
Map<String,Object> map =
new
HashMap<>();
map.put(
"page"
,page);
map.put(
"classID"
,classID);
List<TestStudent> testStudents =iStudent.page(map);
//page实体类与查询出的学生list集合的map,返回给前端
Map<String,Object> mapPageANDTeestStudents =
new
HashMap<>();
mapPageANDTeestStudents.put(
"page"
,page);
mapPageANDTeestStudents.put(
"testStudents"
,testStudents);
return
mapPageANDTeestStudents;
}
catch
(IOException e) {
e.printStackTrace();
}
return null
;
}
@Override
public int
studentTotalCount(String classID) {
try
{
sqlSession
=
dbAccess
.getSqlSession();
IStudent iStudent =
sqlSession
.getMapper(IStudent.
class
);
int
intClassID = Integer.
valueOf
(classID);
return
iStudent.count(intClassID);
}
catch
(IOException e) {
e.printStackTrace();
}
return
0
;
}
}
⑥controller层
@Controller
@RequestMapping("/student")
public class StudentController {
@Autowired
private IStudentService iStudentService;
@RequestMapping(value = "/pageNumber")
@ResponseBody
public Map<String, Object> showStudentByPageNumber(String classID, String pageNumber){
return iStudentService.showStudentByPage(classID,pageNumber);
}
}