ニコニコフレームワーク/JDBC

ニコニコフレームワークは永続化サポートとして、JDBCでのデータベースアクセスを簡単に行うための機能を提供します。

準備

永続化サポートとしてJDBCを使用するにはframework.propertiesで以下の設定を行います。

...
persistenceManager=jp.sf.nikonikofw.persistence.jdbc.JdbcPersistenceManager

persistence.jdbc.driver=<JDBCドライバのクラス名>
persistence.jdbc.url=<接続URL>
persistence.jdbc.user=<接続ユーザ>
persistence.jdbc.password=<パスワード>
persistence.jdbc.naming=<エンティティ名とテーブル名の変換を行うクラス>
...

persistence.jdbc.namingは省略可能です。省略した場合はjp.sf.nikonikofw.persistence.jdbc.DefaultNamingが使用されます。

エンティティの作成

エンティティを作成します。エンティティは通常のJavaBeanです。カラムに対応するフィールドには@Columnアノテーション、主キーのフィールドには@PrimaryKeyアノテーションを付与します。

public class Employee {
  @PrimaryKey
  @Column
  private Long empId;

  @Column
  private String empName;

  // setterやgetter
  ...
}

マッピングするテーブル名やカラム名を明示的に指定する場合は@Tableアノテーションや@Columnアノテーションのname属性を指定します。

@Table(name="EMP")
public class Employee {
  @PrimaryKey
  @Column(name="EMPID")
  private Long empId;

  @Column(name="EMPNAME")
  private String empName;

  // setterやgetter
  ...
}

エンティティのフィールドのうち、transientのものはINSERTやUPDATE対象外になります(SELECT結果はマッピングされます)。

JdbcUtilを使う

作成したエンティティを使用してデータベースアクセスを行うにはJdbcUtilクラスのstaticメソッドを使用します。

以下にエンティティを使用した検索例を示します。

// 1件取得
Employee emp = JdbcUtil.getSingleResult(
  Employee.class, "SELECT * FROM EMP WHERE EMPID=?", empId);

// 複数件取得
List<Employee> empList = JdbcUtil.getResultList(
  Employee.class, "SELECT * FROM EMP ORDER BY EMPID");

更新についてはSQLを一切記述せずに行うことができます。

// 挿入
Employee emp = new Employee();
emp.empName = "Naoki Takezoe";
JdbcUtil.insert(emp);

// 更新
Employee emp = ...
JdbcUtil.update(emp);

// 削除
Employee emp = ...
JdbcUtil.delete(emp);

また、エンティティを使わずに任意のSQLを実行することもできます。

// EMPテーブルを全件削除
JdbcUtil.execute("DELETE FROM EMP");

リレーションの表現について

ニコニコフレームワークのO/Rマッピング機能ではエンティティ間のリレーションを表現することはできません。他のテーブルと結合して値を取得するような検索を行う場合は結果をマッピングするための専用のエンティティ(DTO)を作成します。

作成方法やアノテーションの利用方法は通常のエンティティの場合と同じですが、検索にしか使用しないエンティティ(DTO)の場合、@Tableアノテーションや@PrimaryKeyアノテーションは意味がありません。

public class EmployeeSearchResultDto {
  public Long empId;
  public String empName;
  public Long groupId;
  public String groupName;
}

...

List<EmployeeSearchResultDto > empList = JdbcUtil.getResultList(
  EmployeeSearchResultDto .class,
  "SELECT E.EMP_ID, E.EMP_NAME, E.GROUP_ID, G.GROUP_NAME " +
  "FROM EMPLOYEE E, GROUP_INFO G " +
  "WHERE E.GROUP_ID = G.GROUP_ID");

トランザクションについて

ニコニコフレームワークではControllerServletによって自動的に1リクエスト=1トランザクションとしてトランザクションの制御が行われます。正常に処理が終了した場合はコミットされ、例外がスローされた場合はロールバックされます。

個別にトランザクションの制御を行う場合、以下のようにConfigオブジェクトからJdbcPersistenceManager経由でConnectionオブジェクトを取得し、自前でトランザクションを制御することができます。

JdbcPersistenceManager manager = (JdbcPersistenceManager) Config.getPersistenceManager();
Connection conn = manager.getConnection();
conn.begin();
try {
  ...
  conn.commit();

} catch(Exception ex){
  conn.rollback();
}