iBATIS.NET API基础浅析
创始人
2024-04-19 04:10:18
0

有了对iBATIS.NET配置系统的一些认识后,现在就先来简单了解一下,iBATIS.NET是通过什么的方式去调用映射文件的SQL语句的。这对我们接下来深入了解有很大的帮助。

对于简单的iBatis应用场合来说,我想大部分都是集中在与SqlMapper对象打交道。这个类应该说是一个工具类,因为我们一般都是直接调用这个类的方法去执行QUID操作,但是它却不是真正的去做这些事情。因为iBatis内部有很多的类,对象之间的关系是非常复杂的,如果让客户直接去使用它内部方法,无疑增加了使用的复杂性,同样也会产生很多的冗余代码。因此这里它使用外观设计模式,通过SqlMapper类封装了iBatis执行数据库访问的复杂操作,包括打开一个会话(Session),获取返回IMappedStatement对象实例,执行数据库访问,关闭连接等相关操作。这样我们在使用iBatis API的时候就可以非常简单调用的一个方法,就可以做所有的事情了。比如查询接口public IList QueryForList(string statementName, object parameterObject),它的内部实现代码是这样的。

  1. IList list1;  
  2.       bool flag1 = false;  
  3.       IDalSession session1 = this._sessionHolder.LocalSession;  
  4.       if (session1 == null)  
  5.       {  
  6.             session1 = new SqlMapSession(this.DataSource);  
  7.             session1.OpenConnection();  
  8.             flag1 = true;  
  9.       }  
  10.       IMappedStatement statement1 = this.GetMappedStatement(statementName);  
  11.       try 
  12.       {  
  13.             list1 = statement1.ExecuteQueryForList(session1, parameterObject);  
  14.       }  
  15.       catch 
  16.       {  
  17.             throw;  
  18.       }  
  19.       finally 
  20.       {  
  21.             if (flag1)  
  22.             {  
  23.                   session1.CloseConnection();  
  24.             }  
  25.       }  
  26.       return list1; 

那这些代码如果直接在客户代码中去实现,可想而知工作量会有多大。并且还法保证正确性。

以上简单看了一个SqlMapper的作用,那该怎样实例化这个对象呢?实例化它也是一个非常简单的事情。在iBATIS.NET中,SqlMapper对象默认是一个单件模式的实现。通过Mapper类的静态Instance属性来实例化一个SqlMapper对象。这样的设计可能有一部分是出于性能方面的考虑。因为在初始化SqlMapper对象,需要初始iBatis运行环境配置,读取和初步解析包含的各个映射文件,所以在在系统运行时第一次调用iBATIS.NET API的时候,可能会需要比较长来处理这个配置。Mapper.Instance属性的实现如下:

  1. public static SqlMapper Instance()  
  2. {  
  3.       if (Mapper._mapper == null)  
  4.       {  
  5.             lock (typeof(SqlMapper))  
  6.             {  
  7.                   if (Mapper._mapper == null)  
  8.                   {  
  9.                         Mapper.InitMapper();  
  10.                   }  
  11.             }  
  12.       }  
  13.       return Mapper._mapper;  

所以在使用API的时候可以像下面的这么简单:

  1. Mapper.Instance().Insert("ContentObject_DefaultInsert", p_dataObject); 

当然,如果愿意而且有必要的话,也完全可以由自己来实例化这个对象,我们可以直接使用DomSqlMapBuilder,它为我们提供这样的扩展能力,通过它的多种实例方法都可以返回出SqlMapper对象:Build,Configure,ConfigureAndWatch。在需要用到多个数据库或是多种不同数据库类型的场合下,这种方法是非常有用的。

注意:在使用一个接口时,使用的statementName要在对应类型的statement类型。比如在使用Insert接口时,如果你指定的是一个select类型配置语句的话,那将会抛出异常。因为每一种statement类型都对应一种类型,比如如select 类型的配置语句对应的是SelectMappedStatement类,它是从MappedStatement继承下来,而它的ExcuteInsert方法是这样实现的

  1. public override object ExecuteInsert(IDalSession session, object parameterObject)  
  2. {  
  3.       throw new DataMapperException("Update statements cannot be executed as a query insert.");  

这样就保证了每一种语句类型的职责明确。

iBATIS.NET API基础就向你介绍到这里,希望对你了解iBATIS.NET API基础有所帮助。

【编辑推荐】

  1. iBATIS.NET处理多参数的SQL语句的配置
  2. iBATIS.NET与VS 2005进行单元测试浅析
  3. iBATIS.NET执行存储过程实例详解
  4. iBATIS一对多映射解析
  5. iBATIS的多对多映射配置浅析

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...