利用spring boot练习小项目,记录一下其中的一个小段,分页操作,遇到了个别小细节需要注意,也在此记录巩固一下。
mapper层:
@Mapper
public interface DiscussPostMapper {
// (根据用户)查找所有文章
List<DiscussPost> findDiscussPost(int userId,int offset, int limit);
//总条数
int DiscussPostRows(@Param("userId") int userId);
}
mapper.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.csf.dao.DiscussPostMapper">
<sql id="findFiles">
id,user_id,title,content,type,status,create_time,comment_count,score
</sql>
<select id="findDiscussPost" resultType="DiscussPost">
select <include refid="findFiles"></include>
from discuss_post
where status!=2
<if test="userId!=0">
and user_id=#{userId}
</if>
order by type desc,create_time desc
limit #{offset},#{limit}
</select>
<select id="DiscussPostRows" parameterType="int" resultType="int">
select count(id)
from discuss_post
where status!=2
<if test="userId!=0">
and user_id=#{userId}
</if>
</select>
</mapper>
yml:
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/community?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: root
type: com.zaxxer.hikari.HikariDataSource
hikari:
maximum-pool-size: 15
minimum-idle: 5
idle-timeout: 30000
thymeleaf:
prefix: classpath:/templates/
suffix: .html
mode: HTML5
encoding: UTF-8
cache: false
mybatis:
mapper-locations: classpath:mapping/*.xml
type-aliases-package: com.csf.entity
configuration:
use-generated-keys: true
map-underscore-to-camel-case: true
pojo:
package com.csf.entity;
public class Page {
//当前页面
private int current=1;
//每页显示的数据
private int limit=10;
//页面跳转的路径
private String path;
//总条数
private int rows;
public int getCurrent() {
return current;
}
public void setCurrent(int current) {
if (current>0){
this.current = current;
}
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
if (limit>1 && limit <1000){
this.limit = limit;
}
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
//获取总页数
public int getTotal(){
if (rows % limit == 0){
return rows/limit;
}else {
return rows/limit+1;
}
}
//当前页的起始行数
public int getiniRows(){
return current*limit-limit;
}
//获得起始页码
public int getInits(){
int initpage = current-2;
return initpage<1?1:initpage;
}
//获得终止页码
public int getFinals(){
int finals = current+2;
return finals>getTotal()?getTotal():finals;
}
}
业务层:
public interface DiscussPostService {
// (根据用户)查找所有文章
List<DiscussPost> findDiscussPost(int userId, int offset, int limit);
//总条数
int DiscussPostRows(int userId);
}
@Service
public class DiscussPostServiceImpl implements DiscussPostService {
@Autowired
private DiscussPostMapper discussPostMapper;
@Override
public List<DiscussPost> findDiscussPost(int userId, int offset, int limit) {
List<DiscussPost> discussPost = discussPostMapper.findDiscussPost(userId, offset, limit);
return discussPost;
}
@Override
public int DiscussPostRows(int userId) {
int i = discussPostMapper.DiscussPostRows(userId);
return i;
}
}
controller层:
@Controller
@RequestMapping("/discuss")
public class DiscussPostController {
@Autowired
private DiscussPostService discussPostService;
@Autowired
private UserService userService;
@RequestMapping(value = "/findDis")
public String findDiscussPost(Model model, Page page){
// 获取总行数
page.setRows(discussPostService.DiscussPostRows(0));
// 获取当前路径
page.setPath("/discuss/findDis");
List<DiscussPost> discussPostList = discussPostService.findDiscussPost(0, page.getiniRows(), page.getLimit());
List<Map<String,Object>> maplist = new ArrayList<>();
if (discussPostList != null){
for (DiscussPost disList:discussPostList) {
User user = userService.findUserById(disList.getUserId());
Map<String,Object> map = new HashMap<>();
map.put("user",user);
map.put("disList",disList);
maplist.add(map);
}
}
model.addAttribute("maplist",maplist);
return "index";
}
}
前端界面:
<!-- 分页 -->
<nav class="mt-5">
<ul class="pagination justify-content-center" th:if="${page.rows>0}">
<li class="page-item">
<a class="page-link" th:href="@{${page.path}(current=1)}">首页</a>
</li>
<li th:class="|page-item ${page.current==1?'disabled':''}|">
<a class="page-link" th:href="@{${page.path}(current=${page.current-1})}">上一页</a>
</li>
<li th:class="|page-item ${page.current == i ?'active':''}|" th:each="i:${#numbers.sequence(page.inits,page.finals)}">
<a class="page-link" href="#" th:text="${i}">1</a>
</li>
<li class="page-item">
<a class="page-link" th:href="@{${page.path}(current=${page.current+1})}">下一页</a>
</li>
<li class="page-item">
<a class="page-link" th:href="@{${page.path}(current=${page.total})}">末页</a>
</li>
</ul>
</nav>
实现界面:
有个点需要注意一下:
我在page实体类中自定义了一个getInits起始页码方法,get后面的I一定要注意要大写
//获得起始页码
public int getInits(){
int initpage = current-2;
return initpage<1?1:initpage;
}
要不然前端界面获取不到。
<li th:class="|page-item ${page.current == i ?'active':''}|" th:each="i:${#numbers.sequence(page.inits,page.finals)}">
<a class="page-link" href="#" th:text="${i}">1</a>
</li>
细节一点!
后面可以用一下pageHelper插件进行分页操作!