1.GitHubからモジュールをcloneします。
git clone git://github.com/hina0118/play-doma.git
2.cloneしたモジュールを dependencies.yml に追記します。
require:
- play
- doma -> doma
repositories:
- My modules:
type: local
artifact: ${application.path}/../../../[module]
contains:
- doma
3. play dependencies または play deps を実行するとモジュールが追加されます。
play eclipsify 、 play ec にすぐにDomaを使用するための設定を行う処理を追加しています。
Play-Domaモジュールを取り込んだ状態でEclipseプロジェクトを生成すると、Eclipseに取り込んですぐにDomaを使用することができます。
以下の設定が追加された状態でEclipseにプロジェクトを取り込むことができます。
Doma設定クラスは以下のように作成します。
Play frameworkと同じLoggerにログを出力するために play.modules.doma.PlayLogger を用意していますので、必要に応じて切り替えてください。
import javax.sql.DataSource;
import org.seasar.doma.jdbc.DomaAbstractConfig;
import org.seasar.doma.jdbc.JdbcLogger;
import org.seasar.doma.jdbc.dialect.Dialect;
import org.seasar.doma.jdbc.dialect.H2Dialect;
import org.seasar.doma.jdbc.tx.LocalTransaction;
import org.seasar.doma.jdbc.tx.LocalTransactionalDataSource;
import play.db.DB;
import play.modules.doma.PlayLogger;
public class AppConfig extends DomaAbstractConfig {
protected static final LocalTransactionalDataSource dataSource = createDataSource();
protected static final Dialect dialect = new H2Dialect();
protected static final JdbcLogger jdbcLogger = new PlayLogger();
@Override
public DataSource getDataSource() {
return dataSource;
}
@Override
public Dialect getDialect() {
return dialect;
}
@Override
public JdbcLogger getJdbcLogger() {
return jdbcLogger;
}
protected static LocalTransactionalDataSource createDataSource() {
return new LocalTransactionalDataSource(DB.datasource);
}
public static LocalTransaction getLocalTransaction() {
return dataSource.getLocalTransaction(jdbcLogger);
}
}
Daoクラスはnew演算子で実装クラスをインスタンス化することもできますが、以下のように javax.inject.Inject アノテーションを注釈するとモジュール側で実装クラスを探しだしてInjectします。
@javax.inject.Inject
private static UserDao userDao;
Note
Controllerクラスに定義したstaticフィールドに対して有効です。
リクエストの開始、終了、エラー発生時にモジュール側でローカルトランザクションの開始、コミット、ロールバックを制御しています。
そのため、Controllerクラスでは以下のようにシンプルに記述することができます。
public static void index() {
List<User> users = userDao.select();
render(users);
}
以下のHTMLのようにuser.emailと名前を付けられた部品の入力値をDomaのEntity、Domainに対して直接バインドすることができます。
#{form @Application.create()}
<label>MAIL:</label><input type="text" name="user.email">
<label>PASS:</label><input type="password" name="user.password">
<label>NAME:</label><input type="text" name="user.fullname">
<input type="submit" value="insert">
#{/form}
Userクラスが以下のように定義されている場合、
@org.seasar.doma.Entity
public class User {
Integer id; // IDは自動生成
Email email; // Domainクラス
Password password; // Domainクラス
String fullname;
// setter and getter
}
Userクラスには上記HTMLで入力された値が既にバインドされてるのでそのまま使用できます。
public static void create(User user) {
userDao.insert(user);
index();
}
.apt_generatedディレクトリに出力されるソースコードはアプリケーション実行時に参照されるようになっていますのでリリース時などは他のソースコードと同じように扱う必要があります。