sqlServer分頁儲存過程的呼叫
阿新 • • 發佈:2019-01-06
現象:
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>