ibatis 常用标签

一级标签(根标签):
1.

属性:
namespace:用于指定命名空间,在java程序段可以使用命名空间.标签id的形式来调用相应的sql语句。

二级标签:
2.cacheModel

cachemodel是ibatis里面自带的缓存机制,正确的应用能很好提升我们系统的性能。

使用方法:在sqlmap的配置文件中加入

[html] view plain copy
  1. <cacheModel type="LRU" id="article_cache" readOnly="true" serialize="false">  
  2.         <flushInterval hours="24"/>  
  3.         <flushOnExecute statement="articleLists.insertArticle"/>  
  4.         <property name="cache_size" value="50"/>          
  5. cacheModel>  

在查询语句中使用缓存
[html] view plain copy
  1. <select id="getArticles" resultClass="articleList" parameterClass="articleList" cacheModel="article_cache">  
[html] view plain copy
  1. pre>先对cachemodel中一些用法进行解释一下:<strong><span style="color:#ff0000">typespan>strong>:是缓存的类型,ibatis中有4种方式,分别为MEMORY、LRU、FIFO、OSCACHE          MEMORY是内存缓存,和Java内存管理机制类似分为[SOFT、WEAK、STRONG]          LRU是使用最近最少使用策略          FIFO是使用先进先出策略          OSCACHE是通过第三方的缓存插件实现<strong><span style="color:#ff0000">idspan>strong>:是cachemodel的一个标识<strong><span style="color:#ff0000">readOnlyspan>strong>:指缓存的数据对象是只读还是可读写,默认只读,这里的只读并不是意味着数据对象一旦放入缓存中就无法再对数据进行修改。而是当数据对象发生变化的时候,如数据对象的某个属性发生了变化,则此数据对象就将被从缓存中废除,下次需要重新从数据库读取数据,构造新的数据对象。而readOnly="false"则意味着缓存中的数据对象可更新.<strong><span style="color:#ff0000">serializespan>strong>:只有在readOnly为false的情况下才生效,因为在readOnly为true时,所有数据对象相同,只有可读写时,才会出现不同的session拥有不同的数据对象副本。<strong><span style="color:#ff0000">flushIntervalspan>strong>:指定缓存自动刷新的时间,可以为hours,minutes,seconds,milliseconds.<strong><span style="color:#ff0000">flushOnExecutespan>strong>:指定在发生哪些操作时,更新缓存。<strong><span style="color:#ff0000">propertyspan>strong>:不同type的cachemodel有不同的属性。总结:对更新比较频繁的数据,使不使用感觉效率差不多,对更新不是很频繁的数据,使用缓存效率还是能提升的!<strong>3.<delete> DELETE SQLdelete>    <insert> INSERT SQL insert>    <update> UPDATE SQL update>strong>属性:<strong><span style="color:#ff0000">idspan>strong>:唯一标识<strong><span style="color:#ff0000">parameterMapspan>strong>:参数列表<strong><span style="color:#ff0000">parameterClassspan>strong>:参数类。<strong><span style="color:#ff0000">timeoutspan>strong>:设置数据库超时时间.通常使用parameterClass,传入一个HashMap,在java程序端使用HashMap来存储参数。<strong>4.<select> SELECT SQL select>strong>属性:<strong><span style="color:#ff0000">idspan>strong>:命名空间中的唯一标识<strong><span style="color:#ff0000">parameterClassspan>strong>:参数类型<strong><span style="color:#ff0000">parameterMapspan>strong>:参数列表<strong><span style="color:#ff0000">resultClassspan>strong>:结果类型<strong><span style="color:#ff0000">resultMapspan>strong>:结果列表<strong><span style="color:#ff0000">cacheModelspan>strong>:缓存模式<strong><span style="color:#ff0000">timeoutspan>strong>:数据库超时时间<strong><span style="color:#ff0000">fetchSizespan>strong>:一次抓去的数据量<strong><span style="color:#ff0000">remapResultsspan>strong>:有true和false两个值。如果每次查询的列或者表发生变化时,就需要设置为true。使用的话会造成一定的性能损失。<strong><span style="color:#ff0000">xmlResultNamespan>strong>:将结果集转换为xml形式。<strong><span style="color:#ff0000">resultSetTypespan>strong>:结果集类型。参数传入类似于删除,插入,更新的操作。结果输出有两种,如果明确返回的数据的类型,那么可以使用resultClass。如果返回的数据中有很多类型,那么使用resultMap。<strong>5.<resultMap>resultMap>strong>属性:<strong><span style="color:#ff0000">idspan>strong>:唯一标识<strong><span style="color:#ff0000">classspan>strong>:要存入的数据的类型。通常可以使用HashMap。<strong><span style="color:#ff0000">extendsspan>strong>:可以继承其他的resultMap<strong><span style="color:#ff0000">groupByspan>strong>:可以进行分组<strong>6.<paramaterMap>parameterMap>strong>属性:<strong><span style="color:#ff0000">idspan>strong>:唯一标识<strong><span style="color:#ff0000">classspan>strong>:参数类型通常使用parameterClass,然后传入一个HashMap。<strong>7.<sql> SOME SQLsql>strong>属性:<strong><span style="color:#ff0000">idspan>strong>:唯一标识。<strong><span style="color:#ff0000">8.<statement> 动态SQL statement>span>strong>属性和select一样。<strong>9.<typeAlias />strong>可以给一个类型指定别名属性:<strong><span style="color:#ff0000">aliasspan>strong>:别名<strong><span style="color:#ff0000">typespan>strong>:要指定别名的类的类型<strong>10.<procedure> call 存储过程名(参数1,参数2...)procedure>strong>属性和select一样。可以调用存储过程。<span style="color:#3366ff"><strong>以下为二级标签下的三级标签strong>span><strong>11.<dynamic>dynamic>strong>属性:<strong><span style="color:#ff0000">prependspan>strong>:用于拼接一个前缀。它会覆盖掉第一个为true的元素的prepend。<strong><span style="color:#ff0000">closespan>strong><strong><span style="color:#ff0000">openspan>strong>属性用于包括一个拼接的sql。例如:<p>p><pre code_snippet_id="546471" snippet_file_name="blog_20141209_3_9526983" name="code" class="html">select * from table  
  2. <dynamic prepend="where" open="(" close=")">  
  3.     id=#id#  
  4. dynamic>  
