ibatis.Net是一个比较简单和灵活的ORM框架,今天我分享一个我的项目中使用sql server通用存储过程来分页的一个例子,用ibatis.Net框架统一返回分页数据为IList<Hashtable>类型。下面是具体的代码步骤,你可以拿来直接用。

1、ibatis.Net配置文件Common.xml

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <sqlMap namespace="Common" xmlns="http://ibatis.apache.org/mapping"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  4. <alias>
  5. <typeAlias alias="PageCriteria" type="GM.Model.PageCriteria,GM.Model" />
  6. </alias>
  7. <parameterMaps>
  8. <parameterMap id="PageMap" class="PageCriteria">
  9. <parameter property="TableName" />
  10. <parameter property="PrimaryKey"/>
  11. <parameter property="Fields" />
  12. <parameter property="Condition" />
  13. <parameter property="CurrentPage" />
  14. <parameter property="PageSize" />
  15. <parameter property="Sort" />
  16. <parameter property="RecordCount" direction="Output" column="RecordCount"/>
  17. </parameterMap>
  18. </parameterMaps>
  19. <statements>
  20. <procedure id="GetPageData" parameterMap="PageMap" resultClass="Hashtable" >
  21. [dbo].[ProcGetPageData]
  22. </procedure>
  23. </statements>
  24. </sqlMap>

2、通用分页存储过程ProcGetPageData

  1. CREATE PROCEDURE [dbo].[ProcGetPageData]
  2. ( @TableName VARCHAR(1000), --表名,多表是请使用 tA a inner join tB b On a.AID = b.AID
  3. @PrimaryKey NVARCHAR(100), --主键,可以带表头 a.AID
  4. @Fields NVARCHAR(2000) = '*',--读取字段
  5. @Condition NVARCHAR(3000) = '',--Where条件
  6. @CurrentPage INT = 1, --开始页码
  7. @PageSize INT = 10, --页大小
  8. @Sort NVARCHAR(200) = '', --排序字段
  9. @RecordCount INT = 0 OUT
  10. )
  11. AS
  12. DECLARE @strWhere VARCHAR(2000)
  13. DECLARE @strsql NVARCHAR(3900)
  14. IF @Condition IS NOT NULL AND len(ltrim(rtrim(@Condition)))>0
  15. BEGIN
  16. SET @strWhere = ' WHERE ' + @Condition + ' '
  17. END
  18. ELSE
  19. BEGIN
  20. SET @strWhere = ''
  21. END
  22. IF (charindex(ltrim(rtrim(@PrimaryKey)),@Sort)=0)
  23. BEGIN
  24. IF(@Sort='')
  25. SET @Sort = @PrimaryKey + ' DESC '
  26. ELSE
  27. SET @Sort = @Sort+ ' , '+@PrimaryKey + ' DESC '
  28. END
  29. SET @strsql = 'SELECT @RecordCount = Count(1) FROM ' + @TableName + @strWhere
  30. EXECUTE sp_executesql @strsql ,N'@RecordCount INT output',@RecordCount OUTPUT
  31. IF @CurrentPage = 1 --第一页提高性能
  32. BEGIN
  33. SET @strsql = 'SELECT TOP ' + str(@PageSize) +' '+@Fields
  34. + ' FROM ' + @TableName + ' ' + @strWhere + ' ORDER BY '+ @Sort
  35. END
  36. ELSE
  37. BEGIN
  38. /* 执行动态sql*/
  39. DECLARE @START_ID NVARCHAR(50)
  40. DECLARE @END_ID NVARCHAR(50)
  41. SET @START_ID = CONVERT(NVARCHAR(50),(@CurrentPage - 1) * @PageSize + 1)
  42. SET @END_ID = CONVERT(NVARCHAR(50),@CurrentPage * @PageSize)
  43. SET @strsql = ' SELECT *
  44. FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@Sort+') AS rownum,
  45. '+@Fields+ '
  46. FROM '+@TableName + @strWhere +') AS XX
  47. WHERE rownum BETWEEN '+@START_ID+' AND ' +@END_ID +' ORDER BY XX.rownum ASC'
  48. END
  49. EXEC(@strsql)
  50. RETURN
  51. GO
这个一个sql server通用存储过程,可以用于任意单表和多表的分页查询。

3、分页相关信息类PageCriteria

  1. public class PageCriteria
  2. {
  3. private string _TableName;
  4. public string TableName
  5. {
  6. get { return _TableName; }
  7. set { _TableName = value; }
  8. }
  9. private string _Fileds = "*";
  10. public string Fields
  11. {
  12. get { return _Fileds; }
  13. set { _Fileds = value; }
  14. }
  15. private string _PrimaryKey = "ID";
  16. public string PrimaryKey
  17. {
  18. get { return _PrimaryKey; }
  19. set { _PrimaryKey = value; }
  20. }
  21. private int _PageSize = 10;
  22. public int PageSize
  23. {
  24. get{return _PageSize;}
  25. set{_PageSize = value;}
  26. }
  27. private int _CurrentPage = 1;
  28. public int CurrentPage
  29. {
  30. get { return _CurrentPage; }
  31. set { _CurrentPage = value; }
  32. }
  33. private string _Sort = string.Empty;
  34. public string Sort
  35. {
  36. get { return _Sort; }
  37. set { _Sort = value; }
  38. }
  39. private string _Condition = string.Empty;
  40. public string Condition
  41. {
  42. get { return _Condition; }
  43. set { _Condition = value; }
  44. }
  45. private int _RecordCount;
  46. public int RecordCount
  47. {
  48. get { return _RecordCount; }
  49. set { _RecordCount = value; }
  50. }
  51. }
 
