1.介绍
- MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
- 动态 sql 是 mybatis 的主要特性之一,在mybatis中我们可以把参数传到xml文件,由mybatis对sql及其语法进行解析,mybatis支持使用
{}和#{}的作用一样,其实他们的功能相似,但还是有区别的。
2.区别
(1). 使用${}
方式传入的参数,mybatis不会对它进行特殊处理,而使用#{}
传进来的参数,mybatis默认会将其当成字符串。可能在赋值给如id=#{id}和id=${id}看不出多大区别,但是作为表名或字段参数时可以明显看出,可以看看下面的例子
#{}
解析前:selec * from #{table};
#{}
解析后:select * from "test";
${}
解析前 :select * from ${table};
${}
解析后 :select * from test;
很明显,前者多了字符串的引号,会失败,后者正常查询会成功;
所以对于传入分组(order)字段或者排序字段(order),应使用${}
,避免出现order by "id" 等情况
(2). #
和$
在预编译处理中是不一样的。#类似jdbc中的PreparedStatement,对于传入的参数,在预处理阶段会使用?代替,看看下面的例子:
1).'#{}'待真正查询的时候即在数据库管理系统中(DBMS)才会代入参数
select * from student where id = ?;
2).而'${}'则是简单的替换
select * from student where id = 2;
总结:
1 . 能使用#{}的地方应尽量使用#{}
- 像PreparedStatement ,#{}可以有效防止sql注入,${}则可能导致sql注入成功。所谓sql注入,就是指把用户输入的数据拼接到sql语句后面作为sql语句的一部分执行。例子:
- 用户输入用户名admin和密码123456' or 'abc' = 'abc',那么拼接出来的语句就为
select * from user where name=' admin ' and password='123456' or 'abc'= 'abc';
3.防止sql注入的常见的几种方式:
- jdbc使用 PreparedStatement代替Statement, PreparedStatement 不仅提高了代码的可读性和可维护性.而且也提高了安全性,有效防止sql注入;
- 在程序代码中使用正则表达式过滤参数。使用正则表达式过滤可能造成注入的符号,如' --等;
- 在页面输入参数时也进行字符串检测和提交时进行参数检查,同样可以使用正则表达式,不允许特殊符号出现。