ibatis.net xml配置sql使用一
一. 介绍
平常做企业级应用,需求变化是经常的事,而很多基础代码重复也是很让人头疼的问题。所以很多人会使用一些ORM框架来增强项目的可维护性、可扩展性。IBatis.Net就是一个比较易用的ORM框架,使用起来较为方便、灵活。IBatis.Net是从Ibatis的Java版本移植过来的.NET版本。iBATIS作为一种独特的Data Mapper,使用SQL映射的方式将对象持久化至关系型数据库。简单的理解就是它将我们在数据访问层实现的C#逻辑代码,变为通过关系数据库与对象的映射,将SQL逻辑放到外部的XML配置文件中,以方便以后的维护。
这个框架有两个主要的组成部分,一个是SQL Maps,另一个是Data Access Objects。Sql Maps是这个框架的核心部分,通过使用Sql Maps你可以显著的节约数据库操作的代码量。SQL Maps使用一个简单的XML文件来实现从实体到SQL statements的映射。使用DAO,封装了对数据的访问,你可以动态配置你的应用程序来访问不同的实体存储机制。隐藏持久性层实现的细节,Data Access Objects允许你通过一个简单接口的来操作数据。
ibatis.net 的sql全部都是配置在xml中的 、
下面就介绍几点基本使用方法 基本上能满足所有的需求
首先让我们来了解下xml基本配置
<!--以下除了写的sql语句 其他的大小写是区分的 -->
<?xml version="1.0" encoding="UTF-8" ?>
<!--引用类的命名空间 - ->
<sqlMap namespace="OtTestCase" xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!---
定义了本映射文件中的别名,以避免过长变量值的反复书写,此例中通过alias节点为类“ZTE.OneTest.Common.Model.OtTestCase”定义了一个别名“Person”,这样在本配置文件中的其他部分,需要引用“IBatisNetDemo.Domain.Person”类时,只需以其别名替代即可。
--->
<!---
ZTE.OneTest.Common.Model为命名空间
--->
<alias>
<typeAlias alias="OtTestCase" type="ZTE.OneTest.Common.Model.OtTestCase,ZTE.OneTest.Common.Model" />
<typeAlias alias="OtTestCaseExpand" type="ZTE.OneTest.Common.Model.OtTestCaseExpand,ZTE.OneTest.Common.Model" />
<typeAlias alias="OtTestCase.Key" type="ZTE.OneTest.Common.Model.OtTestCase+Key,ZTE.OneTest.Common.Model" />
<typeAlias alias="OtConnCaseV_ForTree" type="ZTE.OneTest.Common.Model.OtConnCaseV,ZTE.OneTest.Common.Model" />
</alias>
<!--下面的class="OtTestCase" 引用上面定义了别名的类-->
<!--下面的property="**"代表的是OtTestCase类里面的列名 而column="**"代表sql语句中的参数名称->
<!--结果集的映射类 如果定义的结果集参数个数大于或者小于select语句输出的个数 则会报错-->
<resultMaps>
<!--结果集的映射类OtTestCase-->
<resultMap id="OtTestCase_AllColumns" class="OtTestCase">
<!--nullValue代表空的时候的值 定义了这个就代表该列是varchar-->
<result property="SerialId" nullValue="0" column="SERIAL_ID"
<result property="TestCaseNo" nullValue="" column="TEST_CASE_NO" />
<result property="CreatedDate" nullValue="1900-01-01" column="CREATED_DATE" /> </resultMap>
</resultMaps>
<!--参数集的映射类如果定义的参数集的参数个数大于select语句中使用的个数不会报错 否则会报错 -->
<parameterMaps>
<!--自定义的 参数集的映射类OtTestCase_AllParams-->
<parameterMap id="OtTestCase_AllParams" class="OtTestCase">
<!--数据库中Number类型- size可以不写 写了也没有用 ->
<parameter property="SerialId" column="SERIAL_ID" dbType="Number" size="0" />
<!--数据库中VarChar类型- 大小为400 当实际大于这个值的时候 会被截断 当选择size=0的时候 将实际输出最大 ->
<parameter property="TestCaseName" column="TEST_CASE_NAME" dbType="VarChar" size="400" />
<!--数据库中DateTime类型- size可以不写 写了也没有用 ->
<parameter property="LastUpdatedDate" column="LAST_UPDATED_DATE" dbType="DateTime" size="0" />
</parameterMap>
</parameterMaps>
<!--主要代码开始 sql-->
<statements>
<!--以下使用#是把传入的值当参数用防止脚本攻击 使用$符号则是直接使用不能防脚本攻击 -->
<!--但是如果是是用模糊查询like的话 则使用$ 否则会报错 如:
UPPER(ca.CREATED_BY) like '%' || UPPER(decode('$CreateBy$', '', ca.CREATED_BY, '$CreateBy$')) || '%'-->
<!--定义了查询语句OtTestCase_SelectNew 大小写不影响-->
<select id="OtTestCase_SelectNew" resultMap="OtTestCase_AllColumns" parameterClass="OtTestCase.Key">
select SERIAL_ID,TEST_CASE_NO,CREATED_DATE from OT_TEST_CASE c where c.version_no = (select t.version_no from ot_test_case t where t.SERIAL_ID=#SerialId#) and c.is_latest=1 and rownum=1 order by c.version_id desc
</select>
<!--定义了查询语句OtTestCase_SelectNew -->
<select id="OtTestCase_Select" resultMap="OtTestCase_AllColumns" parameterClass="OtTestCase.Key">
select SERIAL_ID,TEST_CASE_NO,CREATED_DATE from OT_TEST_CASE c where
<!--动态产出select 语句 当 property="SerialId" 及parameterClass="OtTestCase.Key"的属性SerialId!=Null的时候就会动态添加一个where拼接在语句中 -->
<isNotNull prepend="WHERE" property="SerialId">SERIAL_ID=#SerialId#</isNotNull>
<!-- 同理还有 <isNotEmpty prepend="WHERE" property="SerialId">SERIAL_ID=#SerialId#</isNotEmpty> -->
<select>
<!--定义了更新语句 OtTestCase_ReplaceOld 其中Hashtable是ibatis的一个可以自定义属性的类-->
<!--返回resultClass="int"返回的是 影响的行数-->
<update id="OtTestCase_ReplaceOld" parameterClass="Hashtable" resultClass="int">
update OT_TEST_CASE set TEST_ENVIRONMENT=$SerialId$,last_updated_date =sysdate,LAST_UPDATED_BY=#LastUpdatedBy# where TEST_ENVIRONMENT IN (select SERIAL_ID from OT_TEST_ENVIRONMENT where VERSION_NO=$VersionNo$ and BORROW_COPY_STATUS !=1 )
</update>
<!--插入数据-->
<insert id="OtTestCase_Insert" parameterMap="OtTestCase_AllParams" resultClass="int">
<!-- 这个方法获取的是下一个的序列号 -->
<selectKey property="SerialId" type="pre" resultClass="int">
select OT_TEST_CASE_S.nextval as value from dual
</selectKey>
insert into OT_TEST_CASE
(SERIAL_ID,TEST_CASE_NO,CREATED_DATE )
values
(?,?,?)
</insert>
<!--插入数据 参数映射是OtTestCase 而不是上面自定义的参数OtTestCase_AllParams -->
<insert id="OtTestCase_Insert_Import" parameterClass="OtTestCase">
<selectKey property="SerialId" type="pre" resultClass="int">
select OT_TEST_CASE_S.nextval as value from dual
</selectKey>
insert into OT_TEST_CASE
(SERIAL_ID,TEST_CASE_NO,CREATED_DATE)
values
($SerialId$,'$TestCaseNo$','$CreatedDate$')
</insert>
</statements>
以上是一些基本使用 如果有不正确 请谅解 并且请指出 谢谢 下章将介绍一些高级的使用方法 两个加起来基本能实现项目所需