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
        
         #allmxid[]#
       
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'


ibatis 绑定变量 sql硬软解析_第1张图片

例如,通过 4 中 查询出来的sql可以看到下面两个红框中, where id in 里面 两个不一样,这是2个sql,需要解析2次,实际正确的应该是这样的(只用解析一次,其他的来的同类sql只是把占位符替换):

图中,打勾的2个sql,会因为 where id in 中 id的个数不同,in中内容生成不同个数的占位符,但是相对于图中上面两个打叉的sql(每一个sql,就是一个sql,无法和其它同类sql共用)来说,已经是很少的硬解析了。

你可能感兴趣的:(Java,Oracle)