1.select语句中的*号问题
多表连接必须杜绝使用select *
单表连接,一般情况不建议使用select *,但是如果出现以下情况,必须禁用:
1)表中包含lob字段(BLOB,CLOB,LONG,RAW等)
2)表中包含长度较大的字段,如varchar2(1000)以上的字段,但该SQL实际并不需要取出该字段的值
3)字段数量较多,但实际使用的字段很少,比如表有50个字段,而实际需要使用的只有5个,并且该SQL没有被重用
2.严格要求使用正确类型的变量,杜绝oracle做隐式类型转换的情况
1)推荐在sqlmap的变量中制定变量的数据类型,如:
select * from tablename where id = #id:VARCHAR#
2)对于时间类型的字段,必须使用TO_DATE进行赋值(当前时间可直接用sysdate表示)
错误的写法(使用date类型的变量):
select * from tablename where id = #id:varchar#
and dt >= #dateBegin:date#
and dt < #dateEnd:date#
错误的写法(使用包含sysdate的表达式):
select * from tablename where id= #id:varchar#
and dt >= trunc(sysdate - 1)
and dt < sysdate + 1
错误的写法(将to_date函数和数字进行算术运算):
select * from tablename where id = #id:varchar#
and dt >= to_date(#dateBegin:varchar#, 'yyyy-mm-dd hh24:mi:ss')
and dt < to_date(#dateBegin:varchar#, 'yyyy-mm-dd hh24:mi:ss') + 1
正确的写法:
select * from tablename where id = #id:varchar#
and dt >= to_date(#dateBegin:varchar#, 'yyyy-mm-dd hh24:mi:ss')
and dt < to_date(#dateEnd:varchar#, 'yyyy-mm-dd hh24:mi:ss') /*或 dt < sysdate */
3.杜绝循环调用
例如:在迭代的过程中,使用同一SQL反复查询DB,如:
while
(listObj.hasnext()) {
SELECT * FROM process_table WHERE (no = ?)
......
}
这样不仅效率不高,还造成交互过于频繁,严重情况会导致服务器LOAD增加
解决方式:
如果该查询是使用唯一键(如上例),参考后面的STR2VARLIST或STR2NUMLIST的用法
4.绑定变量和替代变量
在Ibatis中:
绑定变量用 #变量名# 表示
替代变量用 $变量名$ 表示
注意几点:
1)通常,应使用绑定变量,尤其是具体取值变化范围较大的变量,如id = #id#。
2)取值范围很小(比如枚举字段),并且通常取值会比较固定,在DBA预先同意的情况下使用替代变量,或者干脆使用常量。
3)当一个绑定变量在实际使用中实际取值总是为某一固定常量时,应当直接使用常量而不是变量
4)在order by子句中,通常使用替代变量而不是绑定变量。
5)IN子句,使用"iterate + 数组类型变量"的方式实现绑定变量,例如:
<isNotEmpty prepend="and"
property="userIds"
>
<iterate property="Ids"
open="t.creator in ("
close=")"
conjunction=","
>
#Ids[]#
</iterate>
</isNotEmpty>
将生成 t.creator in (:1, :2, :3, :4, :5 ...) 的语句
5.在字段上加函数的问题
1)通常,不允许在字段上添加函数或者表达式,如:
错误的写法:
select * from tableName where to_char ( dt, 'yyyy-mm-dd') = '2011-03-04';
select qty from tableName where id + 12 = 168;
正确的写法:
select * from tableName where dt >= to_date ( '2007-04-04', 'yyyy-mm-dd') and dt < to_date ( '2007-0