这就拼接了sql为  select * from table where (id=?)  (id值由传入所得)

再例如:
[html] view plain copy
  1. select * from ACCOUNT    
  2. <dynamic prepend="where">    
  3.     <isGreaterThan property="id" compareValue="0">    
  4.         ACC_ID = #id#    
  5.     isGreaterThan>    
  6.     <isNotNull prepend="and" property="lastName">    
  7.         ACC_LAST_NAME = #lastName#    
  8.     isNotNull>    
  9. dynamic>   
如果这样写,那么会拼出sql为select * from ACCOUNT where ACC_ID=#id# ACC_LAST_NAME=#lastName#,
因为它将第一个为true的prepend覆盖掉了。应该在中添加属性prepend。推荐为所有的prepend都赋值,以免拼接时出现错误。

12.
用于引用包含一段已经定义好的sql
属性:
refid:被引用的sql的id

13.
判断所传入参数是否为null或者为空。如果是empty,那么就将传入参数拼入sql语句。
属性:
prepend:拼接sql的前缀。
property:对应于java的属性
closeopen:包括拼接的sql。

例如:
[html] view plain copy
  1. insert into table(  
  2. <dynamic prepend=" ">  
  3.     <isEmpty prepend="," preperty="name">nameisEmpty>  
  4.     <isEmpty prepend="," preperty="age">ageisEmpty>  
  5. dynamic>  
  6. ) values(  
  7. <dynamic prepend=" ">  
  8.     <isEmpty prepend="," preperty="name">#name#isEmpty>  
  9.     <isEmpty prepend="," preperty="age">1isEmpty>  
  10. dynamic>  
  11. )  
