2013-04-26 39 views
1

我正在研究從數據庫提取數據的小型Java庫。Java字段猜測

假設有一個通用 Java類:

公共MyClass類{

public int valueA; 
    public String valueB; 
    public Double valueC; 

    //getter and setter methods. 
} 

之後,我定義一個SQL查詢字符串,我得到的類泛型類MyClass的。

String sql = "Select c.valueA, c.valueB, c.valueC from my_table c"; 
Class<MyClass> type = MyClass.class; 
List<MyClass> results = extractData(sql, type)M 

凡方法extractData是像下面的方法:

public<T> List<T> extractData(String sql, Class<T> type){ 
    //1)Do everything that is necessary to retrieve a ResultSet by the sql String. 
    //2)Then, for each row in the ResultSet 
    //2.1)Create a new instance of object of type T. 
    //2.2)Automatically matches the field name from the query 
    // with the field name of the specified class. 
    //2.3) add the object to the list to be returned. 
    //3) return the list of results of type T. 
} 

在實踐中,如果可能的話,我怎麼能實現步驟2.2?

我想這是可能的,因爲我使用這種方法進入PHP框架。

+3

尋找'反思'。看起來你正在構建一個ORM映射器。看看現有的解決方案可能是值得的。它們並不像JPA/Hibernate那樣沉重,例如考慮ibatis或google。 – 2013-04-26 11:58:54

+0

我會看看他們兩個!謝謝。 – 2013-04-26 11:59:56

回答

2

你需要的是結果集元數據(獲取n以及反射來分析類並設置字段。期望在它們之間編寫大量的膠合代碼(例如,從您需要猜測每個列使用哪個getXXX()/數據類型的類的字段類型)。

它不太複雜,但需要一些思考。有很多潛在的邊緣情況(例如繼承)以及如何處理隱式類型轉換(當類字段和列數據類型不直接兼容時)。

+0

你是對的!此外,他可以使用'java.sql.Types'來定義調用基於類型的setter/getter方法的工具類。這是一個小時的工作!當然,他需要'java.lang.reflect'中的類來解析getter/setter方法名稱。最後,ORM會更好,因爲它嵌入了很多很好的功能,但我確實認爲它不是必須的! – JeanValjean 2013-04-26 14:04:25

+0

一個ORM本質上是做同樣的事情(稍微詳細一點,上面有很多糖,但原理絕對一樣),我假設TC想要做這個學習經驗或者這是一個任務。對於使用ORM的正常項目,在調試過程中可節省時間和白髮。 – Durandal 2013-04-26 14:08:48

+0

我同意你的觀點。這與我的一樣,但有點改善。我只想指出,ORM通常通過生成表示表的類來查看選定的數據庫。然後,通過查詢(通常由查詢構建器提供),可以很容易地從代表表中獲取對象。 – JeanValjean 2013-04-26 14:22:55