(原创)sqlServer2005 通用分页存储过程(支持多表联合查询)及如何使用ibatis调用该存储过程的方法

April 7, 2010 | tags    | views
Comments 0

-- =============================================
-- Author:  gong.wy
-- Create date: 2010.04.07
-- Description: SqlServer2005通用分页方法
-- =============================================

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

CREATE  procedure [dbo].[sp_CommonPager]
(
--1,参数的括号可要可不要,有默认值的参数,在调用的时候,可以不写出来
--2,调用:
--declare @i int
--exec sp_CommonPager 'list','id,title','id',3,4,1,'classid=6',@i out
@tblName      varchar(100),       -- 表名
@fldCow   varchar(300)='*',   -- 要查询的列
@fldName      varchar(255),       -- 排序列
@PageSize     int = 10,           -- 页尺寸
@PageIndex    int = 1,            -- 页码
@OrderType    int = 1,            -- 设置排序类型, 1则降序
@strWhere     varchar(200) = '',  -- 查询条件 (注意: 不要加 where)
@count varchar(10)  output      --输出符合条件的记录的总数
)
AS

declare @strSQL   varchar(1000);       -- 主语句
declare @strOrder varchar(500)  ;      -- 排序类型
declare @strTmp   varchar(100) ;   --临时变量
declare @endIndex int;      -- 结束的索引
declare @startIndex int;     -- 开始的索引
declare @countSql nvarchar(500);    --查询记录总数的SQL

--得到索引
set @startIndex=(@PageIndex-1)*@PageSize + 1;--注意,这里要加1
set @endIndex=@PageIndex*@PageSize;

--生成排序语句
--为了多表联合查询,这里要把表名字和排序字段的[]去掉-
if @OrderType != 0
set @strOrder = ' order by ' + @fldName + ' desc'
else
set @strOrder = ' order by ' + @fldName + ' asc'


set @strSQL = '(select top ' + ltrim(str(@endIndex)) +' '+@fldCow+','
+ 'row_number() over ('+ @strOrder +') as rownumber from '
+ @tblName + '' ;

set @countSql= 'select @count=count('+@fldName+') from '+ @tblName ;
 
if @strWhere! = ''
begin
set @strSQL =@strSQL+ ' where ('+ @strWhere + ') ';
set @countSql=@countSql + ' where ('+ @strWhere + ') ';
end
set @strSQL =@strSQL+ ') as tblTmp'

--得到记录总数
set @countSql=N'select @count=count(*)  from ' + @tblName;
if @strWhere! = ''
set @countSql=@countSql+ N' where ' + @strWhere;
EXEC sp_executesql @countSql,N'@count varchar(20) out',@count out

set @strSQL = 'select * from ' + @strSQL + ' where rownumber between ' + ltrim(str(@startIndex)) + ' and '
+ ltrim(str(@endIndex));
--执行主语句
set nocount on -- 防止显示有关受影响的行数的信息
exec (@strSQL)

--print @strSQL
 


ibatis调用该存储过程的方法
  sqlMap.xml
<!-- ===============通用分页存储过程=============== -->
    <!-- parameterMap -->
    <parameterMap class="map" id="sp_commonPager_parMap">
        <parameter property="tblName"  javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/>
        <parameter property="fldCow"  javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/>
        <parameter property="fldName"  javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/>
        <parameter property="PageSize"  javaType="java.lang.Integer" jdbcType="INT" mode="IN"/>
        <parameter property="PageIndex"  javaType="java.lang.Integer" jdbcType="INT" mode="IN"/>
        <parameter property="OrderType"  javaType="java.lang.Integer" jdbcType="INT" mode="IN"/>
        <parameter property="strWhere"  javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/>
        <parameter property="count"  javaType="java.lang.String" jdbcType="VARCHAR" mode="OUT"/>
    </parameterMap>
   
    <!-- procedure -->
    <procedure id="sp_commonPager" parameterMap="sp_commonPager_parMap" resultMap='UserResult' resultClass="com.gong.struts.domain.User">
        <![CDATA[ {call sp_CommonPager(?,?,?,?,?,?,?,?)} ]]>
    </procedure>
<!-- ===============通用分页存储过程=============== -->
DAO.java
    public List query(){
        HashMap<String,Object> paramMap = new HashMap<String,Object>();  
        paramMap.put("tblName", "users as u,users_class as uc");  
        paramMap.put("fldCow", "u.id,uc.username,u.password");
        paramMap.put("fldName", "u.id");
        paramMap.put("PageSize", 20);
        paramMap.put("PageIndex", 1);
        paramMap.put("OrderType", 0);
        paramMap.put("strWhere", "u.username=uc.username");
        paramMap.put("count", new String());
       
        List li=this.getSqlMapClientTemplate().queryForList("sp_commonPager", paramMap);
        System.out.println((String)paramMap.get("count"));
        return li;
    }



文章本月排行 文章本年排行
   



发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。