您的位置:首页 > 数据库

ibatis sql中$和#的区别

2016-10-10 11:24 176 查看
情况:

     今天碰到一个情况,就是一个列表页面,有多个刷选条件,如图



其实做起来很简单,相信没有任何难度,就是有些人就是会根据这4个条件各自写一段sql语句来获取数据。但我现在想直接用一条sql语句(其它都是一样的,只是刷选条件不一样),所以我的想法是把刷选的条件,以及刷选的方式(升序,降序)当成类似于变量的方式,这样就比各自写sql要简单很多

问题现象:

       使用过ibatis的人知道我们大部分在传sql参数的时候都是用# #符号的,使用##的好处就是是预编译,提交效率以及防止sql注入问题;还有就是会进行类型匹配(这个自己可以网上查一下,简单的说就是##会根据你的字段的类型自动匹配参数类型)。然后回到我这个问题上,一开始我打算把刷选条、以及刷选的方式直接以参数的方式传进去,这样就可以直接一句sql。但后面发现这样做没有起任何作用,取出的数据没有按照我的刷选条件排序

 解决问题:

     这里回顾一下,我们之前用hibernate的时候,写sql有两种方式。第一种直接sql字符串拼接,然后执行sql;另一种是预处理sql,

select * from users  where name = #name#


 等效于

        prepareStement=stmt.createPrepareStement("select * from users where name = ?")

       prepareStement.setString(1,'张三');

  

所以我上面直接将排序条件、排序方式已##参数的方式传进去,就相当于sql语句以后没有关于排序的语句,参数传进去肯定没有用了!!!

所以我改用$$的形式,传进去是当成sql语句的一部分,而不是预编译,当成变量部分。

 总结

(1)变量的传递, 必须使用#,防止sql注入;# 是用prepareStement,提示效率。

   #方式一般用于传入添加/修改的值或查询/删除的where条件

(2) $只是简单的字符拼接而已,对于非变量部分, 那只能使用$, 实际上, 在很多场合,$也是有很多实际意义的

             $方式一般用于传入数据库对象.例如传入表名.

             例如:

             select  * from  $tableName$  对于不同的表执行统一的查询

             update  $tableName$ set  name = #name#  每个实体一张表,改变不用实体的状态

             特别说明, $只是字符串拼接,所以要特别小心sql注入问题。

      (3)能同时使用#和$的时候,最好用#。

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: