myBatis官方對參數"defaultExecutorType"是這樣說明的。有這樣三種執行器, SIMPLE是普通的執行器;REUSE執行器會重用預處理語句(prepared statements);BATCH執行器將重用語句並執行批量更新。那么應該可理解為:
- 設為"SIMPLE",(SimpleExecutor) 在執行bookDao.save(book)時,就相當於JDBC的stmt.execute(sql);
- 設為"REUSE",(ReuseExecutor) 在執行bookDao.save(book)時,相當於JDBC重用一條sql,再通過stmt傳入多項參數值,然后執行stmt.executeUpdate()或stmt.executeBatch();
- 設為"BATCH", (BatchExecutor)在執行bookDao.save(book)時,相當於JDBC語句的 stmt.addBatch(sql),即僅僅是將執行SQL加入到批量計划。 所以此時不會拋出主鍵沖突等運行時異常,而只有臨近commit前執行stmt.execteBatch()后才會拋出異常。
BaseExecutor,它是抽象類,三個執行器類型都繼承它。
調用棧如下:

那mybatis是如何確定使用哪種的執行器的呢?默認值可以通過<setting name="defaultExecutorType" value="REUSE"/>配置,不配置則為SIMPLE,如上所示。
一種是編寫代碼的時候通過org.apache.ibatis.session.SqlSessionFactory#openSession(org.apache.ibatis.session.ExecutorType)指定類型。
除此之外,還有一個CachingExecutor,實現Executor接口,它有一個重要屬性delegate,保存的是某類普通的Executor,值在構造時傳入。執行數據庫update操作時,它直接調用delegate的update方法,執行query方法時先嘗試從cache中取值(其實現是org.apache.ibatis.cache.decorators.TransactionalCache,二級緩存),取不到再調用delegate的查詢方法,並將查詢結果存入cache中。
