About

ドキュメント

プロジェクト文書

Built by Maven

概要

このページでは、Domaを使用したデータベースアクセスに最低限必要な手順のみを説明します。

Domaが提供する機能を知りたい場合は、チュートリアルリファレンスを参照してください。

クイックスタート

あらかじめセットアップを完了させてください。

このクイックスタートでは、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