スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Butterfly PersistenceをGuiceで使う

ORマッピングはコンピューターサイエンスのベトナム戦争なんて言われてたりして、私個人も自分でSQLを書かないと気持ち悪いので、JDBCでやるのが好きです。
しかしJDBCもパラメーターの設定とか、select結果の取得がめんどくさいです。
私がほしいのは、SQLが実行できて、パラメーターが与えやすくて、戻りがMapのListで返ってくる程度のもんですので、自作してもいいんですが、Butterfly Persistenceというライブラリがそういう機能を実装しているので、これを利用することにしました。
普通に使う方法はサイトを見てもらえばよいと思いますので、ここではGuiceを使って呼び出してみます。

GuiceとはGoogleの提供しているDIコンテナです。XMLで依存関係を定義するDIコンテナが多い中、これはXMLを使わずにJavaで定義します。Javaなので単純なスペルミスとか検出してくれるので便利です。
まずは、Guiceの定義クラスです。

import com.google.inject.Binder;
import com.google.inject.Module;
import com.jenkov.db.PersistenceManager;
public class MyModule implements Module {
@Override
public void configure(Binder binder) {
binder.bind(PersistenceManager.class).toProvider(PersistenceManagerProvider.class);
}
}

このソースはPersistenceManagerを要求しているところには、PersistenceManagerProviderから提供すると定義しています。
次にPersistenceManagerProviderです。

import javax.sql.DataSource;
import com.google.inject.Provider;
import com.jenkov.db.PersistenceManager;
import com.jenkov.db.jdbc.SimpleDataSource;
import com.jenkov.db.scope.ScopingDataSource;
public class PersistenceManagerProvider implements Provider {
private static final DataSource dataSource = new SimpleDataSource(
"org.postgresql.Driver",
"jdbc:postgresql://localhost:5432/test", "user", "password");

private static final ScopingDataSource scopingDataSource =
new ScopingDataSource(dataSource);

private static final PersistenceManager persistenceManager =
new PersistenceManager(scopingDataSource);

@Override
public PersistenceManager get() {
return persistenceManager;
}
}

PersistenceManagerが要求された時にgetメソッドが呼ばれて渡されます。
次に実際にPersistenceManagerを利用しているクラスです。

import java.util.List;
import com.google.inject.Inject;
import com.jenkov.db.PersistenceManager;
import com.jenkov.db.itf.IDaos;
import com.jenkov.db.itf.PersistenceException;

public class UserService {
@Inject
private PersistenceManager mgr;

public List getList() throws PersistenceException {
IDaos daos = mgr.createDaos();
List list = daos.getMapDao().readMapList("select * from t_user");
daos.closeConnection();
return list;
}

public void insUser(int id, String name) {
try {
mgr.getScopingDataSource().beginTransactionScope();
IDaos daos = mgr.createDaos();
daos.getJdbcDao().update("insert into t_user(id, name) values (?, ?)", id, name);
mgr.getScopingDataSource().endTransactionScope();
} catch (Exception e) {
mgr.getScopingDataSource().abortTransactionScope(e);
}
}
}

@Injectのアノテーションのある変数にGuiceによってPersistenceManagerが注入されます。
また上のコードではselectを実行してMapのListを取得することや、insert時のパラメーターの与え方が簡単にできることがわかると思います。
最後にmainです。

import java.util.List;
import com.google.inject.Guice;
import com.google.inject.Injector;

public class App
{
public static void main( String[] args ) throws Exception
{
Injector injector = Guice.createInjector(new UspEngineModule());
UserService userService = injector.getInstance(UserService.class);
userService.insUser(3, "ccc");
List list = userService.getList();
System.out.println(list);
}
}

実行結果は以下の通り。

[{id=1, name=aaa}, {id=2, name=bbb}, {id=3, name=ccc}]

スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。