说明:虽说在实习,但是近来完全没有做跟开发相关的事情,反而是在做完全不搭边的很简单的事情。然后呢,抱怨也没用,既然选择了就好好坚持下去吧。。然后最近想把之前学过的东西都整合到自己的一个小案例里面,但是没有明确的需求实在是不好开发。。于是乎,就想到一点添加一点进来。今天做的事分页查询模块,以前也有做过纯Servlet开发的分页查询,那个时候没有记录下来,但是回过头去看,其实道理都是一样的。。总之,这次也只是单纯的从书上的大案例中抽取出来的一个分页小模块,经测试可以运行,故此记录。。。。。
1.项目结构:
2.这个案例里面包含了用户登录,拦截器,由于之前博文已经单独描述过,故此不再重复,仅粘贴出 分页相关的代码。。
从后台到前台,首先是实体类
Book.java
public class Book implements Serializable{ private static final long serialVersionUID = 1L; private int id; private String bookname; private String author;
/**省略set和get方法*/
}
BookMapper.java
public interface BookMapper { // 根据参数查询图书总数 @SelectProvider(type=BookDynaSqlProvider.class,method="count") Integer count(Map<String, Object> params); // 根据参数动态查询图书 @SelectProvider(type=BookDynaSqlProvider.class,method="selectWhitParam") @Results({ @Result(id=true,column="id",property="id"), @Result(column="bookname",property="bookname"), @Result(column="author",property="author") }) public List<Book> selectByPage(Map<String, Object> params);
}
动态SQL语句BookDynaSqlProvider.java
/** * @Description: 书籍动态SQL语句提供类 */public class BookDynaSqlProvider { // 分页动态查询 public String selectWhitParam(Map<String, Object> params){ String sql = new SQL(){ { SELECT("*"); FROM("t_testdb"); if(params.get("book") != null){ Book book = (Book)params.get("book"); if(book.getBookname() != null && !book.getBookname().equals("")){ WHERE(" NAME LIKE CONCAT ('%',#{book.bookname},'%') "); } if(book.getAuthor() != null && !book.getAuthor().equals("")){ WHERE(" NAME LIKE CONCAT ('%',#{book.author},'%') "); } } } }.toString(); if(params.get("pageModel") != null){ //第一个参数表示起始记录数,即从哪条数据开始显示;第二个参数表示每页显示的记录数 sql += " limit #{pageModel.firstLimitParam} , #{pageModel.pageSize} "; } return sql; } // 动态查询总数量 public String count(Map<String, Object> params){ return new SQL(){ { SELECT("count(*)"); FROM("t_testdb"); if(params.get("employee") != null){ Book book = (Book)params.get("book"); if(book.getBookname() != null && !book.getBookname().equals("")){ WHERE(" NAME LIKE CONCAT ('%',#{book.bookname},'%') "); } if(book.getAuthor() != null && !book.getAuthor().equals("")){ WHERE(" NAME LIKE CONCAT ('%',#{book.author},'%') "); } } } }.toString(); }
}
BookService.java
public interface BookService { public List<Book> findBook(Book book,PageModel pageModel);
}
BookServiceImpl.java
@Servicepublic class BookServiceImpl implements BookService{ @Autowired private BookMapper bookMapper; @Transactional(readOnly=true) public List<Book> findBook(Book book,PageModel pageModel) { /** 当前需要分页的总数据条数 */ Map<String,Object> params = new HashMap<>(); params.put("book", book); int recordCount = bookMapper.count(params); pageModel.setRecordCount(recordCount); if(recordCount > 0){ /** 开始分页查询数据:查询第几页的数据 */ params.put("pageModel", pageModel); } List<Book> books = bookMapper.selectByPage(params); return books; }
}
分页实体PageModel.java
/** * 分页实体 */public class PageModel { /** 分页总数据条数 */ private int recordCount; /** 当前页面 (ps:为int型,若不进行初始化操作,则默认值为0 )*/ private int pageIndex ; /** 每页分多少条数据 */ private int pageSize = HrmConstants.PAGE_DEFAULT_SIZE=2; /** 总页数 */ private int totalSize; //获取分页的总条数 public int getRecordCount() { this.recordCount = this.recordCount <= 0 ? 0:this.recordCount; return recordCount; } public void setRecordCount(int recordCount) { this.recordCount = recordCount; } //获得当前页 public int getPageIndex() { //由于没有初始化, 所以首次访问分页时pageIndex默认为0 this.pageIndex = this.pageIndex <= 0?1:this.pageIndex; /** 判断当前页面是否超过了总页数:如果超过了默认给最后一页作为当前页 */ this.pageIndex = this.pageIndex>=this.getTotalSize()?this.getTotalSize():this.pageIndex; return pageIndex; } public void setPageIndex(int pageIndex) { this.pageIndex = pageIndex; } //每页显示的记录数 public int getPageSize() { this.pageSize = this.pageSize <= HrmConstants.PAGE_DEFAULT_SIZE?HrmConstants.PAGE_DEFAULT_SIZE:this.pageSize; return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } //获取总页数 public int getTotalSize() { if(this.getRecordCount() <=0){ totalSize = 0 ; }else{ totalSize = (this.getRecordCount() -1)/this.getPageSize() + 1; } return totalSize; } //起始记录数(将此参数传递给limit的第一个参数,limit中有两个参数,第二个参数表示每一页显示的记录数) public int getFirstLimitParam(){ return (this.getPageIndex()-1)*this.getPageSize() ; } }
BookController.java
@Controllerpublic class BookController { @Autowired private BookService bookService; @RequestMapping(value="/selectBook") public String selectBook(Integer pageIndex,Model model,Book book){ // 创建分页对象 PageModel pageModel = new PageModel(); // 如果参数pageIndex不为null,设置pageIndex,即显示第几页 if(pageIndex != null){ pageModel.setPageIndex(pageIndex); } // 查询员工信息 List<Book> books = bookService.findBook(book, pageModel); // 设置Model数据 model.addAttribute("books", books); model.addAttribute("pageModel", pageModel); // 返回员工页面 return "book_list"; }
}
book_list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> <table> <tr> <td>书名</td> <td>作者</td> </tr> <c:forEach items="${books}" var="book"> <tr> <td align = "center">${book.bookname}</td> <td align = "center">${book.author}</td> </tr><br> </c:forEach> </table></body>
</html>
总结,以上就是分页模块的全部代码,直接copy然后改改名字就可以直接使用了,这个实用注解的SQL,如果需要也可以改成XML配置的方式。。这里没有提供前台 分页符 如果要测试的话,直接在url中给出要访问数据库中第几页的数据即可,例如我的就是localhost:8080/MySSM/selectBook?pageIndex=2 。。。其实分页查询不难,只是可能代码稍微多了一点,有的时候看的会晕,但是它总归离不开 总页数、总记录数、每页记录数 这些东西。。总之要想吃透它那就好好看代码,然后看看数据库的书,要只是想直接拿过来用就好好多看两下代码就好了。。
