SQLMAP编写规范以及一些常见的SQL问题

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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值