iBATIS.net的OR映射篇

相对于Nhibernate复杂的配置文件实现来说,IBatisnet的映射配置更为简单直接,下面我们就 之前的例子分析一下一个典型的配置文件(Person.xml):
ContractedBlock.gif ExpandedBlockStart.gif Code
<?xml version="1.0" encoding="utf-8" ?>

<sqlMap namespace="Person" xmlns="http://ibatis.apache.org/mapping" 

xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" >

<!—模块配置->

  
<alias>

    
<typeAlias alias="Person" type="IBatisNetDemo.Domain.Person,IBatisNetDemo" />

  
</alias>

    
<cacheModels>

    
<cacheModel id="person-cache" implementation="MEMORY" >

      
<flushInterval hours="24"/>

      
<flushOnExecute  statement="UpdateAccountViaInlineParameters"/>

      
<flushOnExecute  statement="UpdateAccountViaParameterMap"/>

      
<property name="Type" value="Weak"/>

    
</cacheModel>

  
</cacheModels>

  
<resultMaps>

    
<resultMap id="SelectAllResult" class="Person">

      
<result property="Id" column="PER_ID" />

      
<result property="FirstName" column="PER_FIRST_NAME" />

      
<result property="LastName" column="PER_LAST_NAME" />

      
<result property="BirthDate" column="PER_BIRTH_DATE" />

      
<result property="WeightInKilograms" column="PER_WEIGHT_KG" />

      
<result property="HeightInMeters" column="PER_HEIGHT_M" />

    
</resultMap>

  
</resultMaps>


<!—statement配置 ->

  
<statements>

    
<select id="SelectAllPerson" resultMap="SelectAllResult" cacheModel="account-cache">

      select

      PER_ID,

      PER_FIRST_NAME,

      PER_LAST_NAME,

      PER_BIRTH_DATE,

      PER_WEIGHT_KG,

      PER_HEIGHT_M

      from PERSON     

    
</select>

 

    
<select id="SelectByPersonId" resultClass="Person" parameterClass="int">

      select

      PER_ID,

      PER_FIRST_NAME,

      PER_LAST_NAME,

      PER_BIRTH_DATE,

      PER_WEIGHT_KG,

      PER_HEIGHT_M

      from PERSON

      where PER_ID = #value#

     
</select>

    

    
<insert id="InsertPerson"  parameterclass="Person" >

      
<selectKey property="Id" type="post" resultClass="int">

        ${selectKey}

      
</selectKey> 

      insert into Person

      ( PER_FIRST_NAME,

      PER_LAST_NAME,

      PER_BIRTH_DATE,

      PER_WEIGHT_KG,

      PER_HEIGHT_M)

      values

      (#FirstName#,#LastName#,#BirthDate#, #WeightInKilograms#, #HeightInMeters#)

    
</insert>

 

    
<update id="UpdatePerson"

                   parameterclass
="Person">

      
<![CDATA[ update Person set

      PER_FIRST_NAME =#FirstName#,

      PER_LAST_NAME =#LastName#,

      PER_BIRTH_DATE =#BirthDate#,

      PER_WEIGHT_KG=#WeightInKilograms#,

      PER_HEIGHT_M=#HeightInMeters#

      where

      PER_ID = #Id# 
]]>

    
</update>

 

    
<delete id="DeletePerson" parameterclass="Person">

      delete from Person

      where

      PER_ID = #Id#

    
</delete>

 

  
</statements>

</sqlMap>

说明:

可以看到,映射文件主要分为两个部分:模块配置和statement配置

一、模块配置
1、typeAlias节点定义了本映射文件中的别名,以避免过长变量值的反复书写,此例中通过typeAlias节点为类“IBatisNetDemo.Domain.Person”定义了一个别名“Person”,这样在本配置文件中的其他部分,需要引用“IBatisNetDemo.Domain.Person”类时,只需以其别名替代即可。
2、cacheModel节点
定义了本映射文件中使用的Cache机制:

< cacheModel  id ="person-cache"  implementation ="MEMORY"   >
      < flushInterval  hours ="24" />
     
< flushOnExecute   statement ="UpdateAccountViaInlineParameters" />
     
< flushOnExecute   statement ="UpdateAccountViaParameterMap" />
      
< property  name ="Type"  value ="Weak" />
 
</ cacheModel >

CacheModel主要有几个配置节点说明:

ContractedBlock.gif ExpandedBlockStart.gif Code
参数                        描述
 
flushInterval     设定缓存有效期,如果超过此设定值,则将此CacheModel缓存清空
 
CacheSize         当前这个Cachemodel中最大的数据对象数量
 
flushOnExecute    指定执行特定的Statement时,将缓存清空。
                  如UpdatePerson操作将更新数据库中用户信息,
                  这将导致缓存中的数据对象与数据库中的实际数据发生偏差,
                  因此必须将缓存清空以避免脏数据的出现。
 

 这里先声明了一个名为“person-cache”的cacheModel,之后可以在statement声明中对其进行引用:

ContractedBlock.gif ExpandedBlockStart.gif Code
<select id="SelectAllPerson" resultMap="SelectAllResult" cacheModel=" person-cache">
      select
      PER_ID,
      PER_FIRST_NAME,
      PER_LAST_NAME,
      PER_BIRTH_DATE,
      PER_WEIGHT_KG,
      PER_HEIGHT_M
      from PERSON     
 
</select>

这表明对通过id为SelAllPerson的“Select Statement”获取的数据,使用CacheModel “person-cache”进行缓存。之后如果程序再次用此Satement进行数据查询。即直接从缓存中读取数据,而不需再去数据库查询
3、resultMaps节点
resultMaps实现dotnet实体到数据库字段的映射配置:

ContractedBlock.gif ExpandedBlockStart.gif Code
<resultMap id="SelectAllResult" class="Person">

      
<result property="Id" column="PER_ID" />

      
<result property="FirstName" column="PER_FIRST_NAME" />

      
<result property="LastName" column="PER_LAST_NAME" />

      
<result property="BirthDate" column="PER_BIRTH_DATE" />

      
<result property="WeightInKilograms" column="PER_WEIGHT_KG" />

      
<result property="HeightInMeters" column="PER_HEIGHT_M" />

    
</resultMap>

 二、statement配置
1、Statement配置包含了数个与Sql Statement相关的节点,<statement>元素是一个通用的能够包容任意类型sql的元素。我们可以用更多细节的元素。这些细节元素提供更好的错误检查以及一些更多的功能。(例如,一个插入函数能够返回数据库自动生成的key)。以下表格总结了声明类型元素以及他们的特性和属性。


最后要注意,Person.xml的属性是“嵌入的资源”,不少新手在这上面载了跟头,哎,切肤之痛啊。
2、statement类型对应的sql语句
SqlMap的核心概念是Mapped Statement,Mapped Statement可以使用任意的SQL语句,并拥有Parameter Map(输入) 和Result Map(输出)。要想得到合法的输入输出结果,Sql语句显然是Mapped Statement中最重要的部分。开发人员可以使用对于数据库合法的任意SQL语句.只要在dbms上支持,可能使用任意的函数,甚至是多条语句,这个就比较考验开发人员的数据库基础和sql编写功力了。对于已经习惯使用自动生成sql语句的开发框架的程序员来说确实挺费解的。但是sql也是合格程序员的基本要素之一吧,写写更健康。不过呢,本文不会在sql语句和函数上作任何详细的文字说明,因为这个需要不断实践和积累经验,谁写谁知道啊。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值