一个ibatis的问题

skyzyg 2005-11-11 04:57:30
最近公司要用到ibatis,哪位大虾有ibatis的例子,请给小弟发一个,最好是一个HelloWorld的程序,
我的Email: skyzyg@126.com

给50分

谢谢!
...全文
178 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fbtdjs 2005-11-30
  • 打赏
  • 举报
回复
好铁!
学习……
figoren 2005-11-27
  • 打赏
  • 举报
回复
考虑到这个问题,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,即非空
字符串””


判定节点的定义可以非常灵活,我们甚至可以使用嵌套的判定节点来实现复杂的动
态映射,如:
<isNotEmpty prepend="AND" property="name">
( name=#name#
<isNotEmpty prepend="AND" property="address">
address=#address#
</isNotEmpty>
)
</isNotEmpty>
这段定义规定,只有用户提供了姓名信息时,才能结合地址数据进行查询(如果只
提供地址数据,而将姓名信息忽略,将依然被视为全检索)。


<isPropertyAvailable> 参数类中是否提供了此属性
<isNotPropertyAvailable> 与<isPropertyAvailable>相反
<isNull> 属性值是否为NULL
<isNotNull> 与<isNull>相反
<isEmpty> 如果属性为Collection或者String,其size是否<1,
如果非以上两种类型,则通过
String.valueOf(属性值)
获得其String类型的值后,判断其size是否<1
<isNotEmpty> 与<isEmpty>相反。


二元判定节点有:
节点名 属性值与compareValues的关系
<isEqual> 相等。
<isNotEqual> 不等。
<isGreaterThan> 大于
<isGreaterEqual> 大于等于
<isLessThan> 小于
<isLessEqual> 小于等于
figoren 2005-11-27
  • 打赏
  • 举报
回复
有些时候,数据库表中的字段名过于晦涩,而为了使得代码更易于理解,我们
希望字段映射到POJO时,采用比较易读的属性名, 此时,我们可以通过Select
的as 字句对字段名进行转义,如(假设我们的书库中对应用户名的字段为
xingming,对应性别的字段为xingbie):
select
xingming as name,
xingbie as sex
from t_user
where id = #id#
ibatis 会根据转义后的字段名进行属性映射(即调用POJO 的setName 方法而
不是setXingming方法)




parameterMap和resultMap实现了POJO到数据库字段的映射配置,下面是
一个例子:
<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 申明中对其进行引用,如:
<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。


一对多关联
下面的例子中,我们首选读取t_user 表中的所有用户记录,然后获取每个用户对应
的所有地址信息。
<resultMap id="get-user-result" class="user">
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<result property="addresses" column="id"
select="User.getAddressByUserId"/>
</resultMap>
<select id="getUsers"
parameterClass="java.lang.String"
resultMap="get-user-result">
<![CDATA[
select
id,
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
name,
sex
from t_user
where id = #id#
]]>
</select>
<select id="getAddressByUserId"
parameterClass="int"
resultClass="address">
<![CDATA[
select
address,
zipcode
from t_address
where user_id = #userid#
]]>
</select>
</sqlMap>




一对一关联
一对一关联是一对多关联的一种特例。这种情况下,如果采用上面的示例将导致
1+1条SQL的执行。
对于这种情况,我们可以采用一次Select两张表的方式,避免这样的性能开销(假
设上面示例中,每个User 只有一个对应的Address记录):
<resultMap id="get-user-result" class="user">
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<result property="address" column="t_address.address"/>
<result property="zipCode" column="t_address.zipcode"/>
</resultMap>
<select id="getUsers"
parameterClass="java.lang.String"
resultMap="get-user-result">
<![CDATA[
select
IBATIS Developer’s Guide Version 1.0
September 2, 2004 So many open source projects. Why not Open your Documents?
*
from t_user,t_address
where t_user.id=t_address.user_id
]]>
</select>
与此同时,应该保证User 类中包含address和zipCode两个String型属性。
figoren 2005-11-27
  • 打赏
  • 举报
回复
<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
进行数据查询,即直接从缓存中读取查询结果,而无需再去数据库查询。


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


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>


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

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模块

对于参数定义而言,尽量使用parameterClass,即直接将POJO 作为
statement 的调用参数,这样在SQL 中可以直接将POJO 的属性作为参数加以
设定,



我们也可以将包含了参数数据的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对象中返回。

67,541

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