一级标签(根标签): 1.
属性:
namespace :用于指定命名空间,在java程序段可以使用命名空间.标签id的形式来调用相应的sql语句。
二级标签: 2.cacheModel
cachemodel是ibatis里面自带的缓存机制,正确的应用能很好提升我们系统的性能。
使用方法:在sqlmap的配置文件中加入
在查询语句中使用缓存
先对cachemodel中一些用法进行解释一下:
type :是缓存的类型,ibatis中有4种方式,分别为MEMORY、LRU、FIFO、OSCACHE MEMORY是内存缓存,和Java内存管理机制类似分为[SOFT、WEAK、STRONG] LRU是使用最近最少使用策略 FIFO是使用先进先出策略 OSCACHE是通过第三方的缓存插件实现
id :是cachemodel的一个标识
readOnly :指缓存的数据对象是只读还是可读写,默认只读,这里的只读并不是意味着数据对象一旦放入缓存中就无法再对数据进行修改。而是当数据对象发生变化的时候,如数据对象的某个属性发生了变化,则此数据对象就将被从缓存中废除,下次需要重新从数据库读取数据,构造新的数据对象。而readOnly="false"则意味着缓存中的数据对象可更新.
serialize :只有在readOnly为false的情况下才生效,因为在readOnly为true时,所有数据对象相同,只有可读写时,才会出现不同的session拥有不同的数据对象副本。
flushInterval :指定缓存自动刷新的时间,可以为hours,minutes,seconds,milliseconds.
flushOnExecute :指定在发生哪些操作时,更新缓存。
property :不同type的cachemodel有不同的属性。总结:对更新比较频繁的数据,使不使用感觉效率差不多,对更新不是很频繁的数据,使用缓存效率还是能提升的!
3. DELETE SQL INSERT SQL UPDATE SQL 属性:
id :唯一标识
parameterMap :参数列表
parameterClass :参数类。
timeout :设置数据库超时时间.通常使用parameterClass,传入一个HashMap,在java程序端使用HashMap来存储参数。
4. SELECT SQL 属性:
id :命名空间中的唯一标识
parameterClass :参数类型
parameterMap :参数列表
resultClass :结果类型
resultMap :结果列表
cacheModel :缓存模式
timeout :数据库超时时间
fetchSize :一次抓去的数据量
remapResults :有true和false两个值。如果每次查询的列或者表发生变化时,就需要设置为true。使用的话会造成一定的性能损失。
xmlResultName :将结果集转换为xml形式。
resultSetType :结果集类型。参数传入类似于删除,插入,更新的操作。结果输出有两种,如果明确返回的数据的类型,那么可以使用resultClass。如果返回的数据中有很多类型,那么使用resultMap。
5. 属性:
id :唯一标识
class :要存入的数据的类型。通常可以使用HashMap。
extends :可以继承其他的resultMap
groupBy :可以进行分组
6. 属性:
id :唯一标识
class :参数类型通常使用parameterClass,然后传入一个HashMap。
7. SOME SQL 属性:
id :唯一标识。
8. 动态SQL 属性和select一样。
9. 可以给一个类型指定别名属性:
alias :别名
type :要指定别名的类的类型
10. call 存储过程名(参数1,参数2...) 属性和select一样。可以调用存储过程。
以下为二级标签下的三级标签 :11. 属性:
prepend :用于拼接一个前缀。它会覆盖掉第一个为true的元素的prepend。
close 和
open 属性用于包括一个拼接的sql。例如:
select * from table
id=#id#
这就拼接了sql为 select * from table where (id=?) (id值由传入所得)
再例如:
select * from ACCOUNT
ACC_ID = #id#
ACC_LAST_NAME = #lastName#
如果这样写,那么会拼出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的属性
close 和
open :包括拼接的sql。
例如:
insert into table(
name
age
) values(
#name#
1
)
如果传入age为空,传入name为张三,那么拼接的sql为
insert into table(age) values(1)
14. 与相反,判断传入参数是否不为空也不为null。如果不为null和空,那么就将参数拼接到sql中。 属性:prepend :拼接sql的前缀。property :对应于java的属性close 和open :包括拼接的sql。 例如:
insert into table(
name
age
) values(
#name#
#age#
)
如果传入name为张三,传入age为null,那么拼接的sql为
insert into table(name) values('张三')
15. 判断传入参数是否为null。如果为null,那么就执行相应的拼接。 属性:prepend :拼接sql的前缀。property :对应于java的属性close 和open :包括拼接的sql。 例如:
insert into table(
name
age
) values(
'张三'
#age#
)
如果传入name为null,传入age为22,那么拼接的sql为
insert into table(name) values('张三')
16.
判断传入参数是否不为null。如果不为null,那么就执行相应的拼接。
属性:
prepend :拼接sql的前缀。
property :对应于java的属性
close 和
open :包括拼接的sql。
例如:
insert into table(
name
age
) values(
#name#
#age#
)
如果传入name为张三,传入age为null,那么拼接的sql为
insert into table(name) values('张三')
17.
判断传入参数与指定值是否相等。
属性:
prepend :拼接sql的前缀。
property :对应于java的属性
close 和
open :包括拼接的sql。
compareValue :用于指定与参数比较的值。
compareProperty :用于指定与参数比较的属性。
例如:
select * from table
id=#id#
如果id传入为001,那么就拼接sql为
select * from table where id='001'
如果传入不为001,那么拼接sql为 select * from table
18.,,,
分别对应与大于等于,大于,小于等于,小于。
19.
如果参数不为null,则执行sql
属性:
prepend :拼接sql的前缀。
close 和
open :包括拼接的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
例如:
SELECT * FROM STUDENT
#[]#
参数List传入了3个id,分别为1,3,4。必须写[],以防解析器简单地将List输出成String。拼接的sql为
SELECT * FROM STUDENT WHERE ID IN (1,3,4)
25.
用于获取自增长的序列。
属性:
resultClass :返回结果的类型。
keyProperty :对应键的属性。
多用于插入操作,例如:
INSERT INTO STUDENT(NAME,AGE,SEX,MAJOR) VALUES(#name#,#age#,#sex#,#major#)
SELECT LAST_INSERT_ID() AS ID
id是STUDENT表的主键,通过这条语句可以自动生成id并插入到STUDENT表中。
以下是一些标签的用法区别及技巧:
和的区别:
如果不传入参数,不会将其中的字符串拼入sql。而会将其中的字符串拼入sql,但是不赋值。
例如:
INSERT INTO PAYMENTRECORDS (
payfee_record_id
order_no
)VALUES(
#payfee_record_id#
#order_no#
)
如果两个参数都传入为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