在项目中使用orm框架Mybatis对数据库进行相关操作,使用Mybatis最大的好处是可以使用动态sql。所谓动态sql就是Mybatis对sql进行预编译之前会对sql语句进行动态解析,动态解析处理之后会进行预编译,最后数据库驱动再发送sql和参数到DB执行。
Statement的执行机制
Statement的excute方法直接将SQL语句作为参数传入并提交给数据库执行 -> 数据库引擎对SQL语句进行编译得到数据库可执行代码 -> 执行SQL语句。这就表示,每次提交SQL都需要经过编译再执行。
预编译执行机制
一、预编译语句
通常一条SQL从被数据库接收到执行完毕返回,会经历以下三个过程:
- 词法和语义解析;
- 优化sql语句,制定执行计划;
- 执行并返回结果。
在很多情况下,一条SQL语句可能需要反复执行,或者每次执行的时候只有个别的值不同(比如query的where子句值不同,update的set子句不同,insert的values值不同)。如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行了。预编译语句就是将上述sql语句中的值用占位符替代,可以视为将sql语句模板化或者说参数化。
二、PreparedStatement的预编译机制
- 获取预编译语句:数据库驱动在发送sql和参数到DB之前,会先调用Connection.prepareStatement(String sql)方法将该sql语句直接提交给MySQL数据库服务器进行编译处理(获取预编译语句可以从三个渠道获取:本地缓存的预编译语句、调用MySQL服务