トランザクション その10 DaoからHandleを取得する with Mixin
今まで、DBIオブジェクト or HandleオブジェクトからDaoを取得してきましたが、今度は逆にDaoからHandleオブジェクトを取得してみましょう。取得するには、「getHandle」メソッドを宣言すればいいのですが、今回は予めJDBI側で用意されているMixin用のinterfaceをextendsしてみます。別に使いはしませんが、一応今のとこ用意されている他のMixinも全部extendsしてみました。org.skife.jdbi.v2.sqlobject.mixins パッケージ配下にあります。
Dao016.java
public interface Dao016 extends CloseMe, GetHandle, Transactional<Dao016> { @SqlUpdate("insert into table001 (id, name) values (:id, :name)") int insert(@Bind("id") int id, @Bind("name") String name); }
Sample025.java
private static Handle otherHandler = null; private static Dao016 dao; public static void main(String[] args) { String url = "jdbc:postgresql://192.168.52.128/jdbi"; DBI dbi = new DBI(url, "jdbi_user", "jdbi_pass"); dao = dbi.onDemand(Dao016.class); otherHandler = dbi.open(); otherHandler.insert("truncate table table001"); txSuccess(); txError(); otherHandler.close(); } public static void txSuccess() { System.out.println("[0] : count = " + countTable001()); // 0 try { dao.begin(); dao.insert(1, "name1"); System.out.println("[1] : count = " + countTable001()); // 0 dao.insert(2, "name2"); dao.getHandle().commit(); } catch(Throwable e) { dao.getHandle().rollback(); e.printStackTrace(); } System.out.println("[2] : count = " + countTable001()); // 2 } public static void txError() { System.out.println("[0] : count = " + countTable001()); // 2 try { dao.begin(); dao.insert(3, "name3"); System.out.println("[1] : count = " + countTable001()); // 2 dao.insert(3, "name4"); // エラー dao.getHandle().commit(); } catch(Throwable e) { dao.getHandle().rollback(); e.printStackTrace(); } System.out.println("[2] : count = " + countTable001()); // 2 } public static int countTable001() { return otherHandler.createQuery("select count(*) from table001").map(IntegerMapper.FIRST).first(); }