zoukankan      html  css  js  c++  java
  • Ibatis的#和$的区别

    来自别人的:https://blog.csdn.net/findmyself_for_world/article/details/49976555

    总结:凡是#的,都作为参数,用setobject方式预编译。而$方式的,则直接替换字符串。$很不安全,可能出现sql注入攻击风险。

    在实际中,除了like语句外,也有人经常对in参数使用$$,如a.ORDER_STATUS in( $orderStatus$ ) 

    对于一条简单的sql语句,例如:

    Select * from user where id=#id#

    Ibatis会把sql预编译为

    select * from user where id=?

    接着会把传入的值进行填充,类似于jdbc的preparestatment的形式。

    之前的sql是简单的形式,加入需要用到模糊查询的like就比较麻烦,而且可能会出现sql注入的情况。

    假如需要查询用户名中带"sa"的用户,可能会这样来写sql

    select * from user where name like '%sa%'

    但是在ibatis的xml中不能这样写,如果写成

    select * from user where name like #%sa%#或者like %#sa#%是肯定不行的,会有报错。

    有个很简单的办法,就是写成

    select * from user where name like '%$name$%'

    的样子,$符号会把参数原样嵌入sql语句中而不进行预编译,这就使得有可能出现sql注入攻击。其实ibatis从根本上简单的说,凡是#的,都作为参数,用setobject方式预编译。而$方式的,则直接替换字符串。 所以说,$很不安全,会把用户的输入直接当参数放入sql。

    结论:最好不要用like来进行查询,1是因为效率低,2是因为在ibatis里使用是相当麻烦的,可读性很差,如果真的要用,不要使用$,而是使用#的like拼凑形式:

    select * from user where name like '%'||#name#||'%';

     

  • 相关阅读:
    两种方式创建Maven项目【方式二】
    两种方式创建Maven项目【方式一】
    《Java程序设计》第二周学习记录(1)
    《Java程序设计》第一周学习记录(2)
    《Java程序设计》第一周学习记录(1)
    《Java程序设计》第一周学习总结
    Python isinstance
    笔记:Struts2 Action 非泛型集合元素类型转换
    笔记:Struts2 输入校验
    笔记:Struts2 国际化
  • 原文地址:https://www.cnblogs.com/juanzila/p/8691860.html
Copyright © 2011-2022 走看看