2013年7月1日月曜日

JavaでのRDBMSのユニークキーの制御方法

RDBMSで永続データを管理する場合、RDBMS側でユニークキーを制御すると簡単です。
しかし、要件によってはRDBMSでは無く、アプリケーション側で制御しなければならない時もあります。
例えば、ある項目はユニークにしなければならないが、テーブルは削除フラグを用いる為、実質ユニークにならないみたいな場合です。

そんな時、アプリケーションでRDBMSのユニークチェックをするサンプルプログラムをメモとして記載したいと思います。

目次

  1. 前提条件
  2. サンプルプログラム

前提条件

  • Windows XP Pro 32bit
  • RDBMS:MySQL5.5
  • java 1.7.XX

サンプルプログラム

以下のようなサンプルで実行します。
想定する例として、hogeというテーブルに対して、行を更新・追加する前にユニークキーである列hogeに対し、ロックをかけ、ユニークだったらtrue、ユニークでなかったらfalseを返す例です。

既存行の更新の為のユニークチェックとして、該当行が自分自身だった場合除外するという設定にしております。

package test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;


public class UniqueTest {
 public boolean isUnique(Hoge entity, Connection con) throws SQLException {
  ResultSet rs                = null;
  PreparedStatement statement = null;
  List<Hoge> list = null;
  boolean check              = false;
  
  try {
   
   StringBuilder sql = new StringBuilder();
   sql.append(" select ");
   sql.append("  * ");
   sql.append(" from ");
   sql.append("   hoge");
   sql.append(" where");
   sql.append("     hoge = ?");// hogeがuniqueキー
   sql.append(" for update");// or lock in share mode ロックをかける

   statement = con.prepareStatement(sql.toString());
   statement.setString(1, "key");
   
   rs = statement.executeQuery();
   //getObjectFromResultSetはResultSetをマッピングする。ここでは割愛
   list = DaoUtil.getObjectFromResultSet(rs, mapping);
   //ユニークチェック
   //HogeクラスはequalsをOverrideしている
   /*
    * ユニーク対象の自信をユニーク対象から外し、且つ、複数の場合はfalseとしている
    */
   if (list.size() > 0 && !entity.equals(list.get(0)) || list.size() > 1) {
    check = false;
   } else {
    check = true;
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   //ResultSetクローズ
   if (rs != null) {
    try {
     rs.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
   //statementクローズ
   if (statement != null) {
    try {
     statement.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
  }
  return check;  
 }
}

Written By : // 18:00
Category:

0 コメント:

コメントを投稿

 

About

このブログは筆者の備忘録として色々記載しています。
Powered by Blogger.