这个类主要用于存储表名,页码页大小,记录总数,条件等等相关的信息。

3、调用存储过程方法返回数据

假设我有这样的一个表Person:
 

  1. public IList<Hashtable> GetListForPageSummary(PageCriteria criteria)
  2. {
  3. criteria.TableName ="Person";
  4. criteria.PrimaryKey = "Id";
  5. criteria.Fields = @"*";
  6. return Mapper.Instance().QueryForList<Hashtable>("GetPageData", criteria);
  7. }
我这里的例子是在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

最通用的ibatis.Net使用sql server存储过程返回分页数据的详细例子的更多相关文章

  1. Sql Server 存储过程中查询数据无法使用 Union(All)

    原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...

  2. sql server中的分页数据查询

    1.引言 今天在工作中遇到一个需要进行sql server分页数据查询的问题,但是分页数据查询的sql却忘记了,最终通过查询资料解决了该问题.现在把解决方法记下,以备查阅. 在这里需要感谢博客园的Ql ...

  3. SQL Server 存储过程进行分页查询

    CREATE PROCEDURE prcPageResult -- 获得某一页的数据 -- @currPage INT = 1 , --当前页页码 (即Top currPage) @showColum ...

  4. sql server存储过程返回数据只有一个字符

    SqlParameter[] param = { new SqlParameter("@shopId",shopId), new SqlParameter("@newSh ...

  5. 一条sql 执行查询列表 返回分页数据以及总数 totalCount

    SELECT ID,Name,Age,Addr,Tel,COUNT(1) OVER() AS totalFROM dbo.Student WHERE Age>22 ORDER BY id DES ...

  6. 恢复SQL Server被误删除的数据(再扩展)

    恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是文章里的存储过程不能实现对备份出来的日志备份里所删数据的 ...

  7. 恢复SQL Server被误删除的数据

    恢复SQL Server被误删除的数据 <恢复SQL Server被误删除的数据(再扩展)> 地址:http://www.cnblogs.com/lyhabc/p/4620764.html ...

  8. 初识 Sql Server存储过程

    开篇语 之前的公司并未使用存储过程来做项目,所以小生对存储过程的调用.使用也是一知半解,刚好这家公司就大量用到了存储过程 这次做的功能,为了保持风格一致,也是需要使用存储过程来实现动态sql和数据分页 ...

  9. sql server存储过程中SELECT 与 SET 对变量赋值的区别

    SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT. 对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们 并没有注意,其实这 ...

随机推荐

  1. 功能强大的HTML

    HTML基本标签(一) 1.什么是HTML html:Hyper TextMakeup language:超文本标记语言 html:网页的“源码” 浏览器:“解释和执行”html源码的工具 2.网页的 ...

  2. 重点block

    //  main.m //  block探索 // //  Created by 殷婷婷 on 15-6-6. //  Copyright (c) 2015年 lanou. All rights re ...

  3. Android性能优化典范---转

    Android性能优化典范 原文链接:  http://hukai.me/android-performance-patterns/ JAN 17TH, 2015 | COMMENTS 2015新年伊 ...

  4. gdb 远程调试android进程 -转

    什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停 ...

  5. DRAM Memory Rank知识

    DRAM的一些知识点,先记录下来再进行整理 1.何为Memory rank? A memory rank is a set of DRAM chips connected to the same ch ...

  6. 高橋君とカード / Tak and Cards

    高橋君とカード / Tak and Cards Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB Score : 300 p ...

  7. NGUI具有流光效果的UISprite

    之前做过一个流光效果(http://www.cnblogs.com/jietian331/p/4748644.html). 现将其改进一下,与NGUI结合起来,提供一个具有流光效果的组件:UIWalk ...

  8. Mysql(集群)业务水平切割 垂直切割(Amoeba)

     Amoeba原理戳这里:Amoeba详细介绍 需要根据企业 数据业务进行切割,垂直切割又称为纵向切割. 垂直切割通说的说就是有多个表,对表进行分离(用户数据.博客文章数据.照片数据.标签数据类型.群 ...

  9. Is it possible to run native sql with entity framework?

    For .NET Framework version 4 and above: use ObjectContext.ExecuteStoreCommand() if your query return ...

  10. NOIP2016DAY1题解

    https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=33%2C83 T1:玩具谜题 题解: 沙茶模拟 #includ ...