トランザクション その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();
}