ibatis的$param$与#param#的区别
2014-05-13 14:28
204 查看
对于ibatis或者mybatis的初学者而言,这个开源项目(ibatis升级为mybatis所以可以看做是整体一个项目)最为精髓的地方实际是配置各个POJO的XML文件的书写,进一步具体而言则是将动态参数(后面讨论以java程序开发为例)传入到SQL当中,拼接成为带有参数的SQL语句,执行业务的逻辑。而这个核心的过程——拼接SQL和参数的动态注入主要涉及的技术之一就是用#param#或$param$这样的形式传参,比如如下的XML片段
这里传入的动态参数只有一个,即为一个Integer类型的对象,然后执行的业务逻辑是从vincent_user这个表当中删除id为这个动态参数的那条记录。#id#保证了动态地进行参数的拼接注入。但是实际上跑程序的时候还会发现,对于这个例子,改成下面的样子,依然可以实现并不妨碍功能
所以,这里就产生了问题,$param$和#param#这两种参数动态传入的方式有什么区别?到底是不是可以互相替换?如果二者存在不同,那么两者分别适用于什么样的场合?如果应用场合不正确,那么产生的后果严重之处在哪里?
其实这个问题笔者做讨论,还有另一个直接触发,那就是工作当中涉及到模糊查询的bug解决。涉及到like 运算符和%%等使用的问题,同时涉及到几种数据库的分别适应问题(也就是说Oracle MySQL SQLServer等产品要分别处理),而处理思路有用$param$也有用#param#的实现模糊查询,不知道这两种哪种方案更好,这也是讨论此问题的一个触发。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
简单而言##和$$的共同之处都是用来做SQL的动态参数的拼接,而不同的地方是##是会根据参数的类型做,而$$仅仅是非常直接了当地拼接字符串。具体的说##所谓根据参数的类型做,其实就是当参数声明为String类型的时候,会在字符串拼接的时候两边加上双引号或单引号。
所以说,$param$这个假设用来做模糊查询的方案,就会有潜在的SQL注入的安全问题,要规避SQL注入的问题就得使用#param#这样的形式,那么$param$的用处有哪些呢?其实也是有用的,并不是没有用。当业务逻辑当中倘若是要动态传数据表、视图名称甚至是数据库,那么这个$param$就有用了,比如最为典型的就是MySQL数据库数据量极大的情况下做了分表操作之后。
<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数据库数据量极大的情况下做了分表操作之后。
相关文章推荐
- ibatis的$param$与#param#的区别
- IBATIS中 $与#的区别
- Hibernate和MyBatis(ibatis)的区别
- MyBatis/Ibatis中#和$的区别
- ibatis 中 $与#的区别
- ibatis 中 $与#的区别
- ibatis与hibernate有什么区别啊?
- Hibernate VS MyBatis 区别 Hibernate3和MyBatis(iBatis)的执行效率比较
- IBATIS中 $与#的区别
- hibernate和ibatis的区别
- iBatis 到 MyBatis区别
- ibatis中#和$用法区别
- Ibatis中的#和$区别
- iBatis与Mybatis的区别对比
- Mybatis和Ibatis的区别
- web面试常问的一个问题 选用ibatis和hibernate的区别
- ibatis #跟$的区别
- IBATIS中 $与#的区别
- ibatis 到 MyBatis区别