问题
在工作中经常会遇到分页查询,我们都知道其实分页查询也很简单,思想都是类似的,不过你见过的分页方法有哪些呢?
详解
一、Easyui的分页查询
1、工具类:
Page.java:
public class Page {
private Integer page;
private Integer rows;
private Integer start;
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public void setStart(Integer start) {
this.start = start;
}
public Integer getRows() {
return rows;
}
public void setRows(Integer rows) {
this.rows = rows;
}
public Integer getStart() {
return (page-1) * rows;
}
}
EasyUIResult.java:
public class EasyUIResult {
private Integer total;
private List<?> rows;
public EasyUIResult(Integer total, List<?> rows) {
super();
this.total = total;
this.rows = rows;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public List<?> getRows() {
return rows;
}
public void setRows(List<?> rows) {
this.rows = rows;
}
}
2、代码使用
UserPage.java:
public class UserPage extends Page {
private String usercode;
public String getUsercode() {
return usercode;
}
public void setUsercode(String usercode) {
this.usercode = usercode;
}
}
UserController.java:
@RequestMapping("/list")
@ResponseBody
public EasyUIResult listAllUser(UserPage userPage){
List<User> list =userService.listAllUser(userPage);
Integer total = userService.findUserCount(userPage);
EasyUIResult result =new EasyUIResult(total, list);
return result;
}
UserServiceImpl.java:
public List<User> listAllUser(UserPage userPage){
return userMapper.findAllUsers(userPage);
}
public Integer findUserCount(UserPage userPage){
return userMapper.findUserCount(userPage);
}
UserMapper.java:
List<User> findAllUsers(UserPage userPage);
Integer findUserCount(UserPage userPage);
UserMapper.xml:
<select >
where usercode like '%${usercode}%'
</if>
limit #{start},#{rows}
</select>
<select >
where usercode like '%${usercode}%'
</if>
</select>
3、总结
easyui的页面什么都不用管,因为他会向后台传递page(pc)、rows(ps),query(url),后台返回total(总页数)和rows(list)
二、url重写(页面上不显示查询条件,拼接在url上)(goods)
1、工具类
PageBean.java:
public class PageBean<T> {
private int pc;//当前页
private int tp;//总页数 TR/PS
private int tr;//总记录数
private int ps;//每页记录数
private String url;//查询条件
private List<T> beanList;//当前页数据
public int getPc() {
return pc;
}
public void setPc(int pc) {
this.pc = pc;
}
public int getTp() {
return tr%ps==0?tr/ps:tr/ps+1;
}
>>>>>>>>>>>>
get、set方法
>>>>>>>>>>>>
}
Expression.java:
public class Expression {
private String name;
private String operator;
private String value;
>>>>>>>>>>>>
get、set方法
>>>>>>>>>>>>
}
PageConstants.java:
public class PageConstants {
public static final int BOOK_PAGE_SIZE=12;
public static final int ORDER_PAGE_SIZE=5;
}
2、使用方法
BookServlet.java:
//单条件查询
public String findByBname(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得当前页
int pc =getPc(request);
//获得每页记录数
int ps = PageConstants.BOOK_PAGE_SIZE;
//获取查询参数
String bname = request.getParameter("bname");
//调用service获取pageBean
PageBean<Book> pageBean = bookService.findByBname(bname, pc, ps);
//获得url
String url =getUrl(request);
pageBean.setUrl(url);
request.setAttribute("pageBean", pageBean);
return"f:/jsps/book/list.jsp";
}
//组合查询
public String findByCombination(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得当前页
int pc =getPc(request);
//获得每页记录数
int ps = PageConstants.BOOK_PAGE_SIZE;
//获取查询参数
Book book =CommonUtils.toBean(request.getParameterMap(), Book.class);
//调用service获取pageBean
PageBean<Book> pageBean = bookService.findByCombination(book, pc, ps);
//获得url
String url =getUrl(request);
pageBean.setUrl(url);
request.setAttribute("pageBean", pageBean);
return"f:/jsps/book/list.jsp";
}
//获得url
private String getUrl(HttpServletRequest request) {
String url = request.getRequestURI()+"?"+request.getQueryString();
int index =url.indexOf("&pc=");
if(index!=-1){
url=url.substring(0, index);
}
return url;
}
//获得pc
private int getPc(HttpServletRequest request) {
int pc =1;
String param =request.getParameter("pc");
if(param!=null&&!param.trim().isEmpty()){
try{
pc = Integer.parseInt(param);
}catch(RuntimeException e){};
}
return pc;
}
BookService.java:
//单条件查询
public PageBean<Book> findByBname(String bname,int pc,int ps){
try {
return bookDao.findByBname(bname, pc, ps);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
//组合查询
public PageBean<Book> findByCombination(Book criteria,int pc,int ps){
try {
return bookDao.findByCombination(criteria, pc, ps);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
BookDao.java
//单条件查询
public PageBean<Book> findByBname(String bnaem,int pc,int ps) throws SQLException{
List<Expression> expressions = new ArrayList<Expression>();
expressions.add(new Expression("bname", "like", "%"+bnaem+"%"));
return findByCriteria(expressions, pc, ps);
}
//组合查询
public PageBean<Book> findByCombination(Book criteria,int pc,int ps) throws SQLException{
List<Expression> exceptions = new ArrayList<Expression>();
exceptions.add(new Expression("bname","like","%"+criteria.getBname()+"%"));
exceptions.add(new Expression("author","like","%"+criteria.getAuthor()+"%"));
exceptions.add(new Expression("press","like","%"+criteria.getPress()+"%"));
return findByCriteria(exceptions, pc, ps);
}
//通用查询
public PageBean<Book> findByCriteria(List<Expression> expressions,int pc,int ps ) throws SQLException{
//拼接语句和参数
StringBuilder wheresql =new StringBuilder(" where 1=1");
List<Object> params = new ArrayList<Object>();
for (Expression expression : expressions) {
wheresql.append(" and "+expression.getName())
.append(" ").append(expression.getOperator()).append(" ");
if(!expression.getOperator().equals("is null")){
wheresql.append("?");
params.add(expression.getValue());
}
}
//总记录数
String sql="select count(*) from t_book"+wheresql;
Number number = (Number)qr.query(sql, new ScalarHandler(),params.toArray());
int tr=number.intValue();
//当前页记录
sql ="select * from t_book"+wheresql+" order by orderBy limit ?,?";
params.add((pc-1)*ps);
params.add(ps);
List<Book> beanList = qr.query(sql, new BeanListHandler<Book>(Book.class),params.toArray());
//创建pagebean
PageBean<Book> pageBean = new PageBean<Book>();
pageBean.setPc(pc);
pageBean.setPs(ps);
pageBean.setTr(tr);
pageBean.setBeanList(beanList);
return pageBean;
}
pager.jsp:
%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<script type="text/javascript">
function _go() {
var pc = $("#pageCode").val();//获取文本框中的当前页码
if(!/^[1-9]\d*$/.test(pc)) {//对当前页码进行整数校验
alert('请输入正确的页码!');
return;
}
if(pc > ${pageBean.tp}) {//判断当前页码是否大于最大页
alert('请输入正确的页码!');
return;
}
location = "${pageBean.url}&pc="+pc;
}
</script>
<div class="divBody">
<div class="divContent">
<%--上一页 --%>
<c:choose>
<c:when test="${pageBean.pc eq 1 }"><span class="spanBtnDisabled">上一页</span></c:when>
<c:otherwise> <a href="${pageBean.url }&pc=${pageBean.pc -1}" class="aBtn bold">上一页</a></c:otherwise>
</c:choose>
<%-- 计算begin和end --%>
<%-- 如果总页数<=6,那么显示所有页码,即begin=1 end=${pb.tp} --%>
<%-- 设置begin=当前页码-2,end=当前页码+3 --%>
<%-- 如果begin<1,那么让begin=1 end=6 --%>
<%-- 如果end>最大页,那么begin=最大页-5 end=最大页 --%>
<%-- 显示页码列表 --%>
<c:choose>
<c:when test="${pageBean.tp <= 6 }">
<c:set var="begin" value="1"/>
<c:set var="end" value="${pageBean.tp }"/>
</c:when>
<c:otherwise>
<c:set var="begin" value="${pageBean.pc-2 }"/>
<c:set var="end" value="${pageBean.pc + 3}"/>
<c:if test="${begin < 1 }">
<c:set var="begin" value="1"/>
<c:set var="end" value="6"/>
</c:if>
<c:if test="${end > pageBean.tp }">
<c:set var="begin" value="${pageBean.tp-5 }"/>
<c:set var="end" value="${pageBean.tp }"/>
</c:if>
</c:otherwise>
</c:choose>
<c:forEach begin="${begin }" end="${end }" var="i">
<c:choose>
<c:when test="${i eq pageBean.pc }">
<span class="spanBtnSelect">${i }</span>
</c:when>
<c:otherwise>
<a href="${pageBean.url }&pc=${i}" class="aBtn">${i }</a>
</c:otherwise>
</c:choose>
</c:forEach>
<%-- 显示点点点 --%>
<span class="spanApostrophe">...</span>
<%--下一页 --%>
<c:choose>
<c:when test="${pageBean.pc eq pageBean.tp }"><span class="spanBtnDisabled">下一页</span></c:when>
<c:otherwise><a href="${pageBean.url }&pc=${pageBean.pc+1}" class="aBtn bold">下一页</a> </c:otherwise>
</c:choose>
<%-- 共N页 到M页 --%>
<span>共${pageBean.tp }页</span>
<span>到</span>
<input type="text" class="inputPageCode" >确定</a>
</div>
</div>
三、表单提交分页(在页面上设置表单和条件进行查询)
1、工具类:
PageHelper.java:
private Integer pageNum = 1;// 当前页数
private Integer pageSize = 10;// 每页显示条数
private Integer maxPageNum;// 总页数
private Integer dataTotal;// 总记录数
private List<?> list;//数据集合
>>>>>>>>>>>>
get、set方法
>>>>>>>>>>>>
public void setDataTotal(Integer dataTotal) {
this.dataTotal = dataTotal;
maxPageNum = (dataTotal + pageSize -1) / pageSize;
}
public Integer getLimitStart(Integer currentPage){
if (currentPage != null) {
this.pageNum = currentPage;
}
return (pageNum-1)*pageSize ;
}
BaseController.java:
略:
BaseService.java:
public abstract class BaseService<T> {
public abstract BaseMapper<T> setBaseMapper();
public int delete(Serializable id){
return this.setBaseMapper().deleteByPrimaryKey(id);
}
public int add(T t){
return this.setBaseMapper().insert(t);
}
public T get(Serializable id){
return this.setBaseMapper().selectByPrimaryKey(id);
}
public int update(T t){
return this.setBaseMapper().updateByPrimaryKey(t);
}
public int getCount(BaseQueryObject bqo){
return this.setBaseMapper().count(bqo);
}
public List<T> list(BaseQueryObject bqo){
return this.setBaseMapper().selectAll(bqo);
}
}
BaseMapper.java:
public interface BaseMapper<T>{
int deleteByPrimaryKey(Serializable id);
int insert(T t);
T selectByPrimaryKey(Serializable id);
int updateByPrimaryKey(T t);
int count(BaseQueryObject bqo);
List<T> selectAll(BaseQueryObject bqo);
}
2、使用方法:
ItemController.java:
@RequestMapping("/item")
@Controller
public class ItemController extends BaseController {
@RequiredLogin
@RequestMapping("/manage/list")
public String list(Integer currentPage, Model model, @ModelAttribute("iqm") ItemQueryModel iqm) {
PageHelper ph = new PageHelper();
iqm.setLimitStart(ph.getLimitStart(currentPage));//设置从哪开始
iqm.setPageSize(ph.getPageSize());//设置每页显示条数
List<Item> list = itemService.list(iqm);
int count = itemService.getCount(iqm);
ph.setDataTotal(count);//总记录数
ph.setList(list);
model.addAttribute("page", ph);
return "manage/item/list";
}
}
ItemService.java:
@Service
public class ItemService extends BaseService<Item>{
@Autowired
private ItemMapper itemMapper;
@Override
public BaseMapper<Item> setBaseMapper() {
return itemMapper;
}
public List<Item> findItemList(Integer category) {
return itemMapper.findItemList(category);
}
}
ItemMapper.java
public interface ItemMapper extends BaseMapper<Item>{
List<Item> findItemList(@Param("category") Integer category);
}
ItemMapper.xml
<resultMap />
</resultMap>
<sql >
id, category, name, introduction, price, unit, num, pic_old_name, pic_new_name, descp,
state, create_time, create_user, modify_time, modify_user, delete_time, delete_user,
del_state
</sql>
<sql >
AND state = #{state}
</if>
</where>
</sql>
<select >
LIMIT #{limitStart},#{pageSize}
</if>
</select>
<select />
</select>
<select />
from item
where id = #{id,jdbcType=INTEGER}
</select>
<delete >
delete from item
where id = #{id,jdbcType=INTEGER}
</delete>
<insert >
insert into item (id, category, name,
introduction, price, unit,
num, pic_old_name, pic_new_name,
descp, state, create_time,
create_user, modify_time, modify_user,
delete_time, delete_user, del_state
)
values (#{id,jdbcType=INTEGER}, #{category,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR},
#{introduction,jdbcType=VARCHAR}, #{price,jdbcType=INTEGER}, #{unit,jdbcType=VARCHAR},
#{num,jdbcType=INTEGER}, #{picOldName,jdbcType=VARCHAR}, #{picNewName,jdbcType=VARCHAR},
#{descp,jdbcType=VARCHAR}, #{state,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP},
#{createUser,jdbcType=INTEGER}, #{modifyTime,jdbcType=TIMESTAMP}, #{modifyUser,jdbcType=INTEGER},
#{deleteTime,jdbcType=TIMESTAMP}, #{deleteUser,jdbcType=INTEGER}, #{delState,jdbcType=INTEGER}
)
</insert>
<update >
update item
set category = #{category,jdbcType=INTEGER},
name = #{name,jdbcType=VARCHAR},
introduction = #{introduction,jdbcType=VARCHAR},
price = #{price,jdbcType=INTEGER},
unit = #{unit,jdbcType=VARCHAR},
num = #{num,jdbcType=INTEGER},
pic_old_name = #{picOldName,jdbcType=VARCHAR},
pic_new_name = #{picNewName,jdbcType=VARCHAR},
descp = #{descp,jdbcType=VARCHAR},
state = #{state,jdbcType=INTEGER},
create_time = #{createTime,jdbcType=TIMESTAMP},
create_user = #{createUser,jdbcType=INTEGER},
modify_time = #{modifyTime,jdbcType=TIMESTAMP},
modify_user = #{modifyUser,jdbcType=INTEGER},
delete_time = #{deleteTime,jdbcType=TIMESTAMP},
delete_user = #{deleteUser,jdbcType=INTEGER},
del_state = #{delState,jdbcType=INTEGER}
where id = #{id,jdbcType=INTEGER}
</update>
<select >暂无数据</td>
</tr>
</c:if>
</tbody>
</table>
-------------------------------------------------------------------------------------------------------------------------------------
<!-- 分页信息-->
<c:if test="${page.list != null && fn:length(page.list) != 0}">
<jsp:include page="../../common/page.jsp" />
</c:if>
四、路径作为参数
1、工具类:
BaseController.java:
public class BaseController {
//分页
public Integer pageNum = 1;
public Integer pageCount = 20;//每页显示条数
public Integer maxPageNum;//总页数
public Integer dataTotal;//总记录数
//设置总条数
protected void setDataTotal(int dataTotal){
this.dataTotal = dataTotal ;
maxPageNum = (dataTotal + pageCount -1) / pageCount;
}
//前5后4的算法
protected int[] getBeginAndEnd(Integer currentPage) {
int[] pagelen=new int[2];
int totalPage = maxPageNum;
int begin = 1;
int end = totalPage == 0 ? 1 : totalPage;//如果最大页码数为0,则end=1,否则end=最大页码数,
if((end - begin) <= 9){
//显示十个页码,不足十个不做处理
}else{
if((currentPage - begin) >= 5){
if((currentPage+4) >= totalPage){
end = totalPage;
begin = end - 9;
}else{
end = currentPage + 4;
begin = currentPage -5;
}
}else{
if((currentPage -5) >= 1){
begin = currentPage - 5;
end = begin + 9;
}else{
begin = 1;
end=begin + 9;
}
}
}
pagelen[0] = begin;
pagelen[1] = end;
return pagelen;
}
}
PageVo.java:
public class PageVO {
private Integer start;//从哪开始
private Integer pageCount;//每页显示条数
private Integer type;//类型
private String q; //为查询扩展一个字段
>>>>>>>>>>>>>>>
set\get
>>>>>>>>>>>>>>>
}
2、如何使用工具
HomeController.java:
@RequestMapping(value="/{type}/page/{currentPage}",method=RequestMethod.GET)
public String findItem(@PathVariable("type") int type,@PathVariable("currentPage")Integer currentPage,Model model){
//分页查询
PageVO pageVO = new PageVO();
pageVO.setStart((currentPage-1)*pageCount);//从哪开始
pageVO.setPageCount(pageCount);//每页显示条数
pageVO.setType(type);//模块类型
List<Home> list = homeService.getAllByHomeType(pageVO);
model.addAttribute("list", list);
model.addAttribute("item", Home.hometypeMap.get(type));
model.addAttribute("modular", "首页");//模块
//分页信息
//设置总数
Integer count = homeService.getCountByType(type);
setDataTotal(count);
int[] arr = getBeginAndEnd(currentPage);//起始页和结束页
int start = arr[0];//起始页
int end = arr[1];//结束页
model.addAttribute("start", start);
model.addAttribute("end", end);
model.addAttribute("type", type);//把type带到页面,为了分页请求
model.addAttribute("currentPage", currentPage);//把当前页带到页面,为了控制样式
return "home/item";
}
@RequestMapping("/search")
public String search(String q,Integer currentPage,Model model){
//分页查询
PageVO pageVO = new PageVO();
if (currentPage == null) {
currentPage = 1;
}
q = (q == null ? "请输入关键字" : q.trim());
pageVO.setStart((currentPage-1)*pageCount);//从哪开始
pageVO.setPageCount(pageCount);//每页显示条数
pageVO.setQ(q);
List<Home> list = homeService.getAllByTitle(pageVO);
model.addAttribute("list", list);
model.addAttribute("q", q);
//分页信息
//设置总数
Integer count = homeService.getCountByTitle(q);
setDataTotal(count);
int[] arr = getBeginAndEnd(currentPage);//起始页和结束页
int start = arr[0];//起始页
int end = arr[1];//结束页
model.addAttribute("start", start);
model.addAttribute("end", end);
model.addAttribute("currentPage", currentPage);//把当前页带到页面,为了控制样式
return "home/query";
}
HomeService.java:
public List<Home> getAllByHomeType(PageVO pageVO) {
return homeMapper.getAllByHomeType(pageVO);
}
public Integer getCountByType(int type) {
return homeMapper.getCountByType(type);
}
public List<Home> getAllByTitle(PageVO pageVO) {
return homeMapper.getAllByTitle(pageVO);
}
public Integer getCountByTitle(String title) {
return homeMapper.getCountByTitle(title);
}
HomeMapper.java:
public interface HomeMapper {
List<Home> getAllByHomeType(PageVO pageVO);
Integer getCountByType(int homeType);
List<Home> getAllByTitle(PageVO pageVO);
Integer getCountByTitle(String title);
}
HomeMaper.xml:
<select >
SELECT COUNT(id) FROM home WHERE homeType = #{homeType} AND delState = 0 ;
</select>
<select >
AND title LIKE concat('%',#{value},'%')
</if>
</where>
</select>