1. 程式人生 > >sqlServer分頁儲存過程的呼叫

sqlServer分頁儲存過程的呼叫

現象:
sqlServer的分頁一直相對比較複雜。這裡使用儲存過程實現分頁邏輯

解決辦法
1:action獲取查詢的條件,初始化每頁顯示的大小,page代表當前檢視第幾頁,預設設定為第一頁。rows表示每頁顯示的大小。sort代表查詢按什麼欄位排序 如果要按多個欄位就寫:sort=“tcode,name” 中間用,分割
order代表按什麼方式排序,和sort一樣多個使用,分割!word代表查詢的條件可以設定為多個欄位條件查詢!

這裡寫圖片描述

2:action的方法將資訊都傳給service
這裡寫圖片描述
3:在service中處理邏輯
這裡寫圖片描述

這裡pageBean是特殊需要 平時安裝自己的需要處理查詢出來的list就可以
字串else_if 是拼接查詢條件
字串order_by是拼接排序條件
table是表名
fields是查詢的欄位 “”表示查詢所有

4:sql介面的寫法:
這裡寫圖片描述

5:mybatis的sql寫法:注意id為callpageparams的map必須加上
這裡寫圖片描述

6:處理排序的工具方法:

這裡寫圖片描述

這樣就可以實現sqlServer的分頁查詢了

注:分頁儲存過程的建立: 分頁儲存

