ibatis OR映射(第一弹)

在《入门第一弹》中有一个or映射的配置文件,现在就来具体的讲讲配置文件,一下为一典型的配置文件。
Title<!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机制:
Cache<cacheModel id="userCache" type="LRU">
<flushInterval hours="24"/>
<flushOnExecute statement="updateUser"/>
<property name="size" value="1000" />
</cacheModel>
这里申明了一个名为"userCache"的cacheModel,之后可以在Statement申明中对其进行引用:
Title<select id="getUser"
parameterClass="java.lang.String"
resultClass="user"
cacheModel="userCache"
>这表明对通过id为"getUser"的Select statement获取的数据,使用cacheModel "userCache"进行缓存。之后如果程序再次用此Statement进行数据查询,即直接从缓存中读取查询结果,而无需再去数据库查询。
cacheModel主要有下面几个配置点:
 flushInterval :
设定缓存有效期,如果超过此设定值,则将此CacheModel的缓存清空。
 size:
本CacheModel中最大容纳的数据对象数量。
 flushOnExecute:
指定执行特定Statement时,将缓存清空。如updateUser操作将更新数据库中的用户信息,这将导致缓存中的数据对象与数据库中的实际数据发生偏差,因此必须将缓存清空以避免脏数据的出现。

Statement配置:
Statement配置包含了数个与SQL Statement相关的节点,分别为:
 statement
 insert
 delete
 update
 select
 procedure
其中,statement最为通用,它可以替代其余的所有节点。除statement之外的节点各自对应了SQL中的同名操作(procedure对应存储过程)。
使用statement 定义所有操作固然可以达成目标,但缺乏直观性,建议在实际开发中根据操作目的,各自选用对应的节点名加以申明。一方面,使得配置文件更加直观,另一方面,也可借助DTD对节点申明进行更有针对性的检查,以避免
配置上的失误。
各种类型的Statement 配置节点的参数类型基本一致,区别在于数量不同。如insert、update、delete节点无需返回数据类型定义(总是int)。
主要的配置项如下:
statement:
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<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<insert id="statementName"
[parameterClass="some.class.Name"]
[parameterMap="nameOfParameterMap"]
>
insert into t_user
(name,sex)
values
([?|#propertyName#],[?|#propertyName#])
</insert>
其中以“[]”包围的部分为可能出现的配置栏目。
 

参数

描述

parameterClass

参数类。指定了参数的完整类名(包括包路径)。

可通过别名避免每次重复书写冗长的类名。

resultClass

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

parameterMap

参数映射,需结合parameterMap节点对映射

关系加以定义。

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

resultMap

结果映射,需结合resultMap节点对映射关系

加以定义。

cacheModel

statement对应的Cache模块。


对于参数定义而言,尽量使用parameterClass,即直接将POJO 作为statement 的调用参数,这样在SQL 中可以直接将POJO 的属性作为参数加以设定,如:
Title<update id="updateUser"
parameterClass="com.ibatis.sample.User">
UPDATE t_user
SET
name=#name#,
sex=#sex#
WHERE id = #id#
</update>这里将com.ibatis.sample.User类设定为update statement的参数,之后,我们即可在SQL 中通过#propertyName#对POJO 的属性进行引用。如上例中的:
SET name=#name#, sex=#sex# WHERE id=#id#
运行期,ibatis 将通过调用User 对象的getName、getSex 和getId 方法获得相应的参数值,并将其作为SQL 的参数。
如果parameterClass 中设定的是jdk 的中的简单对象类型,如String、Integer,ibatis会直接将其作为SQL中的参数值。
我们也可以将包含了参数数据的Map对象传递给Statement,如:
Title<update id="updateUser"
parameterClass="java.util.Map">
UPDATE t_user
SET
name=#name#,
sex=#sex#
WHERE id = #id#
</update>这里传入的参数就是一个Map对象,ibatis将以key ”name”、”sex”、”id”从中提取对应的参数值。
同样的原理,我们也可以在resultMap中设定返回类型为map。
Title<select id="getUser"
parameterClass="java.lang.String"
resultClass="java.util.Map">
<![CDATA[
select
id,
name,
sex
from t_user
where id = #id#
]]>
</select>返回的结果将以各字段名为key保存在Map对象中返回。

在SQL中设定参数名时,可以同时指定参数类型,如:
SET name=#name:VARCHAR#, sex=#sex:NUMERIC# WHERE id=#id:NUMERIC#

对于返回结果而言,如果是select语句,建议也采用resultClass进行定义,如:
Title<select id="getUser"
parameterClass="java.lang.String"
resultClass="user">
<![CDATA[
select
name,
sex
from t_user
where name = #name#
]]>
</select>ibatis会自动根据select语句中的字段名,调用对应POJO 的set方法设定属性值,如上例中,ibatis会调用setName,setSex 方法将Select语句返回的数据赋予相应的POJO 实例。
有些时候,数据库表中的字段名过于晦涩,而为了使得代码更易于理解,我们希望字段映射到POJO时,采用比较易读的属性名, 此时,我们可以通过Select的as 字句对字段名进行转义,如(假设我们的书库中对应用户名的字段为xingming,对应性别的字段为xingbie):
Titleselect
xingming as name,
xingbie as sex
from t_user
where id = #id#ibatis 会根据转义后的字段名进行属性映射(即调用POJO 的setName 方法而不是setXingming方法)。
parameterMap和resultMap实现了POJO到数据库字段的映射配置,下面是
一个例子:
Title<resultMap id="get_user_result" class="user">
<result property="name" column="xingming"
jdbcType="VARCHAR" javaType="java.lang.String"/>
<result property="sex" column="xingbie"
jdbcType="int" javaType="java.lang.Integer"/>
<result property="id" column="id"
jdbcType="int" javaType="java.lang.Integer"/>
</resultMap>
<parameterMap id="update_user_para" class="redemption" >
<parameter property="name"
jdbcType="VARCHAR"
javaType="java.lang.String"
nullValue=""
/>
<parameter property="sex"
jdbcType="int"
javaType="java.lang.Integer"
nullValue=""
/>
</parameterMap>Parameter的nullValue指定了如果参数为空(null)时的默认值。之后我们即可在statement 申明中对其进行引用,如:
Title<procedure id="getUserList"
resultMap="get_user_result"
>
{call sp_getUserList()}
</procedure>
<procedure id="doUserUpdate"
parameterMap="update_user_para"
>
{call sp_doUserUpdate(#id#,#name#,#sex#)}
</procedure>一般而言,对于insert、update、delete、select语句,优先采用parameterClass和resultClass。
parameterMap 使用较少,而resultMap 则大多用于嵌套查询以及存储过程的处理,之所以这样,原因是由于存储过程相对而言比较封闭(很多情况下需要调用现有的存储过程,其参数命名和返回的数据字段命名往往不符合Java编程中的命名习惯,并且由于我们难以通过Select SQL的as子句进行字段名转义,无法使其自动与POJO中的属性名相匹配)。此时,使用resultMap建立字段名和POJO属性名之间的映射关系就显得非常有效。另一方面,由于通过resultMap 指定了字段名和字段类型,ibatis无需再通过JDBC ResultSetMetaData 来动态获取字段信息,在一定程度上也提升了性能表现。



转载于:https://www.cnblogs.com/ivan-zheng/archive/2009/10/12/1581637.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值