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

原文地址:https://www.cnblogs.com/xiziyin/p/1630007.html