SQL绑定变量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JacXuan/article/details/79163950

在 oracle 中,使用

 select  * from dual where t = :t

select  * from dual where t = ‘test’

性能要高出二十倍左右。
前一种就是使用绑定变量的方式。如果没有使用绑定变量,oracle 将会对每一条执行的 sql 进行解析再执行。

那么我们怎么使用在 jdbc 和 mybatis 中使用绑定变量呢?

一:jdbc
jdbc使用绑定很简单

PreparedStatement pstmt = conn.prepareStatement("select * from t1 where c1=?");  
pstmt.setString(1, "abc");  
pstmt.execute(); 

就可以实现预解析。

二:mybatis
其实使用 mybatis 我们在不知不觉中就使用量绑定变量的方式执行 sql。这涉及 mybatis 中 ‘#’ 和 ‘$ ‘的区别。

mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现。
比如同一条 sql

select * from dual where t = #{test}

’ #{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:

select * from dual where t = ?

这就和 jdbc 绑定变量的方式一样了。

select * from dual where t = ${test}

${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句

select * from dual where t = '参数'

预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了。

综上所得, ${ } 变量的替换阶段是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS 中。

当然,使用绑定变量除了优化 SQL 查询性能之外,还可以防止 sql 注入。使应用安全上升多个等级。
至于它是如何做到的,以后深入了解了再总结。

展开阅读全文

没有更多推荐了,返回首页