USE [yh_test]
GO
/****** Object:  StoredProcedure [dbo].[P_Public_select]    Script Date: 03/29/2017 16:38:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[P_Public_select]
      @tblName
SYSNAME , --要分頁顯示的表名 @fldName NVARCHAR(1000) = '' , --以逗號分隔的要顯示的欄位列表,如果不指定,則顯示所有欄位 @pageSize INT = 10 , --每頁的大小(記錄數) @page INT = 1 , --查詢條件 @pageCount INT OUTPUT , --總頁數 @Counts INT OUTPUT , --要顯示的頁碼 @fldSort
NVARCHAR(1000) = '' , --以逗號分隔的排序欄位列表,可以指定在欄位後面指定DESC/ASC -- 排序方法,0為升序,1為降序(如果是多欄位排列Sort指代最後一個排序欄位的排列順序(最後一個排序欄位不加排序標記)--程式傳參如:' SortA Asc,SortB Desc,SortC ') --用於指定排序順序 @strCondition NVARCHAR(1000) = '' ,@ID SYSNAME --用於定位記錄的主鍵(惟一鍵)欄位,只能是單個欄位 AS DECLARE @sql NVARCHAR(max) SET NOCOUNT ON --檢查物件是否有效 IF OBJECT_ID(@tblName) IS NULL BEGIN RAISERROR(N'物件"%s"不存在',1,16,@tblName) RETURN END IF OBJECTPROPERTY(OBJECT_ID(@tblName) , N'IsTable') = 0 AND OBJECTPROPERTY(OBJECT_ID(@tblName) , N'IsView') = 0 AND OBJECTPROPERTY(OBJECT_ID(@tblName) , N'IsTableFunction') = 0 BEGIN RAISERROR(N'"%s"不是表、檢視或者表值函式',1,16,@tblName) RETURN END --分頁欄位檢查 IF ISNULL(@ID , N'') = '' BEGIN RAISERROR(N'分頁處理需要主鍵(或者惟一鍵)',1,16) RETURN END --其他引數檢查及規範 IF ISNULL(@page , 0) < 1 SET @page = 1 IF ISNULL(@PageSize , 0) < 1 SET @PageSize = 15 IF ISNULL(@fldName , N'') = N'' SET @fldName = N'*' IF ISNULL(@fldSort , N'') = N'' SET @fldSort = N' ORDER BY '+ @ID ELSE SET @fldSort = N' ORDER BY ' + LTRIM(@fldSort) IF ISNULL(@strCondition , N'') = N'' SET @strCondition = N'' ELSE SET @strCondition = N' WHERE (1=1 ' + @strCondition + N')' --如果@pageCount為NULL值,則計算總頁數(這樣設計可以只在第一次計算總頁數,以後呼叫時,把總頁數傳回給儲存過程,避免再次計算總頁數,對於不想計算總頁數的處理而言,可以給@pageCount賦值) IF @pageCount IS NULL BEGIN SET @sql = N'SELECT @Counts=COUNT(*)' + N' FROM ' + @tblName + N' ' + @strCondition EXEC sp_executesql @sql ,N'@Counts int OUTPUT' ,@Counts OUTPUT SET @pageCount = ( @Counts + @PageSize - 1 ) / @PageSize END if @page = 1 --第一頁提高效能 begin set @sql = 'select top ' + str(@PageSize) +' '+@fldName+ ' from ' + @tblName + @strCondition + @fldSort end else begin /**//*Execute dynamic query*/ DECLARE @START_ID varchar(50) DECLARE @END_ID varchar(50) SET @START_ID = convert(varchar(50),(@page - 1) * @PageSize + 1) SET @END_ID = convert(varchar(50),@page * @PageSize) set @sql = ' SELECT '+@fldName+ ' FROM (SELECT ROW_NUMBER() OVER('+@fldSort+') AS rownum, '+@fldName+ ' FROM '+@tblName+' ' +@strCondition+') AS D WHERE rownum BETWEEN '+@START_ID+' AND ' +@END_ID +@fldSort END --print @sql EXEC (@sql) ----------------------------------------------以上為sqlservice 分頁儲存過程 ------------------------- 引數 如下 @tblName 需要進行分頁查詢的表名 @fldName 以逗號分隔需要顯示的欄位列表 如果沒有傳入(傳入 "") 則顯示所有欄位(相當於select * from) @pageSize 每頁的大小 @page @pageCount 輸出 總頁數 @Counts 要顯示的頁碼 @fldSort 以逗號分隔的排序欄位列表,可以指定在欄位後面指定DESC/ASC @ID 表的主鍵 ----------------------------------------service呼叫的方法-------------------------------------------- @Override//查詢app使用者登入詳情 public PageBean<AppUserLoginInfo> findUserInfo(int page,int rows,String word,String sort,String order) { //拼接模糊關鍵字查詢條件語句 String else_if=""; if(word!=null && !word.trim().equals("")){ else_if+=" and (tcode like '%"+word+"%' or device like '%"+word+"%'or lastlogin like '%"+word+"%' or ip like '%"+word+"%')"; } //拼接排序條件語句 String order_by=""; order_by = MyUtils.getOrderBy(sort, order); Map<String, Object> parameters=new HashMap<String, Object>(); int pages=0; int counts=0; parameters.put("table", "token"); parameters.put("fields", ""); //欄位 為''表示所有 parameters.put("pageSize", rows); parameters.put("pageIndex", page); parameters.put("pages", pages); parameters.put("total", counts); parameters.put("order_by", order_by); //排序列 parameters.put("else_if", else_if); //條件 parameters.put("primaryKey", "tcode"); //主鍵 List<AppUserLoginInfo> list = appUserDao.findUserInfo(parameters); for(int i=0;i<list.size();i++){ System.out.println(list.get(i).toString()); } PageBean<AppUserLoginInfo> pageBean=new PageBean<AppUserLoginInfo>(); pageBean.setRows(list); pageBean.setPages((Integer)parameters.get("pages")); pageBean.setTotal((Integer)parameters.get("total")); return pageBean; } -----------------------------------------------------action的方法 private int page=1; private int rows=20; public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getRows() { return rows; } public void setRows(int rows) { this.rows = rows; } public String newsListPage(){ return "newsList"; } private String sort="tcode"; private String order="desc"; private String word; public String getSort() { return sort; } public void setSort(String sort) { this.sort = sort; } public String getOrder() { return order; } public void setOrder(String order) { this.order = order; } public String getWord() { return word; } public void setWord(String word) { this.word = word; } //執行app使用者登入資訊查詢 @Test public void AppUserLoginInfoList(){ ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); appUserService = (AppUserService) ac.getBean("AppUserService"); System.out.println("PAGE:"+page+"ROWS:"+rows+"WORD:"+word+"SORT:"+sort+"ORDER"+order); //傳入當前頁 每頁多少行 按sort欄位 order排序 關鍵字是word查詢 PageBean<AppUserLoginInfo> result=appUserService.findUserInfo(page,rows,word,sort,order); logger.debug("查詢app使用者登入詳細資訊"+result.getRows().toString()); } ----------------------------------------dao介面方法------------------------------------------------- List<AppUserLoginInfo> findUserInfo(Map<String, Object> parameters); ----------------------------mappingsql檔案-------------------------------------------------------------- <mapper namespace="com.oig.dao.AppUserDao"> <parameterMap type="java.util.Map" id="callPageParams"> <parameter property="table" jdbcType="NVARCHAR" mode="IN"/> <parameter property="fields" jdbcType="NVARCHAR" mode="IN"/> <parameter property="pageSize" jdbcType="INTEGER" mode="IN"/> <parameter property="pageIndex" jdbcType="INTEGER" mode="IN"/> <parameter property="pages" jdbcType="INTEGER" mode="OUT"/> <parameter property="total" jdbcType="INTEGER" mode="OUT"/> <parameter property="order_by" jdbcType="NVARCHAR" mode="IN"/> <parameter property="else_if" jdbcType="NVARCHAR" mode="IN"/> <parameter property="primaryKey" jdbcType="NVARCHAR" mode="IN"/> </parameterMap> <select id="findUserInfo" parameterMap="callPageParams" resultType="com.oig.bean.AppUserLoginInfo" statementType="CALLABLE"> {call dbo.P_Public_select(?,?,?,?,?,?,?,?,?)} </select> </mapper>