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#||'%';

     

  • 相关阅读:
    2016-7-4工作总结
    2016-7第一周工作总结
    2016-6-30 工作总结
    2016-6-29 工作总结
    2016-6-28 工作总结
    基于软件开发对嵌入式开发的思考
    团队项目总结
    软件工程课程总结
    图描述之:流程图
    004-二叉树的遍历
  • 原文地址:https://www.cnblogs.com/juanzila/p/8691860.html
Copyright © 2011-2022 走看看