Mybatis-Plus | Spring Boot+Mybatis-Plus+Thymeleaf+Bootstrap分页页查询(前后端都有)
主要参考了这篇博客。
运行截图
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');
4.0.0 org.springframework.boot spring-boot-starter-parent 2.7.4 com.nndx its 0.0.1-SNAPSHOT its Demo project for nndx ITS auto-opera 1.8 com.github.pagehelper pagehelper-spring-boot-starter 1.4.1 org.springframework.boot spring-boot-devtools runtime true org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-web mysql mysql-connector-java runtime org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test io.swagger swagger-annotations 1.6.3 com.baomidou mybatis-plus-boot-starter 3.5.2 com.baomidou mybatis-plus-generator 3.5.2 org.apache.velocity velocity-engine-core 2.3 org.freemarker freemarker 2.3.31 org.springframework.boot spring-boot-maven-plugin org.projectlombok lombok
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)
id, name, author, publisher, amount, version, deleted, create_time, modify_time
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 {}
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 {}
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;
}
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";}}
图书管理 分页插件demo测试
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);}
}
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;}
}