最通用的ibatis.Net使用sql server存储过程返回分页数据的详细例子
ibatis.Net是一个比较简单和灵活的ORM框架,今天我分享一个我的项目中使用sql server通用存储过程来分页的一个例子,用ibatis.Net框架统一返回分页数据为IList<Hashtable>类型。下面是具体的代码步骤,你可以拿来直接用。
1、ibatis.Net配置文件Common.xml
- <?xml version="1.0" encoding="utf-8" ?>
- <sqlMap namespace="Common" xmlns="http://ibatis.apache.org/mapping"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
- <alias>
- <typeAlias alias="PageCriteria" type="GM.Model.PageCriteria,GM.Model" />
- </alias>
- <parameterMaps>
- <parameterMap id="PageMap" class="PageCriteria">
- <parameter property="TableName" />
- <parameter property="PrimaryKey"/>
- <parameter property="Fields" />
- <parameter property="Condition" />
- <parameter property="CurrentPage" />
- <parameter property="PageSize" />
- <parameter property="Sort" />
- <parameter property="RecordCount" direction="Output" column="RecordCount"/>
- </parameterMap>
- </parameterMaps>
- <statements>
- <procedure id="GetPageData" parameterMap="PageMap" resultClass="Hashtable" >
- [dbo].[ProcGetPageData]
- </procedure>
- </statements>
- </sqlMap>
2、通用分页存储过程ProcGetPageData
- CREATE PROCEDURE [dbo].[ProcGetPageData]
- ( @TableName VARCHAR(1000), --表名,多表是请使用 tA a inner join tB b On a.AID = b.AID
- @PrimaryKey NVARCHAR(100), --主键,可以带表头 a.AID
- @Fields NVARCHAR(2000) = '*',--读取字段
- @Condition NVARCHAR(3000) = '',--Where条件
- @CurrentPage INT = 1, --开始页码
- @PageSize INT = 10, --页大小
- @Sort NVARCHAR(200) = '', --排序字段
- @RecordCount INT = 0 OUT
- )
- AS
- DECLARE @strWhere VARCHAR(2000)
- DECLARE @strsql NVARCHAR(3900)
- IF @Condition IS NOT NULL AND len(ltrim(rtrim(@Condition)))>0
- BEGIN
- SET @strWhere = ' WHERE ' + @Condition + ' '
- END
- ELSE
- BEGIN
- SET @strWhere = ''
- END
- IF (charindex(ltrim(rtrim(@PrimaryKey)),@Sort)=0)
- BEGIN
- IF(@Sort='')
- SET @Sort = @PrimaryKey + ' DESC '
- ELSE
- SET @Sort = @Sort+ ' , '+@PrimaryKey + ' DESC '
- END
- SET @strsql = 'SELECT @RecordCount = Count(1) FROM ' + @TableName + @strWhere
- EXECUTE sp_executesql @strsql ,N'@RecordCount INT output',@RecordCount OUTPUT
- IF @CurrentPage = 1 --第一页提高性能
- BEGIN
- SET @strsql = 'SELECT TOP ' + str(@PageSize) +' '+@Fields
- + ' FROM ' + @TableName + ' ' + @strWhere + ' ORDER BY '+ @Sort
- END
- ELSE
- BEGIN
- /* 执行动态sql*/
- DECLARE @START_ID NVARCHAR(50)
- DECLARE @END_ID NVARCHAR(50)
- SET @START_ID = CONVERT(NVARCHAR(50),(@CurrentPage - 1) * @PageSize + 1)
- SET @END_ID = CONVERT(NVARCHAR(50),@CurrentPage * @PageSize)
- SET @strsql = ' SELECT *
- FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@Sort+') AS rownum,
- '+@Fields+ '
- FROM '+@TableName + @strWhere +') AS XX
- WHERE rownum BETWEEN '+@START_ID+' AND ' +@END_ID +' ORDER BY XX.rownum ASC'
- END
- EXEC(@strsql)
- RETURN
- GO
这个一个sql server通用存储过程,可以用于任意单表和多表的分页查询。
3、分页相关信息类PageCriteria
- public class PageCriteria
- {
- private string _TableName;
- public string TableName
- {
- get { return _TableName; }
- set { _TableName = value; }
- }
- private string _Fileds = "*";
- public string Fields
- {
- get { return _Fileds; }
- set { _Fileds = value; }
- }
- private string _PrimaryKey = "ID";
- public string PrimaryKey
- {
- get { return _PrimaryKey; }
- set { _PrimaryKey = value; }
- }
- private int _PageSize = 10;
- public int PageSize
- {
- get{return _PageSize;}
- set{_PageSize = value;}
- }
- private int _CurrentPage = 1;
- public int CurrentPage
- {
- get { return _CurrentPage; }
- set { _CurrentPage = value; }
- }
- private string _Sort = string.Empty;
- public string Sort
- {
- get { return _Sort; }
- set { _Sort = value; }
- }
- private string _Condition = string.Empty;
- public string Condition
- {
- get { return _Condition; }
- set { _Condition = value; }
- }
- private int _RecordCount;
- public int RecordCount
- {
- get { return _RecordCount; }
- set { _RecordCount = value; }
- }
- }
这个类主要用于存储表名,页码页大小,记录总数,条件等等相关的信息。
3、调用存储过程方法返回数据
假设我有这样的一个表Person:
- public IList<Hashtable> GetListForPageSummary(PageCriteria criteria)
- {
- criteria.TableName ="Person";
- criteria.PrimaryKey = "Id";
- criteria.Fields = @"*";
- return Mapper.Instance().QueryForList<Hashtable>("GetPageData", criteria);
- }
我这里的例子是在GetListForPageSummary方法里面对criteria进行赋值,你也可以在在外面先赋值好再传给GetListForPageSummary。你也可以根据你的需要对criteria的Condition动态赋值达到组合查询的效果,比如用户如果输入了值就加上条件,反之就不加。还有TableName也可以不止写一个表可以写成“Person a inner join Order b on a.Id=Order.UserID”这样的多个表关联(inner join,left join,right join都可以)查询。
注意:Condition不用再加where关键词了。
文章来源:http://www.lanhusoft.com/Article/97.html