1. 程式人生 > >SSM框架實現分頁查詢

SSM框架實現分頁查詢

BookDaoMapper.java

/**
	 * 根據多條件(圖書分類,圖書名稱,是否借閱)動態查詢圖書資訊
	 * 
	 * @param bookType
	 *            圖書分類
	 * @param bookName
	 *            圖書名稱
	 * @param isBorrow
	 *            是否借閱
	 * @param startQuery
	 *            從第幾條開始查詢
	 * @param pageSize
	 *            每頁顯示的數量
	 * @return
	 */
	List<Book_info> findBookByConditions(
			@Param("bookType") Integer bookType,
			@Param("bookName") String bookName,
			@Param("isBorrow") Integer isBorrow,
			@Param("startQuery") Integer startQuery,
			@Param("pageSize") Integer pageSize);
/**
	 * 根據多條件(圖書分類,圖書名稱,是否借閱)動態查詢圖書資訊條數
	 * 
	 * @param bookType
	 *            圖書分類
	 * @param bookName
	 *            圖書名稱
	 * @param isBorrow
	 *            是否借閱
	 * @return
	 */
	Integer findCountByConditions(@Param("bookType") Integer bookType,
			@Param("bookName") String bookName,
			@Param("isBorrow") Integer isBorrow);

BookDaoMapper.xml

<!-- 介面的全路徑名 -->
<mapper namespace="com.bookssys.dao.BookDaoMapper">
    <!-- 1對多的時候用collection,多對1用association -->
	<resultMap type="Book_info" id="BookInfoBookType">
<!-- 主表的主鍵列 property表示實體類中的屬性名 column表示對應列的別名 -->
		<id property="book_id" column="bookid" />
