ibatis 绑定变量 sql硬软解析

本文探讨了在使用MyBatis时如何避免SQL硬解析,包括使用绑定变量、正确处理IN条件、存储过程中的绑定变量应用以及检查和优化SQL查询的硬解析问题。通过实例分析,提供了解决硬解析的有效方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于避免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共用)来说,已经是很少的硬解析了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值