Java

リザルトセットのポピュレート

  • このポピュレートはあくでもVOメンバはラッパー型が前提です。
    どの道、EJBだったらプリミティブはまずいし、DBの値nullを表現するにはラッパーでないとできないので問題ないでしょう

※サンプルは一部コードが欠けています・・・・

public HogeVO hoge(){

   // クエリを発行・・・
   HogeVO ret = new HogeVO();

   // ポピュレート用のMAPを用意
   Map properties = new HashMap();
   // リザルトセットのメタデータを取り出します。
   ResultSetMetaData metaData = result.getMetaData();
   int cols = metaData.getColumnCount();
   // リザルトセットからキーと値をマップに格納します。
   if (result.next())
       for (int i = 1; i <= cols; i++) {
           // null はポピュレートできません。
           if (result.getObject(i) != null) {
               if( "DATE".equals(metaData.getColumnTypeName(i) ) ){
                   properties.put(oraCol2Camel(metaData.getColumnName(i)), 
                       result.getTimestamp(i));
               }else {
                   properties.put(oraCol2Camel(metaData.getColumnName(i)), 
                       result.getString(i));
               }
           }
       }
   // ポピュレートします。
   try {
       populate(ret, properties);
   } catch (Exception e) {
       throw e;
   }
   return ret;
}

private String oraCol2Camel(String str) {
   StringTokenizer st = new StringTokenizer(str, "_");
   String ret = "";
   int i = 1;
   while (st.hasMoreTokens()) {
       if (i == 1) {
           ret = ret + ((String) st.nextToken()).toLowerCase();
       } else {
           String tmp1 = ((String) st.nextToken()).toLowerCase();
           ret = ret + (tmp1.substring(0, 1)).toUpperCase() 
                                 + tmp1.substring(1, tmp1.length());
       }
       i++;
   }
   return ret;
}
private static void populate(Object bean, Map form) {
   // String
   final String STRING = "java.lang.String";
   final String STRING_ARRAY = "[Ljava.lang.String;";
   // BigDecimal
   final String BIGDECIMAL = "java.math.BigDecimal";
   final String BIGDECIMAL_ARRAY = "[Ljava.math.BigDecimal;";
   // Integer
   final String INTEGER = "java.lang.Integer";
   final String INTEGER_ARRAY = "[Ljava.lang.Integer;";
   // Long
   final String LONG = "java.lang.Long";
   final String LONG_ARRAY = "[Ljava.lang.Long;";
   // Double
   final String DOUBLE = "java.lang.Double";
   final String DOUBLE_ARRAY = "[Ljava.lang.Double;";
   // Timestamp
   final String TIMESTAMP = "java.sql.Timestamp";
   final String TIMESTAMP_ARRAY = "[Ljava.sql.Timestamp;";
   // beanのクラス定義を取得する
   Class clazz = bean.getClass();
   // beanのクラスに定義されているメソッドを取得する
   Method[] m = clazz.getMethods();
   // beanに定義されるsetterの分ループする
   for (int i = 0; i < m.length; i++) {
       if (!m[i].getName().startsWith("set")) {
           continue;
       }
       // beanのsetterの型を取得する
       Class[] typeSet = m[i].getParameterTypes();
       // setterのシグネチャが1つであることを確認する
       // 1つではない場合次へ移る
       if (typeSet.length != 1) {
           continue;
       }
       // Mapのキーを取得する
       String getName = m[i].getName().substring(3);
       // キーが1文字の場合を考慮する
       // setA → a
       // setABC → aBC
       if (getName.length() == 1) {
           getName = getName.toLowerCase();
       } else {
           getName = getName.substring(0, 1).toLowerCase() + getName.substring(1);
       }
       // Mapからオブジェクトを取得する
       Object obj = form.get(getName);
       // オブジェクトが null である場合 
       // beanに定義されているプロパティが存在しないとして次のプロパティに移る
       if (obj == null) {
           continue;
       }
       String type = typeSet[0].getName();
       try {
           // beanのsetterの型がjava.lang.Stringである場合
           if (STRING.equals(type)) {
               m[i].invoke(bean, new Object[] { obj.toString() });
               // beanのsetterの型がjava.math.BigDecimalである場合
           } else if (BIGDECIMAL.equals(type)) {
               m[i].invoke(
                   bean,
                   new Object[] {
                        BigDecimal.valueOf(
                           Long.valueOf(obj.toString().replaceAll(",", ""))
                               .longValue())});
               // beanのsetterの型がjava.lang.Integerである場合
           } else if (INTEGER.equals(type)) {
               m[i].invoke(bean, new Object[] { 
                   Integer.valueOf(obj.toString().replaceAll(",", ""))});
               // beanのsetterの型がjava.lang.Longである場合
           } else if (LONG.equals(type)) {
               m[i].invoke(bean, new Object[] { 
                   Long.valueOf(obj.toString().replaceAll(",", ""))});
               // beanのsetterの型がjava.lang.Doubleである場合
           } else if (DOUBLE.equals(type)) {
               m[i].invoke(bean, new Object[] { 
                   Double.valueOf(obj.toString().replaceAll(",", ""))});
               // beanのsetterの型がjava.lang.Timestampである場合
           } else if (TIMESTAMP.equals(type)) {
               m[i].invoke(bean, new Object[] { 
                   Timestamp.valueOf(obj.toString())});
               // beanのsetterの型がjava.lang.String[]である場合
           } else if (STRING_ARRAY.equals(type)) {
               String[] array = toArrayString((Object[]) obj);
               m[i].invoke(bean, new Object[] { array });
               // beanのsetterの型がjava.math.BigDecimal[]である場合
           } else if (BIGDECIMAL_ARRAY.equals(type)) {
               BigDecimal[] array = toArrayBigDecimal((Object[]) obj);
               m[i].invoke(bean, new Object[] { array });
               // beanのsetterの型がjava.lang.Integer[]である場合          
           } else if (INTEGER_ARRAY.equals(type)) {
               Integer[] array = toArrayInteger((Object[]) obj);
               m[i].invoke(bean, new Object[] { array });
               // beanのsetterの型がjava.lang.Long[]である場合             
           } else if (LONG_ARRAY.equals(type)) {
               Long[] array = toArrayLong((Object[]) obj);
               m[i].invoke(bean, new Object[] { array });
               // beanのsetterの型がjava.lang.Double[]である場合               
           } else if (DOUBLE_ARRAY.equals(type)) {
               Double[] array = toArrayDouble((Object[]) obj);
               m[i].invoke(bean, new Object[] { array });
               // beanのsetterの型がjava.sql.Timestamp[]である場合             
           } else if (TIMESTAMP_ARRAY.equals(type)) {
               Timestamp[] array = toArrayTimestamp((Object[]) obj);
               m[i].invoke(bean, new Object[] { array });
           } else {
               m[i].invoke(bean, new Object[] { obj });
           }
       } catch (Exception e) {
       }
   }
}

BeanUtil?のpopulateを利用・・・

※動作未確認

オリジナルpopulateを利用(エンティティのメンバにプリミティブは利用不可)

#ref(): File not found: ".java" at page "Java/リザルトセットのポピュレート"

※動作確認済み


添付ファイル: fileResultSetUtil.java 558件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-04-07 (金) 16:01:32 (228d)