如果传入age为空,传入name为张三,那么拼接的sql为

insert into table(age) values(1)


14.
相反,判断传入参数是否不为空也不为null。如果不为null和空,那么就将参数拼接到sql中。
属性:
prepend:拼接sql的前缀。
property:对应于java的属性
closeopen:包括拼接的sql。

例如:

[html] view plain copy
  1. insert into table(  
  2. <dynamic prepend=" ">  
  3.     <isNotEmpty prepend="," preperty="name">nameisNotEmpty>  
  4.     <isNotEmpty prepend="," preperty="age">ageisNotEmpty>  
  5. dynamic>  
  6. ) values(  
  7. <dynamic prepend=" ">  
  8.     <isNotEmpty prepend="," preperty="name">#name#isNotEmpty>  
  9.     <isNotEmpty prepend="," preperty="age">#age#isNotEmpty>  
  10. dynamic>  
  11. )  
如果传入name为张三,传入age为null,那么拼接的sql为

insert into table(name) values('张三')


15.
判断传入参数是否为null。如果为null,那么就执行相应的拼接。
属性:
prepend:拼接sql的前缀。
property:对应于java的属性
closeopen:包括拼接的sql。

例如:

[html] view plain copy
  1. insert into table(  
  2. <dynamic prepend=" ">  
  3.     <isNull prepend="," preperty="name">nameisNull>  
  4.     <isNull prepend="," preperty="age">ageisNull>  
  5. dynamic>  
  6. ) values(  
  7. <dynamic prepend=" ">  
  8.     <isNull prepend="," preperty="name">'张三'isNull>  
  9.     <isNull prepend="," preperty="age">#age#isNull>  
  10. dynamic>  
  11. )  
如果传入name为null,传入age为22,那么拼接的sql为
insert into table(name) values('张三')

16.
判断传入参数是否不为null。如果不为null,那么就执行相应的拼接。
属性:
prepend:拼接sql的前缀。
property:对应于java的属性
closeopen:包括拼接的sql。

例如:
[html] view plain copy
  1. insert into table(  
  2. <dynamic prepend=" ">  
  3.     <isNotNull prepend="," preperty="name">nameisNotNull>  
  4.     <isNotNull prepend="," preperty="age">ageisNotNull>  
  5. dynamic>  
  6. ) values(  
  7. <dynamic prepend=" ">  
  8.     <isNotNull prepend="," preperty="name">#name#isNotNull>  
  9.     <isNotNull prepend="," preperty="age">#age#isNotNull>  
  10. dynamic>  
  11. )  
如果传入name为张三,传入age为null,那么拼接的sql为
insert into table(name) values('张三')

17.
判断传入参数与指定值是否相等。
属性:
prepend:拼接sql的前缀。
property:对应于java的属性
closeopen:包括拼接的sql。
compareValue:用于指定与参数比较的值。
compareProperty:用于指定与参数比较的属性。

例如:
[html] view plain copy
  1. select * from table   
  2. <dynamic prepend="where">  
  3.   <isEqual prepend=" " property="id" compareValue="001">id=#id#isEqual>  
  4. dynamic>  
如果id传入为001,那么就拼接sql为 
select * from table where id='001'
如果传入不为001,那么拼接sql为 select * from table

18.,,,
分别对应与大于等于,大于,小于等于,小于。

19.
如果参数不为null,则执行sql
属性:
prepend:拼接sql的前缀。
closeopen:包括拼接的sql。

20.
如果参数为null,则执行sql
属性:
prepend:拼接sql的前缀。
close和open:包括拼接的sql。

21.
如果参数有使用则查询条件有效。