<!-- sql語句中查找出來的資料,如果sql語句中有別名則column填的是別名,property表示實體類中的屬性名 -->
		<result property="book_code" column="bookcode" />
		<result property="book_name" column="bookname" />
		<result property="book_author" column="bookauthor" />
		<result property="publish_press" column="publishpress" />
		<result property="is_borrow" column="isborrow" />
        <!-- 主表寫在association中 -->
		<association property="bookType" javaType="Book_type"> 
			<id property="id" column="typeid" />
			<result property="type_name" column="typename" />
		</association>
	</resultMap>
	<!-- id必須和方法名保持一致 select中的 resultMap必須和 resultMap中的id一致,表示呼叫這個名字的resultMap 
		或者是選取實體類的全路徑 -->

	<!-- 根據多條件(圖書分類,圖書名稱,是否借閱)動態查詢圖書資訊 -->
	<select id="findBookByConditions" resultMap="BookInfoBookType">
		SELECT
		bi.book_id AS bookid,
		bt.id AS typeid,
		bi.book_code AS bookcode,
		bt.type_name AS typename,
		bi.book_name AS bookname,
		bi.book_author AS bookauthor,
		bi.publish_press AS publishpress,
		bi.is_borrow AS isborrow
		FROM
		book_info AS bi,
		book_type AS bt
		
		<!-- 使用if+trim實現多條件查詢P78  示例在P79頁 -->
		<trim prefix="WHERE" prefixOverrides="and|or">
			bi.book_type=bt.id
			<if test="bookType !=null and bookType>0"> <!-- test中的bookType是Dao中方法中的註解 0是index.jsp中的圖書型別中的(請選擇) -->
				AND bt.id=#{bookType}
			</if>
			<if test="bookName!=null and bookName!=''">
				AND bi.book_name LIKE  CONCAT('%',#{bookName},'%')
			</if>			
			<if test="isBorrow!=null and isBorrow!=-1">
				AND bi.is_borrow=#{isBorrow}
			</if>
		</trim>
		limit #{startQuery},#{pageSize}
	</select>
	
	<!-- 根據多條件(圖書分類,圖書名稱,是否借閱)動態查詢圖書資訊條數 -->
	<select id="findCountByConditions" resultType="int"><!-- resultType返回型別是Integer型別,直接寫int或java.lang.Integer -->
		SELECT
			COUNT(bi.book_id)
		FROM
		book_info AS bi,
		book_type AS bt
		
		<!-- 使用if+trim實現多條件查詢P78  示例在P79頁 -->
		<trim prefix="WHERE" prefixOverrides="and|or">
			bi.book_type=bt.id
			<if test="bookType !=null and bookType>0"> <!-- test中的bookType是Dao中方法中的註解 0是index.jsp中的圖書型別中的(請選擇) -->
				AND bt.id=#{bookType}
			</if>
			<if test="bookName!=null and bookName!=''">
				AND bi.book_name LIKE  CONCAT('%',#{bookName},'%')
			</if>			
			<if test="isBorrow!=null and isBorrow!=-1">
				AND bi.is_borrow=#{isBorrow}
			</if>
		</trim>
	</select>
</mapper>

 PageUtil.java

package com.bookssys.util;

/**
 * 分頁工具類
 * 
 * @author Administrator
 * 
 */
public class PageUtil {
	/**
	 * 計算總頁數的公共方法
	 * 
	 * @param totalSize
	 *            資訊總條數
	 * @param pageSize
	 *            每頁條數
	 * @return
	 */
	public static final Integer calTotalPage(Integer totalSize, Integer pageSize) {
		int totalPage = 1;
		// 計算總頁數
		totalPage = (totalSize % pageSize == 0) ? (totalSize / pageSize)
				: (totalSize / pageSize + 1);
		return totalPage;
	}

	/**
	 * 頁碼控制方法
	 * 
	 * @param pageIndex
	 *            當前頁數
	 * @param totalPage
	 *            總的頁數
	 * @return
	 */
	public static final Integer checkPageIndex(Integer pageIndex,
			Integer totalPage) {
		// 頁碼控制
		if (pageIndex < 1) {// 當前頁數不能小於最小頁數
			pageIndex = 1;
		} else if (pageIndex > totalPage) { // 當前頁數不能大於最大頁數
			pageIndex = totalPage;
		}
		return pageIndex;
	}
}

 BookController.java

package com.bookssys.controller;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.bookssys.biz.BookBiz;
import com.bookssys.entity.Book;
import com.bookssys.biz.BookTypeBiz;
import com.bookssys.entity.BookType;
import com.bookssys.util.PageUtil;

@Controller
public class BookController {
	
	/*注入業務*/
	@Resource
	private BookBiz bookBiz;
	/*每定義一個biz都要重新注入一個業務*/
	@Resource
	private BookTypeBiz bookTypeBiz;
	
	private final Integer pageSize=5;/*每頁顯示5條資料*/

	/**
	 * 根據多條件動態查詢圖書資訊
	 * 
	 * @param bookType
	 *            圖書分類
	 * @param bookName
	 *            圖書名稱
	 * @param isBorrow
	 *            是否借閱
	 * @param model
	 * @return
	 */

	/* 一個控制器 */
	@RequestMapping(value = "findBookByConditions.html")
	public String findBookinfoByConditions(
			// @RequestParam(required = false)表示這不是必填項,可以為空,不傳引數過來
			@RequestParam(required = false) Integer bookType,
			@RequestParam(required = false,defaultValue="") String bookName,/*defaultValue=""給定一個預設值,預設為空,要不然會報錯*/
			@RequestParam(required = false) Integer isBorrow, 
			@RequestParam(required = false,defaultValue="1") Integer pageIndex,//可以不傳第幾頁,不傳第幾頁的時候預設顯示第一頁
			Model model) {
		
		//轉換編碼  查詢之前要先轉換編碼
		try {
			bookName=new String(bookName.getBytes("iso-8859-1"),"utf-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//查詢符合條件資訊的總條數
		int totalSize=bookBiz.findCountByConditions(bookType, bookName, isBorrow);
		int totalPage=0;//總頁數
		
		//此陣列用於顯示具體頁數,便於使用者跳轉
		int[] pageArray=null;
		if (totalSize>0) {//在總條數大於0的條件下才進行分頁
			//計算總頁數  呼叫公共類的計算方法
			totalPage=PageUtil.calTotalPage(totalSize, pageSize);
			
			//頁碼控制  呼叫公共類的
			pageIndex=PageUtil.checkPageIndex(pageIndex, totalPage);				
				
			/*獲得所有圖書資訊並儲存  分頁顯示*/
			List<Book> infoList = bookBiz.findBookinfoByConditions(
					bookType, bookName, isBorrow,(pageIndex-1)*pageSize,pageSize);
			model.addAttribute("infoList", infoList);
					
			pageArray=new int[totalPage];//定義陣列的長度和總頁數一樣
		
		}
			/*獲得圖書的所有型別並儲存*/
			List<Book_type> typeList=bookTypeBiz.findAllBookType();
			model.addAttribute("typeList", typeList);
			model.addAttribute("bookName", bookName);
			model.addAttribute("bookType", bookType);
			model.addAttribute("isBorrow", isBorrow);		
			model.addAttribute("pageIndex", pageIndex);
			model.addAttribute("pageArray", pageArray);
		return "index";
	}
	
}

 WEB-INF/jsp/index.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>圖書資訊</title>
</head>
<body>
	<%
		String path = request.getContextPath() + "/";
	%>
	<form action="sec/findBookByConditions.html">
		圖書分類:<select name="bookType">
			<!-- name中的bookType必須要和控制器Controller中的條件一致 -->
			<option value="0">---請選擇---</option>
			<c:forEach items="${typeList }" var="type">
				<option value="${type.id }"
					<c:if test="${type.id==bookType }"><!-- 回顯選中的圖書型別:當前圖書分類等於控制器中儲存的圖書型別的時候,顯示當前選中的圖書型別 -->
								selected="selected"
							</c:if>>${type.type_name
					}</option>
			</c:forEach>
		</select> 圖書名稱:<input type="text" name="bookName" value="${bookName }" />
		<!-- 資料回顯 -->
		是否借閱:<select name="isBorrow">
			<option value="-1">---請選擇---</option>
			<option value="0"
				<c:if test="${isBorrow==0 }">
								selected="selected"
						</c:if>>可以借閱</option>
			<option value="1"
				<c:if test="${isBorrow==1 }">
								selected="selected"
						</c:if>>已借閱</option>
		</select> <input type="submit" value="查詢" />
	</form>
	<table border="1" width="660px">
		<tr>
			<td>圖書編號</td>
			<td>圖書分類</td>
			<td>圖書名稱</td>
			<td>作者</td>
			<td>出版社</td>
			<td>操作</td>
		</tr>
		<c:forEach items="${infoList }" var="info">
			<tr>
				<td>${info.book_code }</td>
				<td>${info.bookType.type_name }</td>
				<!-- bookType是實體類中的物件 -->
				<td>${info.book_name }</td>
				<td>${info.book_author }</td>
				<td>${info.publish_press }</td>
				<td><c:if test="${info.is_borrow==0 }">
						<a href="javascript:void(0)" class="borrowStatus"
							book_id="${info.book_id }">申請借閱</a>
					</c:if> <c:if test="${info.is_borrow==1 }">
						<span>已借閱</span>
					</c:if></td>
			</tr>
		</c:forEach>
	</table>
	<div>
		<!-- 在帶條件的前提下查詢到相應資訊點選上一頁或下一頁則顯示對應資訊而不是顯示全部圖書的上一頁或下一頁資訊 -->
		<%-- 攔截器點選上一頁或者下一頁時,地址不會重複出現/sec的方法:1.在/sec前加${pageContext.request.contextPath } --%>
		<a
			href="${pageContext.request.contextPath }/findBookByConditions.html?pageIndex=${pageIndex-1 }
		&bookType=${bookType}&bookName=${bookName}&isBorrow=${isBorrow}">上一頁</a>&nbsp;
		<!-- 遍歷顯示頁數 -->
		<c:forEach items="${pageArray }" varStatus="i">
			<a
				href="${pageContext.request.contextPath }/findBookByConditions.html?pageIndex=${i.index+1 }
		&bookType=${bookType}&bookName=${bookName}&isBorrow=${isBorrow}">${i.index+1
				}</a>&nbsp;
		</c:forEach>
		<a
			href="${pageContext.request.contextPath }/findBookByConditions.html?pageIndex=${pageIndex+1 }
		&bookType=${bookType}&bookName=${bookName}&isBorrow=${isBorrow}">下一頁</a>
	</div>
	<script type="text/javascript" src="statics/js/jquery-1.8.3.js"></script>
</body>
</html>