MySql预编译笔记

查询mybatisXML文件中#和$占位符时,在MyBatis之#与¥区别以及sql预编译一文中有以下解释:

#{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。

¥{ } 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换,${ } 在预编译之前已经被变量替换了,这会存在 sql 注入问题

对于Sql预编译问题,探究mysql预编译预编译语句介绍,以mysql为例两篇博客解释的很清晰,以下是我的理解:

预编译分为服务器预编译(ServerPreParedStatement)和客户端预编译(ClientPrepareStatement),我理解的服务器是指mysql数据库;客户端是指jdbc驱动。

在jdbc驱动5.0.5版本后的版本默认关闭服务器预编译,需要指定 useServerPrepStmts=true 开启。

但是仅仅开启服务器预编译并不能提高效率,只有当指定 cachePrepStmts=true 同时开启预编译缓存时,对于频繁使用的语句才有可观的提升;对于不频繁使用的语句,服务端预编译本身会增加额外的round-trip,使用客户端预编译效率更高(+客户端缓存会有微小提升)。

猜你喜欢

转载自blog.csdn.net/BZeHong/article/details/86776851