数据库的执行类似于Java的编译执行过程。
SQL语句翻译为执行计划,才能执行。
SQL语句完全一样的情况下会重用执行计划。
关于执行计划:
1.任何SQL执行过程都是先编译“执行计划”,再执行“执行计划”
2.数据库为了优化性能,在SQL相同时候,会重用执行计划
-执行计划编译较慢
-重用执行计划可以提高数据库性能
3.数据库只在SQL语句完全一样的时候才重用相同的执行计划
-如果SQL语句中有一个字符的更改,也会执行不同的执行计划
-SQL中一个空格或者一个大小写不同也会创建不同的执行计划
>PreparedStatement 好处是可以重复使用执行计划,提高DB效率
使用步骤:
1。将带参数的SQL发送到数据库创建执行计划
2。替换执行计划中的参数
3。执行执行计划,得到结果
PreparedStatement原理
-Statement主要用于执行静态SQL语句,即内容固定不变的SQL语句。
-Statement每执行一次都要对传入的SQL语句编译一次,效率较差。
-某些情况下,SQL语句只是其中的参数有所不同,其余子句完全相同,适用于PreparStatement
-预防SQL注入攻击
何为注入攻击:
用户输入了含有SQL成分的参数,参数在拼接SQL时造成SQL语句的语义改变!进一步改变SQL语句的执行计划!最终的执行结果就完全改变!
如何避免:
1.拦截用户输入的SQL成分
2.固定执行计划,避免改变执行逻辑
主要是防止statement执行计划时,用户在输入密码是做了sql拼接工作,直接输入成了万能密码。
下面的代码重复执行了同一个执行计划,做到了计划的重用。
插入语句:
查询语句:
更新语句: