Mybatis3.3.x技术内幕(五):Executor之doFlushStatements()
这天气,热的我满头大蒜。 在上一篇博文 《五鼠闹东京之执行器Executor设计原本》 中,已经对 Executor做了比较详细的分析,但是,测试妹纸阅读完后,表示某些地方看不懂,毫不客气的给我提出了两点修改意见。 一、看完你的Statement和PrepareStatement批处理原理图,依然不明白为何一个编译Sql 3次,而另外一个编译Sql 1次。 二、对关闭Statement对象一笔带过,不够清晰。 我准备亡羊补牢,针对上面的两个问题进行补充完善。 1.Statement和PrepareStatement在批处理时对Sql的编译策略 insert into students(id) values(1); insert into students(id) values(1); insert into students(id) values(2); insert into students(id) values(3); 上面的4个Sql,无论是Statement,还是PrepareStatement,对Sql都编译3次。因为其中第1、2条Sql是完全相同的,只会编译1次。 insert into students(id) values(?); // id=[1,2,3] 对于 PrepareStatement,支持问号“?”占位符