クイックスタート
あらかじめセットアップを完了させてください。
このクイックスタートでは、PostgreSQLにサンプルテーブルとデータを用意し、取得と更新を行います。
DDL、データベースの接続情報、方言(Dialect)の実装を書き換えれば他のRDBMSでも動作します。 (現在、サポートしているデータベースは、DB2、H2 Database Engine、HSQLDB、Microsoft SQL Server 2008、MySQL、Oracle Database、PostgreSQLです。)
サンプルテーブルの作成
データベースに従業員テーブルを作成し、データを登録します。テーブルの定義とデータは次のとおりです。
create table EMPLOYEE ( EMPLOYEE_ID integer not null primary key, EMPLOYEE_NAME varchar(20), HIREDATE date, SALARY numeric(7,2), VERSION_NO integer ); insert into EMPLOYEE values(1, 'SMITH', '1980-12-17', 800, 1); insert into EMPLOYEE values(2, 'ALLEN', '1981-02-20', 1600, 1); insert into EMPLOYEE values(3, 'WARD', '1981-02-22', 1250, 1);
JDBCドライバのダウンロードと設定
Postgre SQLのJDBCドライバは次のサイトからダウンロードできます。 Domaは、JDBC 4 をサポートしているため、JDBC 4 に対応するドライバを使用できます。
ダウンロードしたら開発環境のクラスパスに追加して使用してください。
また、実行時にドライバがロードされるように、次の設定を行ってください。
- クラスパスが通ったところに「META-INF/services」ディレクトリを作成します。
- 「META-INF/services」ディレクトリに「java.sql.Driver」ファイルを作成します。
- 「java.sql.Driver」ファイルにJDBCドライバのクラス名を記述します。
org.postgresql.Driver
エンティティクラスの作成
テーブルにマッピングするエンティティクラスを作成します。 エンティティであることを示すために@Entityを注釈します。
主キーには@Id、楽観的排他制御で使用するバージョン番号には@Versionを注釈します。
プロパティのフィールドは、非private
にします。
package example; import java.math.BigDecimal; import java.sql.Date; import org.seasar.doma.Entity; import org.seasar.doma.Id; import org.seasar.doma.Version; @Entity public class Employee { @Id Integer employeeId; String employeeName; Date hiredate; BigDecimal salary; @Version Integer versionNo; public Integer getEmployeeId() { return employeeId; } public void setEmployeeId(Integer employeeId) { this.employeeId = employeeId; } public String getEmployeeName() { return employeeName; } public void setEmployeeName(String employeeName) { this.employeeName = employeeName; } public Date getHiredate() { return hiredate; } public void setHiredate(Date hiredate) { this.hiredate = hiredate; } public BigDecimal getSalary() { return salary; } public void setSalary(BigDecimal salary) { this.salary = salary; } public Integer getVersionNo() { return versionNo; } public void setVersionNo(Integer versionNo) { this.versionNo = versionNo; } @Override public String toString() { return "Employee [employeeId=" + employeeId + ", employeeName=" + employeeName + ", hiredate=" + hiredate + ", salary=" + salary + ", versionNo=" + versionNo + "]"; } }
設定クラスの作成
データベースアクセスに関する設定情報を提供するクラスを作成します。 ここでは、PostgreSQLのデータソースと方言を利用することを示します。
DomaAbstractConfig
を継承すると簡単に作成できます。
package example; import javax.sql.DataSource; import org.seasar.doma.jdbc.DomaAbstractConfig; import org.seasar.doma.jdbc.SimpleDataSource; import org.seasar.doma.jdbc.dialect.Dialect; import org.seasar.doma.jdbc.dialect.PostgresDialect; public class AppConfig extends DomaAbstractConfig { private static DataSource dataSource = createDataSource(); private static Dialect dialect = new PostgresDialect(); @Override public DataSource getDataSource() { return dataSource; } @Override public Dialect getDialect() { return dialect; } private static DataSource createDataSource() { SimpleDataSource dataSource = new SimpleDataSource(); dataSource.setUrl("jdbc:postgresql://localhost/demo"); dataSource.setUser("postgres"); dataSource.setPassword("postgres"); return dataSource; } }
Daoインタフェースの作成
データアクセスを行うためのData Access Object(Dao)インタフェースを作成します。 Daoであることを示すために@Daoを注釈します。 @Daoのconfig要素には、先ほど作成したAppConfigクラスを指定してください。
検索のメソッドには@Select、更新のメソッドには@Updateを注釈します。
package example; import org.seasar.doma.Dao; import org.seasar.doma.Select; import org.seasar.doma.Update; @Dao(config = AppConfig.class) public interface EmployeeDao { @Select Employee selectById(Integer employeeId); @Update int update(Employee employee); }
selectByIdメソッドに、対応するSQLファイルが存在しないことを示すエラーが表示されることを確認します。
SQLファイルの作成
selectByIdメソッドに対応するSQLファイルを作成します。 SQLファイルのパスは「META-INF/example/EmployeeDao/selectById.sql」にします。 このパスはクラスパスに通っていなければいけません。
select * from employee where employee_id = /* employeeId */99
ファイルを作成したら、EmployeeDao
を再度ビルドしてください。
ビルドをするとSQLファイルの存在チェックが再度行われエラーが消えます。
また、ビルドが成功すると、インタフェースと同じパッケージにEmployeeDaoImpl
という実装クラスが自動生成されます。
データベースアクセスは、この実装クラスをインスタンス化しておこないます。
起動クラスの作成
エンティティやDaoを利用してデータベースアクセスを行います。
package example; public class Main { public static void main(String[] args) { EmployeeDao dao = new EmployeeDaoImpl(); Employee employee = dao.selectById(3); employee.setEmployeeName("KING"); dao.update(employee); } }
ここでは、従業員テーブルから1件を主キーで検索し、従業員名を更新しています。
実行結果(実行時のログ出力)
実行すると、java.util.logging.Logger
を使用したログがコンソールに出力されます。
わかりやすいように、検索処理のログと更新処理のログの間に空行を入れています。
2009/10/01 21:39:46 example.EmployeeDaoImpl selectById 情報: ENTRY 2009/10/01 21:39:46 example.EmployeeDaoImpl selectById 情報: META-INF/example/EmployeeDao/selectById.sql 2009/10/01 21:39:47 example.EmployeeDaoImpl selectById 情報: select * from employee where employee_id = 3 2009/10/01 21:39:47 example.EmployeeDaoImpl selectById 情報: RETURN Employee [employeeId=3, employeeName=WARD, hiredate=1981-02-22, salary=1250.00, versionNo=1] 2009/10/01 21:39:47 example.EmployeeDaoImpl update 情報: ENTRY 2009/10/01 21:39:47 example.EmployeeDaoImpl update 情報: update EMPLOYEE set EMPLOYEE_NAME = 'KING', HIREDATE = '1981-02-22', SALARY = 1250.00, VERSION_NO = 1 + 1 where EMPLOYEE_ID = 3 and VERSION_NO = 1 2009/10/01 21:39:47 example.EmployeeDaoImpl update 情報: RETURN 1