1. 程式人生 > >ibatis 繫結變數 sql硬軟解析

ibatis 繫結變數 sql硬軟解析

關於避免sql的硬解析:

1.ibatis中,所有的 ##都是繫結變數,所有的$$都不算繫結變數,所以儘量避免使用$$。

但是對於In,$$中傳入的值,不被看成一個整體,此在In條件中可以順利使用只是不是繫結變數如:1 :2 :3 :4這種語句;

如果in的值是##傳入的,則in查不到任何資料因為##裡面的東西被看成一個整體。

2.如果sql中涉及到 where id in(xxx),則要這麼寫,才算繫結變數的sql(其中allmxid是list型別,每個id直接list.add加入list):
where id in
        <iterate  property="allmxid" open="(" close=")" conjunction=",">
         #allmxid[]#
        </iterate>
3.儲存過程中,我們平時那種寫法算繫結變數,不用特意寫成execute immediate的動態sql形式(參考地址http://www.itpub.net/thread-994690-1-1.html)。
4.要查sql是否是硬解析,可以通過sql查詢,寫的語句裡面是否變數都是用 :1 :2 :3等等代替的,正確的sql應該所有的變數都用:1這種來代替,要不然就是硬解析sql需要改:
select * from V$SQLAREA  --where sql_text like'..'
5.要想知道上面查詢出的語句中,佔位符 :1 :2 :3的具體值(需要從上面語句記錄sql_id),可以通過下面sql來查詢,但是此值是根據sql的執行時刻改變的:
select * from V$SQL_BIND_CAPTURE where sql_id='7sb5h8cqn826p'


例如,通過 4 中 查詢出來的sql可以看到下面兩個紅框中, where id in 裡面 兩個不一樣,這是2個sql,需要解析2次,實際正確的應該是這樣的(只用解析一次,其他的來的同類sql只是把佔位符替換):

圖中,打勾的2個sql,會因為 where id in 中 id的個數不同,in中內容生成不同個數的佔位符,但是相對於圖中上面兩個打叉的sql(每一個sql,就是一個sql,無法和其它同類sql共用)來說,已經是很少的硬解析了。