ibatis实战之OR映射
Posted skiwnchqhh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ibatis实战之OR映射相关的知识,希望对你有一定的参考价值。
相对Hibernate等ORM实现而言,ibatis的映射配置更为简洁直接,下面是一个典型的配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<!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.itmyhome.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 * from user where id = #id#
]]>
</select>
<insert id="insertUser" parameterClass="user">
insert into user values(#id#,#name#,#age#)
</insert>
<update id="updateUser" parameterClass="user">
update user set name = #name# where id = #id#
</update>
</sqlMap>
可以看到,映射文件主要分为两个部分:模块配置和Statement配置
一、模块配置包括:
typeAlias节点:
定义了本映射文件中的别名,以避免过长变量值的反复书写,此例中通过typeAlias节点为类"com.itmyhome.User"定义了一个别
名"user",这样在本配置文件的其他部分,需要引用"com.itmyhome.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主要有下面几个配置点:
flushInterval:设定缓存有效期,如果超过此设定值,则将此CacheModel的缓存清空。
size:本CacheModel中最大容纳的数据对象数量。
flushOnExecute:指定执行特定Statement时,将缓存清空。如updateUser操将更
新数据库中的用户信息,这将导致缓存中的数据对象与数据库中的实际
数据发生偏差,因此必须将缓存清空以避免脏数据的出现。
二、Statement配置
Statement配置包含了数个与SQL Statement相关的节点,分别为:
1)statement
2)insert
3)delete
4)update
5)select
6)procedure
其中,statement最为通用,它可以替代其余的所有节点。除statement之外的节点各自对应了SQL中的
同名操作(procedure对应存储过程).使用statement定义所有操作固然可以达成目标,但缺乏直观性,
建议在实际开发中根据操作目的,各自选用对应的节点名加以申明.一方面,使得配置文件
更加直观,另一方面,也可借助DTD对节点申明进行更有针对性的检查,以避免配置上的失误。
主要的配置项如下:
<statement id="queryUser" parameterClass="java.lang.Integer" resultClass="user">
select * from user where id = #id#
</statement>
<select id="getUser" parameterClass="java.lang.String"
resultClass="user" cacheModel="userCache">
<![CDATA[
select * from user where id = #id#
]]>
</select>
<insert id="insertUser" parameterClass="user">
insert into user values(#id#,#name#,#age#)
</insert>
<update id="updateUser" parameterClass="java.lang.Integer">
update user set name = #name# where id = #id#
</update>
<delete id="deleteUser" parameterClass="java.lang.Integer">
delete user where id = #id#
</delete>
参数 | 描述 |
parameterClass | 参数类.指定了参数的完整类名(包括包路径). 可通过别名避免每次重复书写冗长的类名. |
resultClass | 结果类.指定结果类型的完整类名(包括包路径) 可通过别名避免每次重复书写冗长的类名. |
parameterMap | 参数映射,需结合parameterMap节点对映射关系加以定义. 对于存储过程之外的statement而言,建议使用 parameterClass作为参数配置方式,一方面避免了 参数映射配置工,另一方面其性能表现也更加出色。 |
resultMap | 结果映射,需结合resultMap节点对映射关系加以定义。 |
cacheModel | statement对应的Cache模块。 |
这样在SQL中可以直接将POJO的属性作为参数加以设定,如:
<update id="updateUser" parameterClass="com.itmyhome.User">
alter table user set name = #name# where id = #id#
</update>
这里将com.itmyhome.User类设定为updateUser的参数之后,我们即可在SQL中通过#name#
对POJO的属性进行引用。如下:
set name = #name# where id = #id#
运行期,ibatis将通过调用User对象的getName,getId方法获得相应的参数值,并将其作为SQL的参数。
如果parameterClass中设定的是jdk的中的简单对象类型,如String、Integer,ibatis会直接将其作为SQL中的参数值。
我们也可以将包含了参数数据的Map对象传递给Statement如:
<update id="updateUser" parameterClass="java.util.Map">
update user set name = #name# where id = #id#
</update>
Map<String, Object> map = new HashMap<String,Object>();
map.put("id", "1");
map.put("name", "hello");
sqlMap.update("updateUser",map);
这里传入的参数就是一个Map对象,ibatis将以key "id"、"name"从中提取对应的参数值在SQL中设定参数名时,可以同时指定参数类型,如:
update user set name = #name:VARCHAR# where id = #id:NUMBERIC#
作者:itmyhome
转载请注明出处:http://blog.csdn.net/itmyhome1990/article/details/29860843
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
以上是关于ibatis实战之OR映射的主要内容,如果未能解决你的问题,请参考以下文章