iBatis.Net系列(四) iBatisNet API基础

转载 2006年06月19日 11:15:00

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

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

 

IList list1;

      
bool flag1 = false;

      IDalSession session1 
= this._sessionHolder.LocalSession;

      
if (session1 == null)

      {

            session1 
= new SqlMapSession(this.DataSource);

            session1.OpenConnection();

            flag1 
= true;

      }

      IMappedStatement statement1 
= this.GetMappedStatement(statementName);

      
try

      {

            list1 
= statement1.ExecuteQueryForList(session1, parameterObject);

      }

      
catch

      {

            
throw;

      }

      
finally

      {

            
if (flag1)

            {

                  session1.CloseConnection();

            }

      }

      
return list1;

 

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

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

 

public static SqlMapper Instance()

{

      
if (Mapper._mapper == null)

      {

            
lock (typeof(SqlMapper))

            {

                  
if (Mapper._mapper == null)

                  {

                        Mapper.InitMapper();

                  }

            }

      }

      
return Mapper._mapper;

}

 

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

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

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

 

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

public override object ExecuteInsert(IDalSession session, object parameterObject)

{

      
throw new DataMapperException("Update statements cannot be executed as a query insert.");

}

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

iBatis.Net系列(四) iBatisNet API基础

有了对iBatis配置系统的一些认识后,现在就先来简单了解一下,iBatis是通过什么的方式去调用映射文件的SQL语句的。这对我们接下来深入了解有很大的帮助。对于简单的iBatis应用场合来说,我想大...
  • sqlove
  • sqlove
  • 2009年06月22日 22:40
  • 634

跟初学者学习IbatisNet第一篇

写在前面的话:我自己也是一个初学者,写这个专题只是为了对学过知识的巩固,如果有什么不对的地方,欢迎大家指正……………………     第一篇就简单介绍一下什么是IbatisNet,然后写一个简单的De...
  • dyllove98
  • dyllove98
  • 2013年07月27日 20:41
  • 3029

Ibatisnet源码解读(1)--Commons

Ibatis源码解读(1)--Commons 2005-12-8 一.简介     IbatisNet一下简称Ibatis包括DataAccess和DataMapper两部分。整个Solutio...
  • zaocha321
  • zaocha321
  • 2013年02月25日 11:16
  • 747

IbatisNet初学者教程

一、什么是 IbatisNet   :       应该有很多人都听说过Ibatis吧,没错IbatisNet就是Ibatis在.net上的一个移植版本,所以它们俩基本是差不多的。所...
  • hy6688_
  • hy6688_
  • 2014年08月24日 21:04
  • 3800

Ibatisnet的数据库事务相关与总揽

学习和使用Ibatisnet已经有一段时间了,前段时间也有写过一些与iBatis相关的Blog。也答应过一些朋友要比较全面地介绍一下iBatis,分享自己的学习过程和使用经验,记录一些常见且容易出现的...
  • educast
  • educast
  • 2008年09月07日 16:58
  • 2282

IBatis.Net中既有In查询又有其他参数传入,怎么办

1.先扩展一个参数实体:
  • UnOpenMyCode
  • UnOpenMyCode
  • 2014年06月13日 16:00
  • 1760

IBatis.Net中提供了方便的日志处理,可以输出sql语句等调试信息。

常用的有两种: 1、输出到控制台:                                                           ...
  • zzy7075
  • zzy7075
  • 2012年07月08日 15:49
  • 2252

Ibatis.net防止Sql注入(ibatis.net中$$和##的区别)

转载地址:http://my.oschina.net/u/1266143/blog/171015
  • XuWei_XuWei
  • XuWei_XuWei
  • 2014年06月24日 16:02
  • 1077

让iBatisNet同时使用多个数据库

最近作项目,需要使用iBatisNet框架,但是数据库需要同时使用Oracle和Access,在网上查了很多文章都没有相关介绍。经过有一天的摸索(分析源码,测试),终于明白了。 首先,修改dao.co...
  • ocean20
  • ocean20
  • 2009年09月18日 12:41
  • 3673

关于iBatis/iBatis.net中parameterMap使用的一个技巧(亲自实践)

在iBatis中 当用parameterMap作为ibatis映射输入参数时,要在ibatis的配置文件中作相应的声明。 但我们也可以不在ibatis映射文件中作声明,应用方法如下: ibat...
  • bigheadsheep
  • bigheadsheep
  • 2012年07月17日 09:49
  • 2426
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iBatis.Net系列(四) iBatisNet API基础
举报原因:
原因补充:

(最多只允许输入30个字)