22.
如果参数没有使用则查询条件有效。

23.
配置在resultMap下,用于指定结果集中的每一项。
属性:
property:对应于要输出的字段名,在java程序段可以通过这个属性值获得相应的值
colunm:对应于数据表的字段
columIndex:对应于数据表字段的索引
jdbcType:仅当增删改是可能出现null值的字段,可以设置jdbcType。当该result为DATE类型时,指定jdbcType可以更加明确sql。因为DATE在java里是一种类型,但是在不同的数据库有不同的DATE类型。
javaType:对应于java的类型。如果在sql中使用了聚合函数,需要在对应的result中配置该属性,否则取出的是聚合函数的对象,显示出的就是java对象的哈希值。
nullValue:空值。

24.
用于循环输出,以便循环的生成sql。
属性:
property:对于要输出的集合
open和close:用于开始和结束,包括一段拼接的sql。
prepend:拼接sql的前缀
conjunction:循环输出拼接时需要的连接字符串,用于定义AND或OR

例如:
[html] view plain copy
  1. <select id="selectUseIterator" parameterClass="java.util.List" resultMap="student">  
  2. SELECT * FROM STUDENT  
  3. <dynamic prepend="WHERE ID IN">  
  4.     <iterate open="(" close=")" conjunction="," >#[]#iterate>  
  5. dynamic>  
  6. select>  
参数List传入了3个id,分别为1,3,4。必须写[],以防解析器简单地将List输出成String。拼接的sql为
SELECT * FROM STUDENT WHERE ID IN (1,3,4)

25.
用于获取自增长的序列。
属性:
resultClass:返回结果的类型。
keyProperty:对应键的属性。
多用于插入操作,例如:
[html] view plain copy
  1. <insert id="addStudent" parameterClass="earl.vo.Student">  
  2.     INSERT INTO STUDENT(NAME,AGE,SEX,MAJOR) VALUES(#name#,#age#,#sex#,#major#)  
  3.     <selectKey resultClass="int" keyProperty="id">  
  4.         SELECT LAST_INSERT_ID() AS ID  
  5.     selectKey>  
  6. insert>  
id是STUDENT表的主键,通过这条语句可以自动生成id并插入到STUDENT表中。



以下是一些标签的用法区别及技巧:

的区别:
如果不传入参数,不会将其中的字符串拼入sql。而会将其中的字符串拼入sql,但是不赋值。
例如:
[html] view plain copy
  1. <insert id="insertFeeItem" parameterClass="java.util.HashMap" >  
  2. INSERT INTO PAYMENTRECORDS (  
  3. <dynamic prepend=" ">  
  4.     <isNotEmpty prepend="," property="payfee_record_id">payfee_record_idisNotEmpty>  
  5.     <isNotNull prepend="," property="order_no">order_noisNotNull>  
  6. dynamic>  
  7. )VALUES(  
  8. <dynamic prepend=" ">  
  9.     <isNotEmpty prepend="," property="payfee_record_id">#payfee_record_id#isNotEmpty>  
  10.     <isNotNull prepend="," property="order_no">#order_no#isNotNull>  
  11. dynamic>  
  12. )  
  13. insert>  
如果两个参数都传入为null,那么拼接出的sql为
INSERT INTO PAYMENTRECORDS(order_no) VALUES("")
这里没有拼接payfee_record_id,而order_no只是字符串的形式。

在动态拼接sql时,常常会遇到#和$,他们的区别是:
1.#是将参数按照字符串传入,$是将参数直接传入
2.#相当于是参数变量替换,$相当于是字符串的拼接
3.#可以防止sql注入,$不可以
所以能使用#的地方一定不使用$

如果不指定parameterClass,那么任何带有get/set方法的属性的javabean都可以作为输入参数。

在配置sql时,可以直接写select * from table,但是一定要配置一个包含数据表全部列的resultMap


你可能感兴趣的:(ibatis 常用标签)