IBatisNet基础组件 - 中国WEB开发者网络 (http://www.webasp.net) -- 技术教程 (http://www.webasp.net/article/) --- IBatisNet基础组件 (http://www.webasp.net/article/28/27620.htm) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| -- 作者:未知 -- 发布日期: 2006-05-11 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| DomSqlMapBuilder,其作用是根据配置文件创建SqlMap实例。可以通过这个组件从Stream, Uri, FileInfo, or XmlDocument instance 来读取sqlMap.config文件。
SqlMap是IBatisnet的核心组件,提供数据库操作的基础平台。SqlMap可通过DomSqlMapBuilder创建。
Assembly assembly = Assembly.Load("IBatisNetDemo");
Stream stream = assembly.GetManifestResourceStream("IBatisNetDemo.sqlmap.config");
DomSqlMapBuilder builder = new DomSqlMapBuilder();
sqlMap = builder.Configure( stream );
SqlMap是线程安全的,也就是说,在一个应用中,可以共享一个SqlMap实例。
SqlMap提供了众多数据操作方法,下面是一些常用方法的示例,具体说明文档参见 ibatis net doc,或者ibatisnet的官方开发手册。
SqlMap基本操作示例
例1:数据写入操作(insert、update、delete)
例2:数据查询:
例3:在指定对象中存放查询结果:
例4:执行批量查询(Select)
例5:查询指定范围内的数据(Select)
例6:结合RowDelegate进行查询:
例7:分页查询(Select)
例8:基于Map的批量查询(select)
OR映射
相对于Nhibernate等ORM实现来说,IBatisnet的映射配置更为直接,下面是一个典型的配置文件:
<?xmlversion="1.0"encoding="utf-8" ?>
<sqlMapnamespace="Person"xmlns="http://ibatis.apache.org/mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<!—模块配置à
<alias>
<typeAliasalias="Person"type="IBatisNetDemo.Domain.Person,IBatisNetDemo" />
</alias>
<cacheModels>
<cacheModelid="person-cache"implementation="MEMORY" >
<flushIntervalhours="24"/>
<flushOnExecute statement="UpdateAccountViaInlineParameters"/>
<flushOnExecute statement="UpdateAccountViaParameterMap"/>
<propertyname="Type"value="Weak"/>
</cacheModel>
</cacheModels>
<resultMaps>
<resultMapid="SelectAllResult"class="Person">
<resultproperty="Id"column="PER_ID" />
<resultproperty="FirstName"column="PER_FIRST_NAME" />
<resultproperty="LastName"column="PER_LAST_NAME" />
<resultproperty="BirthDate"column="PER_BIRTH_DATE" />
<resultproperty="WeightInKilograms"column="PER_WEIGHT_KG" />
<resultproperty="HeightInMeters"column="PER_HEIGHT_M" />
</resultMap>
</resultMaps>
<!—statement配置 à
<statements>
<selectid="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>
<selectid="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>
<insertid="InsertPerson" parameterclass="Person" >
<selectKeyproperty="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>
<updateid="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>
<deleteid="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机制:
这里声明了一个名为“person-cache”的cacheModel,之后可以在Statement声明中对其进行引用:
这表明对通过id为SelAllPerson的“Select Statement”获取的数据,使用CacheModel “person-cache”进行缓存。之后如果程序再次用此Satement进行数据查询。即直接从缓存中读取数据,而不需再去数据库查询。
CacheModel主要有几个配置点:
3、resultMaps节点
resultMaps实现dotnet实体到数据库字段的映射配置:
Statement配置:
Statement配置包含了数个与Sql Statement相关的节点,<statement>元素是一个通用的能够包容任意类型sql的元素。我们可以用更多细节的元素。
这些细节元素提供更好的错误检查以及一些更多的功能。(例如,一个插入函数能够返回数据库自动生成的key)。以下表格总结了声明类型元素以及他们的特性和属性。
其中,statement最为通用,它可以代替其余的所有节点。除statement之外的节点对应于SQL中的同名操作(procedure对应存储过程)。使用Statement定义所有操作,缺乏直观性,建议在开发中根据操作目的,各自选用对应的节点名加以说明。一方面,使得配置文件更加直观,另一方面,也可以借助xsd对i节点声明进行更有针对性的检查,以避免配置上的失误。
其中“[ ]”包围的部分为可能出现的配置项,各参数说明见下表。具体的使用方法参见IBatisNet官方文档。
一般而言,对于insert、update、delete、select语句,优先采用parameterClass和resultClass.。paremeterMap使用较少,而ResultMap则大多用于存储过程处理和查询。存储过程相对而言比较封闭(很多情况下需要调用现有的存储过程),其参数名和返回的数据字段命名往往不符合dotnet编程的命名规范)。使用resultMap建立字段名同Dotnet对象的属性之间的映射关系就非常有效。另一方面,由于通过ResultMap指定了字段名和字段类型,ibatisnet无需再通过ado.net来动态获取字段信息,在一定程度上也提升了性能。
下面特别说明一下ibatisnet对Stored Procedures的处理,iBatis数据映射把存储过程当成另外一种声明元素。示例演示了一个基于存储过程的简单数据映射。
示例是调用存储过程swapEmailAddress的时候将会在数据库表的列和两个email地址之间交换数据,参数对象亦同。参数对象仅在属性被设置成INOUT或者OUT的时候才会被修改。否则,他们将不会被修改。当然,不可变得参数对象是不会被修改的,比如string.
.Net中,parameterMap属性是必须的。DBType,参数方向,大小由框架自动发现的。(使用CommandBuilder实现的) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| webasp.net |