欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IbatiS OR 映射

程序员文章站 2022-04-20 11:09:42
...

相对Hibernate 等ORM 实现而言,ibatis的映射配置更为简洁直接,下面是一

个典型的配置文件。

<!DOCTYPE sqlMap  PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"

"http://www.ibatis.com/dtd/sql-map-2.dtd">

       <sqlMap namespace="User">

              <!--模块配置-->

              <typeAlias alias="user" type="com.ibatis.sample.User"/>

              <cacheModel id="userCache" type="LRU">

              <flushInterval hours="24"/>

              <flushOnExecute statement=" updateUser"/>

              <property name="size" value="1000" />

         </cacheModel>

 

        <!—Statement配置-->

        <select id="getUser"     parameterClass="java.lang.String"   resultClass="user"

            cacheModel="userCache"

         >

 

         <![CDATA[

            select   name,  sex   from    t_user     where name = #name#

         ]]>

        </select>

 

 

        <update id="updateUser"    parameterClass="user">

            UPDATE t_user

                  SET

                    name=#name#,

                    sex=#sex#

                 WHERE id = #id#

            </update>

</sqlMap>

 

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

 

模块配置包括:

typeAlias节点:定义了本映射文件中的别名,以避免过长变量值的反复书写,此例中通过

typeAlias节点为类"com.ibatis.sample.User"定义了一个别名"user",这样在本配置文件的其他部分,需要引用"com.ibatis.sample.User"类时,只需以其别名替代即可。

 

cacheModel节点    定义了本映射文件中使用的Cache机制:

<cacheModel id="userCache" type="LRU">

          <flushInterval hours="24"/>

          <flushOnExecute statement="updateUser"/>

          <property name="size" value="1000" />

</cacheModel>

这里申明了一个名为"userCache"的cacheModel,之后可以在Statement申明中对其进行引用:

 

 

<select id="getUser"    parameterClass="java.lang.String"    resultClass="user"

      cacheModel="userCache"

>

这表明对通过id为"getUser"的Select statement获取的数据,使用cacheModel "userCache"进行缓存。之后如果程序再次用此Statement进行数据查询,即直接从缓存中读取查询结果,而无需再去数据库查询。

 

 

cacheModel主要有下面几个配置点:

l flushInterval :设定缓存有效期,如果超过此设定值,则将此CacheModel的缓存清空。

l size:   本CacheModel中最大容纳的数据对象数量。

l flushOnExecute:   指定执行特定Statement时,将缓存清空。如updateUser操作将更新数据库中的用户信息,这将导致缓存中的数据对象与数据库中的实际数据发生偏差,因此必须将缓存清空以避免脏数据的出现。

 

 

Statement配置:

Statement配置包含了数个与SQL Statement相关的节点,分别为:

u statement

u insert

u delete

u update

u select

u procedure

其中,statement最为通用,它可以替代其余的所有节点。除statement之外的节点各自对应了SQL中的同名操作(procedure对应存储过程)。

使用statement 定义所有操作固然可以达成目标,但缺乏直观性,建议在实际开发中根据操作目的,各自选用对应的节点名加以申明。一方面,使得配置文件更加直观,另一方面,也可借助DTD对节点申明进行更有针对性的检查,以避免配置上的失误。

 

各种类型的Statement 配置节点的参数类型基本一致,区别在于数量不同。如insert、update、delete节点无需返回数据类型定义

 

主要的配置项如下:

statement:

 

<statement id="statementName"

    [parameterClass="some.class.Name"]

    [resultClass="some.class.Name"]

    [parameterMap="nameOfParameterMap"]

    [resultMap="nameOfResultMap"]

    [cacheModel="nameOfCache"]

>

    select * from t_user where sex = [?|#propertyName#]

    order by [$simpleDynamic$]

</statement>

 

 

select:

<select id="statementName"

    [parameterClass="some.class.Name"]

    [resultClass="some.class.Name"]

    [parameterMap="nameOfParameterMap"]

    [resultMap="nameOfResultMap"]

    [cacheModel="nameOfCache"]

>

    select * from t_user where sex = [?|#propertyName#]

    order by [$simpleDynamic$]

</select>

 

 

Insert:

<insert id="statementName"

    [parameterClass="some.class.Name"]

    [parameterMap="nameOfParameterMap"]

>

insert into t_user   (name,sex)

values

([?|#propertyName#],[?|#propertyName#])

</insert>

 

 

Update

<update id="statementName"

     [parameterClass="some.class.Name"]

     [parameterMap="nameOfParameterMap"]

>

UPDATE t_user

    SET

        name=[?|#propertyName#],

        sex=[?|#propertyName#]

    WHERE id = [?|#propertyName#]

</update>

 

Delete:

<delete id="statementName"

     [parameterClass="some.class.Name"]

     [parameterMap="nameOfParameterMap"]

>

     delete from t_user     where id = [?|#propertyName#]

</delete>

 

 

其中以“[]”包围的部分为可能出现的配置栏目。

 

parameterClass:参数类。指定了参数的完整类名(包括包路径)。可通过别名避免每次重复书写冗长的类名。

 

resultClass:结果类。指定结果类型的完整类名(包括包路径)可通过别名避免每次重复书写冗长的类名。

 

parameterMap:参数映射,需结合parameterMap节点对映射关系加以定义。

对于存储过程之外的statement而言,建议使用parameterClass作为参数配置方式,一方面避免了参数映射配置工作,另一方面其性能表现也更加出色。

 

cacheModel:statement对应的Cache模块。

 

resultMap:结果映射,需结合resultMap节点对映射关系加以定义。

 

相关标签: IbatiS OR 映射