以下是我的测试代码
如果rewriteBatchedStatements为false,那么以上代码相当于执行两次insert:
insert into user_info (name) values ('dadudu')
insert into user_info (name) values ('zhouyu')
但如果rewriteBatchedStatements改为true,那么以上代码就只会执行一次insert:
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面试真题、工作内推、工作经验分享、技术专栏等等什么都有,欢迎关注。