zoukankan      html  css  js  c++  java
  • ibatis和sql

    Ibatis是一个半自动框架,所谓的半自动,就是可以以比hibernate自由的多的形式来写sql,来执行sql的框架。

    Ibatis的sql都是通过xml配置,其中,可以使用insert,update,delete,select,sql,statement,procedure,include这些标签来增强sql的自由性。

    Ibatis的标签

    映射语句的类型和相关的xml有:

    语句类型

    属性

    子元素

    用途

    select

    Id

    parameterClass

    resultClass

    parameterMap

    resultMap

    cacheModel

    所有动态元素

    用于选择

    Insert

    Id

    parameterClass

    parameterMap

    所有动态元素

    selectKey

    插入

    update

    Id

    parameterClass

    parameterMap 

    所有动态元素

    更新

    delete

    Id

    parameterClass

    parameterMap

    所有动态元素

    删除

    procedure

    Id

    parameterClass

    resultClass

    parameterMap

    resultMap

    xmlResultName

    所有动态元素

    调用存储过程

    statment

    Id

    parameterClass

    resultClass

    parameterMap

    resultMap

    xmlResultName

    所有动态元素

    可以代表所有语句的类型,几乎可以用来执行所有的操作

    sql

    Id

    所有动态元素

    Sql片段

    Include

    refid

    可以用来将<sql>片段插入到已经映射的语句中

     

    Sql注入

    SQL注入攻击(SQL injection),简称注入攻击,是发生于数据库层的安全漏洞。简单的说,是在输入的数据字符串之中夹带SQL指令,如果在设计不良的程序当中忽略了检查,那么这些夹带进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此破坏系统。

    例如:

    某个网站的登录验证的SQL查询代码为

    strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"

    恶意填入

    userName = "' OR '1'='1";

    passWord = "' OR '1'='1";

    时,将导致原本的SQL字符串被填为

    strSQL = "SELECT * FROM users WHERE (name = '' OR '1'='1') and (pw = '' OR '1'='1');"

    也就是实际上运行的SQL命令会变成下面这样的

    strSQL = "SELECT * FROM users;",导致将所有的信息查询出来。

     

    Ibatis的#和$

    对于一条简单的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#||'%';

  • 相关阅读:
    vant ui 在vue中的安装和使用
    vue-element-admin完整项目实例
    关于Vue中main.js,App.vue,index.html之间关系进行总结
    vue 集成 element ui
    springboot写入数据库汉字变问号???
    import declarations are not supported
    基于Idea从零搭建一个最简单的vue项目
    idea中执行“npm”命令,提示node 不是内部或外部命令,也不是可运行的程序
    Intellij IDEA 中如何 给Maven添加依赖
    圆圈中最后剩下的数字
  • 原文地址:https://www.cnblogs.com/xiziyin/p/1630007.html
Copyright © 2011-2022 走看看