1.占位符sql
1.1 含义: 缓存
在持久化框架中,为了将约束条件中的可变参数从sql中分离出来,在原有的参数位置使用特殊的标记来标记该位置,后期经过代码给sql传递参数(即实现sql与代码分离开)。这个特殊的标记被称为占位符。安全
1.2 优势:服务器
1.2.1 防止sql注入,提升了安全性mybatis
1.2.2 对于只有参数不一样的sql语句,只须要编译一次{之后会从缓存中获取} 框架
1.3 形式:spa
占位符在持久化框架中的通常形式为:?。Mybatis为了更加方便的与参数列表进行映射,采用的形式为:#{参数名}code
1.4 示例:blog
SELECT * FROM t_address t where t.id = #{id} --等价于 SELECT * FROM t_address t where t.id = ?
1.5 注意:字符串
占位符只能在约束条件中使用
--持久化框架中,不容许如下形式: SELECT * FROM ? SELECT * FROM t_address order by ? --mybatis中,不容许如下形式 SELECT * FROM #{tableName} SELECT * FROM t_address order by #{orderBy}
2. 拼接符
2.1 背景:
因为占位符只能在sql语句的约束条件中使用,有时候sql语句须要其它的一些变量参数(非约束条件中)来控制,如:表名、排列顺序等。因此Mybatis使用了拼接符的概念
2.2 形式:${参数名}
2.3 示例:
SELECT * FROM ${tableName}
2.4 注意:
若是参数经过用户获取,则不能使用拼接符的形式【会发生sql注入,不安全】
3. 补充:
在进行预编译的时候,会用参数值直接替换${参数名},用?替换#{参数名}
4. sql注入
4.1 概念:
将sql语法里的一些组合,经过表单提交或页面请求注入到sql语句中,欺骗服务器执行恶意sql语句
4.2 示例:
String id = “1 or 1 = 1”; String sql = “select * from t_address where id = ”+id;
4.2 防止sql注入的方法:
对于表单提交的数据,使用占位符的形式构建sql语句(占位符不识别参数的sql语法【做为普通字符串】)
String id = “1 or 1 = 1” String sql = “select * from t_address where id = ?” //解析后: select * from t_address where id = ‘1 or 1 = 1’;