1:概念
Mybatis中sql语句共有三种执行方式
选项 | 说明 |
---|---|
STATEMENT | 直接操作sql,不进行预编译,获取数据:$–Statement |
PREPARED | 预处理,参数,进行预编译,获取数据:#–PreparedStatement |
CALLABLE | 执行存储过程—CallableStatement |
MyBatis默认使用PREPARED方式,即#{}
。
传入的参数在SQL中显示不同
使用${}
方式传入的参数,mybatis不会对它进行特殊处理,而使用#{}
传进来的参数,mybatis默认会将其当成字符串。可能在赋值给如id=#{id}
和id=${id}
看不出多大区别,但是作为表名或字段参数时可以明显看出,
例:1
2
3
4selec * from #{table};
- 解析后为:select * from "test";
select * from ${table};
- 解析后为:select * from test;前者转换为字符串,会查询失败。所以对于传入分组(order)字段或者排序字段(order),应使用${},避免出现
order by "id"
等情况。#和$在预编译处理中是不一样的。
#类似jdbc中的PreparedStatement,对于传入的参数,在预处理阶段会使用?代替,比如:1
select * from student where id = ?;
真正查询时才会带入参数,而而${}则是简单的替换
1
select * from student where id = 2;
2:总结
- 传入的参数在SQL中显示不同
#{}
可以防止sql注入,能使用#{}
的地方应该使用#{}
${}
方式一般用于传递数据库对象,例:表名,字段名,甚至sql语句
3:参考
MyBatis分页