利用spring boot练习的小项目记录:分页操作

利用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插件进行分页操作!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_42956993

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值