1. 無料アクセス解析

crossroad's Blog

Javaを中心にした技術ネタなど。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

Type safe EnumをS2Daoで永続化する

Type safe Enum と S2Dao の組み合わせ方法についてまとめます。

次のようなBeanを永続化します。

--- example.Person.java ---------------------------
public class Person {
 private String name;
 private BloodType bloodType;

 /* アクセサメソッドは省略 */
}
---------------------------------------------------

ここで使われているBloodTypeは、Type safe Enumパターンで実装されています。
(ここではType safe Enumパターンの説明は割愛します。
 詳しくはEffective Javaを参照。
 尚、JavaSE5.0からは言語レベルでサポートされているのでもっと簡単に書けます)

--- example.BloodType.java ------------------------
public final class BloodType {
 public static final BloodType A = new BloodType("A");
 public static final BloodType B = new BloodType("B");
 public static final BloodType AB = new BloodType("AB");
 public static final BloodType O = new BloodType("O");

 private static final Map bloodTypes = new HashMap();
 static {
  bloodTypes.put("A", A);
  bloodTypes.put("B", B);
  bloodTypes.put("AB", AB);
  bloodTypes.put("O", O);
 }

 private final String type;
 private BloodType(String type) {
  this.type = type;
 }

 public static BloodType valueOf(String type) {
  return (BloodType)bloodTypes.get(type);
 }

 public String getType() {
  return type;
 }
}
---------------------------------------------------

このPersonオブジェクトをS2Daoで永続化したい場合、
S2DaoにBloodTypeとデータベースのカラム型の対応を教える必要があります

データベースにBloodType等と言うカラム型はありませんし、
S2DaoもBloodTypeと言う型は認識していません。

これをS2Daoに認識させるには、にorg.seasar.extension.jdbc.ValueTypeを使います。

--- example.BloodTypeValueType.java ---------------
public class BloodTypeValueType implements ValueType {
 public void bindValue(PreparedStatement ps, int i, Object obj)
   throws SQLException {
  ps.setString(i, ((BloodType)obj).getType());
 }
 public Object getValue(ResultSet rs, int i) throws SQLException {
  return BloodType.valueOf(rs.getString(i));
 }
 public Object getValue(ResultSet rs, String s) throws SQLException {
  return BloodType.valueOf(rs.getString(s));
 }
}
----------------------------------------------------

このBloodTypeValueTypeでは、データベースの文字列型(CHAR,VARCHAR等)と
BloodTypeとを対応付けしています。

次に、このBloodTypeValueTypeを使ってPersonオブジェクトと
データベーステーブルの変換を行なうように宣言します。

--- dao.dicon --------------------------------------
 <component
  name="bloodTypeValueType"
  class="example.BloodTypeValueType"/>
----------------------------------------------------

--- example.Person.java ----------------------------
public class Person {
 private String name;
 private static final String bloodType_VALUE_TYPE = "bloodTypeValueType";
 private BloodType bloodType;

 /* アクセサメソッドは省略 */
}
---------------------------------------------------

ダイコンファイルに、作成したBloodTypeValueTypeをコンポーネント登録し、
PersonクラスにアノテーションVALUE_TYPEでそのコンポーネント名を指定します。

最後に、Personを永続化するテーブルです。
--- Person ----------------------------------------
NAME    |VARCHAR2 
BLOODTYPE |VARCHAR2
---------------------------------------------------

以上で、S2Dao内で自動的に BloodTypeとデータベースの文字列型が
相互変換されるようになります。

関連記事
スポンサーサイト

テーマ:JAVA - ジャンル:コンピュータ

  1. 2006/09/22(金) 00:16:46|
  2. ソフトウェア開発 Seasar
  3. | トラックバック:0
  4. | コメント:0
<<StrutsのActionServletはload-on-startupが必須 | ホーム | タグファイルにオブジェクト参照を渡す時に実行時例外発生>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://bagineer.blog59.fc2.com/tb.php/39-132a2633
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

crossroad

Author:crossroad
関西在住。男。
フリーランスのソフトウェアエンジニア。
エレキベース(Rock&Roll)とお酒が好物でございます。

カテゴリー

タグリスト

Java F1 フリーランス ベーシスト HARRY TheStreetSliders iPhone FX お酒 Seasar Maven eclipse Wicket マイホーム 野球 プロジェクトファシリテーション Rails Ruby UML お店 ソフトウェア Tomcat S2Flex2 jsf Teeda Eclipse タグライブラリ ajax タスク europa mylyn trac 

ブログ内検索

最近の記事

最近のコメント

最近のトラックバック

カレンダー

05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

月別アーカイブ

全ての記事を表示する

全ての記事を表示する

Twitter


RSSフィード

リンク

このブログをリンクに追加する

アクセスカウンタ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。