rewriteBatchedStatements的作用是什么?

112 阅读1分钟

以下是我的测试代码

如果rewriteBatchedStatements为false,那么以上代码相当于执行两次insert:

  1. insert into user_info (name) values ('dadudu')
  2. insert into user_info (name) values ('zhouyu')

但如果rewriteBatchedStatements改为true,那么以上代码就只会执行一次insert:

  1. insert into user_info (name) values ('dadudu'), ('zhouyu')

通过源码可以证明,在执行preparedStatement.executeBatch();时,底层对应的是ClientPreparedStatement,而它的父类为StatementImpl,其中就有一个rewriteBatchedStatements属性

而执行preparedStatement.executeBatch();最终会执行ClientPreparedStatement中的executeBatchInternal()方法,其中就会判断rewriteBatchedStatements是否true,如果为true,就会执行改写后的SQL(multi values)

而在executeBatchWithMultiValuesClause()中会进行真正的改写,具体改写逻辑本文就不分析了,感兴趣的同学可以自己debug研究,我这里只给大家看看改写之后的结果SQL就可以了:

现在这行代码就是在执行改写后的SQL,通过debug可以看到改写后的SQL为:insert into user_info (name) values (?),(?),也就是把两个insert合并为了一个insert,这样自然就能提高执行性能了。

以上就是本文内容,有收获的同学,记得点赞、分享哦。

我的公众号:「IT周瑜」里面:面试八股文、BAT面试真题、工作内推、工作经验分享、技术专栏等等什么都有,欢迎关注。