ibatis实战之OR映射

本文详细解析了iBATIS ORM配置文件的核心内容,包括模块配置和Statement配置。模块配置涉及别名和缓存机制的定义,而Statement配置则涵盖了SQL语句的多种操作类型。文中还详细介绍了参数与结果类的配置,以及如何利用参数类直接在SQL中引用对象属性。通过实例展示了如何在iBATIS中高效地执行增删改查操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <!DOCTYPE sqlMap   
  3. PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"   
  4. "http://www.ibatis.com/dtd/sql-map-2.dtd"> 
  5. <sqlMap namespace="User"> 
  6.     <!-- 模块配置 --> 
  7.     <typeAlias alias="user" type="com.itmyhome.User" /> 
  8.      
  9.     <cacheModel id="userCache" type="LRU"> 
  10.         <flushInterval hours="24"/>  
  11.         <flushOnExecute statement="updateUser"/> 
  12.         <property name="size" value="1000" /> 
  13.     </cacheModel> 
  14.  
  15.     <!-- Statement配置 --> 
  16.     <select id="getUser" parameterClass="java.lang.String" resultClass="user" cacheModel="userCache"> 
  17.         <![CDATA[
  18.              select * from user where id = #id#
  19.         ]]> 
  20.     </select> 
  21.      
  22.     <insert id="insertUser" parameterClass="user"> 
  23. insert into user values(#id#,#name#,#age#)
  24.     </insert> 
  25.  
  26.     <update id="updateUser" parameterClass="user"> 
  27.         update  user set name = #name# where id = #id# 
  28.     </update> 
  29.  
  30. </sqlMap> 
<?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机制

  1. <cacheModel id="userCache" type="LRU"> 
  2.     <flushInterval hours="24"/>  
  3.     <flushOnExecute statement="updateUser"/> 
  4.     <property name="size" value="1000" /> 
  5. </cacheModel> 
<cacheModel id="userCache" type="LRU">
	<flushInterval hours="24"/> 
	<flushOnExecute statement="updateUser"/>
	<property name="size" value="1000" />
</cacheModel>
这里声明了一个名为"userCache"的cacheModel,之后可以在Statement声明中对其进行引用

 

  1. <select id="getUser" parameterClass="java.lang.String" resultClass="user" cacheModel="userCache"> 
<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对节点申明进行更有针对性的检查,以避免配置上的失误。


主要的配置项如下:

  1. <statement id="queryUser" parameterClass="java.lang.Integer" resultClass="user"> 
  2.     select * from user where id = #id# 
  3. </statement> 
  4.  
  5. <select id="getUser" parameterClass="java.lang.String"  
  6.         resultClass="user" cacheModel="userCache"> 
  7.     <![CDATA[
  8.         select * from user where id = #id#
  9.     ]]> 
  10. </select> 
  11.  
  12. <insert id="insertUser" parameterClass="user"> 
  13.         insert into user values(#id#,#name#,#age#) 
  14. </insert> 
  15.  
  16. <update id="updateUser" parameterClass="java.lang.Integer"> 
  17.     update  user set name = #name# where id = #id# 
  18. </update> 
  19.  
  20. <delete id="deleteUser" parameterClass="java.lang.Integer"> 
  21.     delete user where id = #id# 
  22. </delete> 
<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节点对映射关系加以定义。
cacheModelstatement对应的Cache模块。
对于参数定义而言,尽量使用parameterClass,即直接将POJO作为statement的调用参数,

这样在SQL中可以直接将POJO的属性作为参数加以设定,如:

  1. <update id="updateUser" parameterClass="com.itmyhome.User"> 
  2.     alter table user set name = #name# where id = #id# 
  3. </update> 
<update id="updateUser" parameterClass="com.itmyhome.User">
	alter table user set name = #name# where id = #id#
</update>
这里将com.itmyhome.User类设定为updateUser的参数之后,我们即可在SQL中通过#name#

对POJO的属性进行引用。如下:

  1. set name = #name# where id = #id# 
set name = #name# where id = #id#
运行期,ibatis将通过调用User对象的getName,getId方法获得相应的参数值,并将其作为SQL的参数。

如果parameterClass中设定的是jdk的中的简单对象类型,如String、Integer,ibatis会直接将其作为SQL中的参数值。

我们也可以将包含了参数数据的Map对象传递给Statement如:

 
  1. <update id="updateUser" parameterClass="java.util.Map"
  2.     update  user set name = #name# where id = #id# 
  3. </update> 
  4.  
  5. Map<String, Object> map = new HashMap<String,Object>(); 
  6. map.put("id", "1"); 
  7. map.put("name", "hello"); 
  8. sqlMap.update("updateUser",map); 
<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中设定参数名时,可以同时指定参数类型,如:

 

  1. update  user set name = #name:VARCHAR# where id = #id:NUMBERIC#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值