ibatis 中#和 $ 符号的区别
- 一、数据类型匹配
- #:会进行预编译,并且进行类型匹配(自动肯定数据类型);
- $:不进行数据类型匹配。
- 二、实现方式:
- # 用于变量替换(先生成一个占位符,而后替换)
- select * from users where name = #name#
- 等效于
- prepareStement=stmt.createPrepareStement("select * from users where name = ?")
- prepareStement.setString (1,' 张三 ');
- $ 的做用其实是字符串拼接()
- select * from users where name= $name$
- 等效于
- StringBuffer sb = newStringBuffer(256);
- sb.append("select * from userswhere name=").append(name);
- sb.toString();
- 三、使用场景
- -#主要用于变量的传递。# 是用 prepareStement,提高效率。#方式通常用于传入添加 / 修改的值或查询 / 删除的 where 条件
- $ 只是简单的字符拼接而已,对于非变量部分, 只能使用 $。$ 方式通常用于传入数据库对象。例如传入表名,select * from $tableName$ 对于不一样的表执行统一的查询
- 四、为何会出现SQL注入?
- $没有预编译,只是字符串替换,因此语句可能被注入,传给数据库时是多条语句;
- 而#会先预编译,验证SQL语句,预防了问题的出现。
- 五、关于预编译的理解:
- 为何须要预编译
- JDBC 中使用对象 PreparedStatement 来抽象预编译语句,使用预编译
- 预编译阶段能够优化 sql 的执行。
- 预编译以后的 sql 多数状况下能够直接执行,DBMS 不须要再次编译,越复杂的 sql,编译的复杂度将越大,预编译阶段能够合并屡次操做为一个操做。
- 预编译语句对象能够重复利用。
- 把一个 sql 预编译后产生的 PreparedStatement 对象缓存下来,下次对于同一个 sql,能够直接使用这个缓存的 PreparedState 对象。
- mybatis 默认状况下,将对全部的 sql 进行预编译。
- 参考附录:
- 说明下,就是$时传给DBMS的时一个Statement对象,该对象会被DBMS先编译后执行;
- 而#时传给DBMS的时一个PrepareStatement 对象,该对象会直接传给DBMS进行编译,DBMS执行时会直接执行编译后的语句。
- 六、参考:
欢迎关注本站公众号,获取更多信息