SpringBoot+Mybatis-Plus+Thymeleaf+Bootstrap分页查询(前后端完整版开源学习)图书管理系统
创始人
2024-04-30 13:13:43
0

目录

  • 分页主要逻辑,在3.7和3.8
  • 1.准备工作
    • 1.1 参考博客
    • 1.2 项目结构
  • 2. 数据库
  • 3. 详细代码部分
    • 3.1 pom依赖
    • 3.2 application.yml
    • 3.3 BookMapper.xml
    • 3.4 BookMapper
    • 3.5 BookService 和 BookServiceImpl
    • 3.6 实体类entity book
    • 3.7控制层 BookController
    • 3.8 前端页面bookList.html
    • 3.9 工具类
      • 3.9.1 mybatis-plus 插入时间和更新时间字段自动填充工具
      • 3.9.2 分页插件工具
  • 4. 运行效果

分页主要逻辑,在3.7和3.8

1.准备工作

1.1 参考博客

Mybatis-Plus | Spring Boot+Mybatis-Plus+Thymeleaf+Bootstrap分页页查询(前后端都有)
主要参考了这篇博客。

1.2 项目结构

在这里插入图片描述

运行截图在这里插入图片描述

2. 数据库

DROP TABLE IF EXISTS `book`;
CREATE TABLE `book`  (`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '序号',`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '书名',`author` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '作者',`publisher` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '出版社',`amount` int(0) NULL DEFAULT NULL COMMENT '在库数量',`version` int(0) NULL DEFAULT NULL COMMENT '版本',`deleted` int(0) NULL DEFAULT NULL COMMENT '逻辑删',`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',`modify_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '图书' ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` VALUES (3, '《鲁迅文集》', '鲁迅', '广西出版社', 20, NULL, 0, '2022-12-24 14:30:23', '2022-12-24 14:30:23');
INSERT INTO `book` VALUES (4, '《边城》', '沈从文', '武汉出版社', 10, NULL, 0, '2022-12-24 14:50:43', '2022-12-24 14:50:43');
INSERT INTO `book` VALUES (5, '《人生》', '路遥', '北京十月文艺出版社', 11, NULL, 0, '2022-12-24 14:51:41', '2022-12-24 14:51:41');
INSERT INTO `book` VALUES (6, '《平凡的世界》', '路遥', '北京十月文艺出版社', 11, NULL, 0, '2022-12-24 14:52:14', '2022-12-24 14:52:14');

3. 详细代码部分

3.1 pom依赖


4.0.0org.springframework.bootspring-boot-starter-parent2.7.4 com.nndxits0.0.1-SNAPSHOTitsDemo project for nndx ITS auto-opera1.8com.github.pagehelperpagehelper-spring-boot-starter1.4.1org.springframework.bootspring-boot-devtoolsruntimetrueorg.springframework.bootspring-boot-starter-thymeleaforg.springframework.bootspring-boot-starter-webmysqlmysql-connector-javaruntimeorg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestio.swaggerswagger-annotations1.6.3com.baomidoumybatis-plus-boot-starter3.5.2com.baomidoumybatis-plus-generator3.5.2org.apache.velocityvelocity-engine-core2.3org.freemarkerfreemarker2.3.31org.springframework.bootspring-boot-maven-pluginorg.projectlomboklombok

3.2 application.yml

server:port: 8080#设置开发环境
spring:datasource:username: rootpassword: xxxxdriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/wm-demo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8thymeleaf:cache: falseencoding: UTF-8mode: HTML5prefix: classpath:/templates/suffix: .html#pagehelper分页配置
pagehelper:helper-dialect: mysqlreasonable: truesupport-methods-arguments: trueparams: count=countsqlmybatis-plus:#配置日志  log-impl:日志实现configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:logic-delete-field: isDelete # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)logic-delete-value: 1 # 逻辑已删除值(默认为 1)logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

3.3 BookMapper.xml



id, name, author, publisher, amount, version, deleted, create_time, modify_time

3.4 BookMapper

package com.book.mapper;import com.book.entity.Book;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;@Mapper
@Repository
public interface BookMapper extends BaseMapper {}

3.5 BookService 和 BookServiceImpl

package com.book.service;
import com.book.entity.Book;
import com.baomidou.mybatisplus.extension.service.IService;
public interface BookService extends IService {}
package com.book.service.impl;
import com.book.entity.Book;
import com.book.mapper.BookMapper;
import com.book.service.BookService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class BookServiceImpl extends ServiceImpl implements BookService {}

3.6 实体类entity book

package com.book.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import java.io.Serializable;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;@Getter
@Setter
@Accessors(chain = true)
@TableName("book")
@ApiModel(value = "Book对象", description = "图书")
public class Book implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty("序号")@TableId(value = "id", type = IdType.AUTO)private Long id;@ApiModelProperty("书名")@TableField("name")private String name;@ApiModelProperty("作者")@TableField("author")private String author;@ApiModelProperty("出版社")@TableField("publisher")private String publisher;@ApiModelProperty("在库数量")@TableField("amount")private Integer amount;@ApiModelProperty("版本")@TableField("version")@Versionprivate Integer version;@ApiModelProperty("逻辑删")@TableField("deleted")@TableLogicprivate Integer deleted;@ApiModelProperty("创建时间")@TableField(value = "create_time", fill = FieldFill.INSERT)private Date createTime;@ApiModelProperty("更新时间")@TableField(value = "modify_time", fill = FieldFill.INSERT_UPDATE)private Date modifyTime;
}

3.7控制层 BookController

package com.book.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.book.entity.Book;
import com.book.mapper.BookMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
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 org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;@Controller
@RequestMapping("/book")
public class BookController {//首页@RequestMapping("/index")public String toIndexPage(Model model){return "index";}//回到登录页@RequestMapping("/toLogion")public String toLogion(Model model){return "login";}@Autowiredprivate BookMapper bookMapper;//分页查询用户数据@RequestMapping("/selectPage")public String userList(Model model,@RequestParam(required = false,defaultValue="1",value="pageNum")Integer pageNum,@RequestParam(defaultValue="3",value="pageSize")Integer pageSize){//为了程序的严谨性,判断非空://设置默认当前页if(pageNum==null || pageNum<=0){pageNum = 1;}//设置默认每页显示的数据数if(pageSize == null){pageSize = 1;}System.out.println("当前页是:"+pageNum+"显示条数是:"+pageSize);//1.引入分页插件,pageNum是第几页,pageSize是每页显示多少条,默认查询总数countPageHelper.startPage(pageNum,pageSize);//2.紧跟的查询就是一个分页查询-必须紧跟.后面的其他查询不会被分页,除非再次调用PageHelper.startPagetry {QueryWrapper wrapper = new QueryWrapper();List bookList = bookMapper.selectList(wrapper);System.out.println("分页数据:"+bookList);//3.使用PageInfo包装查询后的结果,5是连续显示的条数,结果list类型是PagePageInfo pageInfo = new PageInfo(bookList,pageSize);//4.使用model传参数回前端model.addAttribute("pageInfo",pageInfo);model.addAttribute("bookList",bookList);//model.addAttribute("username","测试");}finally {//清理 ThreadLocal 存储的分页参数,保证线程安全PageHelper.clearPage();}return "bookList";}}

3.8 前端页面bookList.html





图书管理 分页插件demo测试
序号书名作者出版社在库数量创建时间
当前第 [[${pageInfo.pageNum}]]页,共 [[${pageInfo.pages}]] 页.一共 [[${pageInfo.total}]] 条记录

3.9 工具类

3.9.1 mybatis-plus 插入时间和更新时间字段自动填充工具

package com.book.util;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;
//mp的自动填充时间处理
@Component
public class CustomMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.setFieldValByName("createTime", new Date(), metaObject);this.setFieldValByName("modifyTime", new Date(), metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName("updateTime", new Date(), metaObject);}
}

3.9.2 分页插件工具

package com.book.util;import java.util.List;// 分页工具类
public class PageUtil {// 对象记录结果集private List list;// 总记录数private int total = 0;// 每页显示记录数private int limit = 20;// 总页数private int pages = 1;// 当前页private int pageNumber = 1;// 是否为第一页private boolean isFirstPage = false;// 是否为最后一页private boolean isLastPage = false;// 是否有前一页private boolean hasPreviousPage = false;// 是否有下一页private boolean hasNextPage = false;// 导航页码数private int navigatePages = 8;// 所有导航页号private int[] navigatePageNumbers;// 尾页private int lastPage = 0 ;// 首页private int firstPage = 1 ;// 上一页private int prePage = 0;// 下一页private int nextPage = 0;public PageUtil(int pageNumber, int limit, List list) {init(list, pageNumber, limit);}private void init(List list, int pageNumber, int limit){//设置基本参数this.list = list;this.total = list.size();this.limit = limit;this.pages = (this.total-1)/this.limit+1;this.lastPage = pages;this.firstPage = 1;this.prePage = pageNumber-1;this.nextPage = pageNumber+1;//根据输入可能错误的当前号码进行自动纠正if(pageNumber<1){this.pageNumber=1;}else if(pageNumber>this.pages){this.pageNumber=this.pages;}else{this.pageNumber=pageNumber;}//基本参数设定之后进行导航页面的计算calcNavigatePageNumbers();//以及页面边界的判定judgePageBoudary();}/*** 计算导航页*/private void calcNavigatePageNumbers(){//当总页数小于或等于导航页码数时if(pages<=navigatePages){navigatePageNumbers=new int[pages];for(int i=0;inavigatePageNumbers[i]=i+1;}}else{ //当总页数大于导航页码数时navigatePageNumbers=new int[navigatePages];int startNum=pageNumber-navigatePages/2;int endNum=pageNumber+navigatePages/2;if(startNum<1){startNum=1;//(最前navPageCount页for(int i=0;inavigatePageNumbers[i]=startNum++;}}else if(endNum>pages){endNum=pages;//最后navPageCount页for(int i=navigatePages-1;i>=0;i--){navigatePageNumbers[i]=endNum--;}}else{//所有中间页for(int i=0;inavigatePageNumbers[i]=startNum++;}}}}/*** 判定页面边界*/private void judgePageBoudary(){isFirstPage = pageNumber == 1;isLastPage = pageNumber == pages && pageNumber!=1;hasPreviousPage = pageNumber!=1;hasNextPage = pageNumber!=pages;}/*** 得到当前页的内容* @return {List}*/public List getList() {int endIndex = total;if(pageNumber*limit <= total){endIndex = pageNumber*limit;}List pagelist = list.subList((pageNumber-1)*limit, endIndex);return pagelist;}public int getLastPage() {return lastPage;}public void setLastPage(int lastPage) {this.lastPage = lastPage;}public int getFirstPage() {return firstPage;}public void setFirstPage(int firstPage) {this.firstPage = firstPage;}public int getPrePage() {return prePage;}public void setPrePage(int prePage) {this.prePage = prePage;}public int getNextPage() {return nextPage;}public void setNextPage(int nextPage) {this.nextPage = nextPage;}/*** 得到记录总数* @return {int}*/public int getTotal() {return total;}/*** 得到每页显示多少条记录* @return {int}*/public int getLimit() {return limit;}/*** 得到页面总数* @return {int}*/public int getPages() {return pages;}/*** 得到当前页号* @return {int}*/public int getPageNumber() {return pageNumber;}/*** 得到所有导航页号* @return {int[]}*/public int[] getNavigatePageNumbers() {return navigatePageNumbers;}public boolean isFirstPage() {return isFirstPage;}public boolean isLastPage() {return isLastPage;}public boolean hasPreviousPage() {return hasPreviousPage;}public boolean hasNextPage() {return hasNextPage;}
}

4. 运行效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...