您的位置:首页 > 其它

ibatis的$param$与#param#的区别

2014-05-13 14:28 204 查看
对于ibatis或者mybatis的初学者而言,这个开源项目(ibatis升级为mybatis所以可以看做是整体一个项目)最为精髓的地方实际是配置各个POJO的XML文件的书写,进一步具体而言则是将动态参数(后面讨论以java程序开发为例)传入到SQL当中,拼接成为带有参数的SQL语句,执行业务的逻辑。而这个核心的过程——拼接SQL和参数的动态注入主要涉及的技术之一就是用#param#或$param$这样的形式传参,比如如下的XML片段

<delete  id  = "deleteUserById"  parameterClass="java.lang.Integer">
delete from vincent_user where id=#id#
</delete>


这里传入的动态参数只有一个,即为一个Integer类型的对象,然后执行的业务逻辑是从vincent_user这个表当中删除id为这个动态参数的那条记录。#id#保证了动态地进行参数的拼接注入。但是实际上跑程序的时候还会发现,对于这个例子,改成下面的样子,依然可以实现并不妨碍功能

<delete  id  = "deleteUserById"  parameterClass="java.lang.Integer">
delete from vincent_user where id=$id$
</delete>

所以,这里就产生了问题,$param$和#param#这两种参数动态传入的方式有什么区别?到底是不是可以互相替换?如果二者存在不同,那么两者分别适用于什么样的场合?如果应用场合不正确,那么产生的后果严重之处在哪里?

其实这个问题笔者做讨论,还有另一个直接触发,那就是工作当中涉及到模糊查询的bug解决。涉及到like 运算符和%%等使用的问题,同时涉及到几种数据库的分别适应问题(也就是说Oracle MySQL SQLServer等产品要分别处理),而处理思路有用$param$也有用#param#的实现模糊查询,不知道这两种哪种方案更好,这也是讨论此问题的一个触发。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

简单而言##和$$的共同之处都是用来做SQL的动态参数的拼接,而不同的地方是##是会根据参数的类型做,而$$仅仅是非常直接了当地拼接字符串。具体的说##所谓根据参数的类型做,其实就是当参数声明为String类型的时候,会在字符串拼接的时候两边加上双引号或单引号。

所以说,$param$这个假设用来做模糊查询的方案,就会有潜在的SQL注入的安全问题,要规避SQL注入的问题就得使用#param#这样的形式,那么$param$的用处有哪些呢?其实也是有用的,并不是没有用。当业务逻辑当中倘若是要动态传数据表、视图名称甚至是数据库,那么这个$param$就有用了,比如最为典型的就是MySQL数据库数据量极大的情况下做了分表操作之后。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: