2012-01-24 4 views
3

SQLデータベーステーブルの列名と一致するインスタンスフィールド(および一致するセッターメソッド)を持つJavaクラスがあります。私はエレガントに(ResultSetに)テーブルから行をフェッチし、このクラスのインスタンスにマップしたいと思います。例えばSQLデータからJavaオブジェクトへの行のマッピング

私はインスタンスフィールド "FNAME"、 "LNAME"、 "GRADE" と、それぞれに適切なgetterメソッドとsetterメソッドで "学生" クラスを持っています。

同じ名前の3つの列を持つSQLテーブルもあります。

今、私はこのような何かやっている:

rs = statement.executeQuery(query); 

Student student = new Student(); 

student.setFNAME(rs.getString("FNAME")); 
student.setLNAME(rs.getString("LNAME")); 
student.setGRADE(rs.getString("GRADE")); 

を右、これを行うの少ない冗長な方法がなければなりませんか?私は列を追加するので、これは本当に迷惑と混乱するかもしれません。

+1

あなたを

public static User FetchUserFromDB(ResultSet i_rs) { User userToCreate = null; try { String FirstName = i_rs.getString("FirstName"); String LastName = i_rs.getString("LastName"); String Password = i_rs.getString("Password"); userToCreate = new User(FirstName, LastName, Password); } catch (SQLException ex) { _LOG_ERROR("Error in fetching user from DB: \n" + ex.getMessage()); } return userToCreate; } 

をそして今、あなたが望む任意のユーザーを持って、このこのメソッドを使用することができますSpringJDBCを使用することもできます。これは、RowMappersを作成し、テーブルとDAOがデータを処理するためのモデルクラスを作成する必要があります。多くの場合、SpringJDBCは休止状態よりも使いやすくなっていますが、この時点では習慣に依存しています。ここに行くhttp://www.vaannila.com/spring/spring-jdbc-tutorial-1.html –

答えて

1

たとえば、JPAプロバイダのようなORMを使用できます。 Hibernate。これにより、オブジェクトとテーブルの間のマッピングを設定できます。

0

JDBCを使用している場合は、どのように動作するのですか。このような列をJavaで追加しないようにするには、いくつかのORMフレームワークの使用を検討してください。

0

Studentには、3つの文字列を受け取るコンストラクタを指定するほうが少し控えめな方法です。それを行うために他の方法はHibernateのようなORMを使用するだけで、テーブルの多くを扱う本当に大きなプロジェクトのための大規模なセットアップ努力の価値になりHibernateにある

Student student = new Student(rs.getString("FNAME"), rs.getString("LNAME"), rs.getString("GRADE")); 

:次に、あなたはこれを行うことができます。

+0

これは、約2〜3ダースの人々によって使用される内部使用のWebアプリケーションであり、おそらく5つのテーブルが含まれます。その努力に値する? – Martin

+2

@MartinあなたはすべてのテーブルとすべてのテーブルのすべてのカラムについてHibernateに伝える必要があります。また、列の種類や他のものを指定する必要があります。 Hibernateは、1対多/ 1対1の関連付けをマッピングするのに本当に便利になります。非常に単純なデータをデータベースから読み込んでいるだけなら、おそらくそれは価値がありません。 –

4

Spring JDBCをお勧めします。 JDBCライブラリを使用するために、残りのSpringを使用する必要はありません。それはあなたのための接続を管理します(これ以上の閉鎖ConnectionStatement、またはResultSet)、行マッピングを含む多くの便利さがあります。

Spring JDBCで従来のコードをほとんど問題なく改装しました。

ここでは、Spring JDBCの概要のプレゼンテーション(PDF)です。それは数年前ですが、Springが依存関係を注入することなく、本質的に同じように動作します。

Spring JDBC Presentation PDF

+0

Spring JDBCの概要を示すPDFへのリンクを追加しました。 – Paul

0

簡素化やJDBCの重労働を解消する多くのORMライブラリがあります。いくつかの例については、Source Forge ORMを参照してください。最小限の構成で使用できるので、私のライブラリsormulaが好きです。

0

他のフレームワークを使用したくない場合は、standartマッピング方法を作成し、すべての結果の後に使用することができます。

public class CurrencyDAO(){ 

     public Currency findById(int id) { 
     String sql = "SELECT * FROM CCR.CURRENCY WHERE id = ?"; 
     Currency currency = null; 
     Connection c = null; 
     try { 
      c = DBConnection.getConnection(); 
      PreparedStatement ps = c.prepareStatement(sql); 
      ps.setInt(1, id); 
      ResultSet rs = ps.executeQuery(); 
      if (rs.next()) { 
       currency = processRow(rs); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      throw new RuntimeException(e); 
     } finally { 
      DBConnection.close(c); 
     } 
     return currency; 
    } 


    protected Currency processRow(ResultSet rs) throws SQLException { 
     Currency currency = new Currency(); 
     currency.setId(rs.getInt("id")); 
     currency.setEUR(rs.getString("EUR")); 
     currency.setUSD(rs.getString("USD")); 
     currency.setRate(rs.getString("rate"));  
     return currency; 

    } 
} 
4

あなたは以下のような簡単な方法で実行することにより、一般的にそれを行うことができます。

インターフェイスメソッドポインタとして使用する:SQLからJavaオブジェクトへのすべてのマッピングを処理するための

public interface I_DBtoJavaObjectConvertable<T> 
{ 
    public T createFromDB(ResultSet i_rs) throws SQLException; 
} 

ジェネリッククラス:

Lanbda式を使用すると、簡単にSQLの行t Oオブジェクトは、与えられたあなたのconvertion法により、例えば:

public static List<User> GetAllUsersFromDB() throws SQLException 
{ 
    String Query = "select * " 
      + "from UsersTable"; 

    return DBManager.GetObjectsFromDB(Query, rs -> FetchUserFromDB(rs)); 
} 

または::

public static List<String> GetAllNamesFromDB() throws SQLException 
{ 
    String Query = "select FirstName " 
      + "from UsersTable"; 

    return DBManager.GetObjectsFromDB(Query, rs -> rs.getString("FirstName")); 
} 
+0

私は本当にこれが好きです。 – bharal

関連する問題