考虑到这个问题,ibatis引入了动态映射机制,即在statement定义中,根据不同的
查询参数,设定对应的SQL语句。
还是以上面的示例为例:
<select id="getUsers"
parameterClass="user"
resultMap="get-user-result">
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
select
id,
name,
sex
from t_user
<dynamic prepend="WHERE">
<isNotEmpty prepend="AND" property="name">
(name like #name#)
</isNotEmpty>
<isNotEmpty prepend="AND" property="address">
(address like #address#)
</isNotEmpty>
</dynamic>
</select>
通过dynamic 节点,我们定义了一个动态的WHERE 子句。此WHERE 子句中将
可能包含两个针对name 和address 字段的判断条件。而这两个字段是否加入检索取决
于用户所提供的查询条件(字段是否为空[isNotEmpty])。
name"属性非空(isNotEmpty,即非空
字符串””
有些时候,数据库表中的字段名过于晦涩,而为了使得代码更易于理解,我们
希望字段映射到POJO时,采用比较易读的属性名, 此时,我们可以通过Select
的as 字句对字段名进行转义,如(假设我们的书库中对应用户名的字段为
xingming,对应性别的字段为xingbie):
select
xingming as name,
xingbie as sex
from t_user
where id = #id#
ibatis 会根据转义后的字段名进行属性映射(即调用POJO 的setName 方法而
不是setXingming方法)
Statement配置包含了数个与SQL Statement相关的节点,分别为:
u statement
u insert
u delete
u update
u select
u procedure
如
insert、update、delete节点无需返回数据类型定义(总是int)
主要的配置项如下:
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>
parameterMap 参数映射,需结合parameterMap节点对映射
关系加以定义。
对于存储过程之外的statement而言,建议使用
parameterClass作为参数配置方式,一方面避
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
免了参数映射配置工作,另一方面其性能表现也
更加出色。
resultMap 结果映射,需结合resultMap节点对映射关系
加以定义。
cacheModel statement对应的Cache模块
我们也可以将包含了参数数据的Map对象传递给Statement,如:
<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。
<select id="getUser"
parameterClass="java.lang.String"
resultClass="java.util.Map">
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
<![CDATA[
select
id,
name,
sex
from t_user
where id = #id#
]]>
</select>
返回的结果将以各字段名为key保存在Map对象中返回。