现在的位置: 首页 > 综合 > 正文

ibatis.net xml配置sql使用一

2013年10月31日 ⁄ 综合 ⁄ 共 4861字 ⁄ 字号 评论关闭

一.   介绍

   平常做企业级应用,需求变化是经常的事,而很多基础代码重复也是很让人头疼的问题。所以很多人会使用一些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>

以上是一些基本使用 如果有不正确 请谅解 并且请指出 谢谢 下章将介绍一些高级的使用方法 两个加起来基本能实现项目所需

 

抱歉!评论已关闭.