2014-09-10 73 views
0

我正在構建一個允許用戶構建ETL代碼的數據工具。在深入研究這些內容之前,我需要構建一個「代理」來處理該工具需要執行的所有與數據庫相關的工作。具體而言,這將涉及 -關於java類設計的指導

  • 選擇,插入,更新和刪除
  • 多個記錄
  • 自/至/在不同的表有不同的佈局

我的想法是建立一個類使用以下4種方法 -

ArrayList[][] selectFromRepository (String dbTable, String[] columnNames) 
ArrayList[][] selectFromRepository (String dbTable, String[] columnNames, Map<String, Object> predicate) 
void   insertToRepository (String dbTable, Map<String, Object>[] payload) 
void   updateInRepository (String dbTable, Map<String, Object>[] payload, Map<String,Object>[] predicate) 
void   deleteFromRepository (String dbTable, Map<String, Object>[] payload) 

selectFromRepository將使用2D a基於從參數「dbTable」中檢索的「columnNames」中的元素類型,異構元素的內容列表。重載版本允許通過「謂詞」映射指定where子句謂詞。我想我可以檢查傳遞給方法Map對象元素的類型和建立正確的where子句(例如對於

"where " + key + " = '" + predicate.get(k) + "'" if predicate.get(k) instanceOf String 

等..

其他方法將更新方法類似工作謂詞的工作方式類似於超載選擇。

我在尋找最佳實踐的指導,我的想法的缺點(因此你的方法的優點是你的方式:))。另外,建立一個名爲DB元素的通用類型是否有意義,它接受所有已知的DB數據類型,我期望將其用作類型輸入,然後在map/arraylist參數中使用它而不是「Object」類型?

在此先感謝!

+0

有JDBC,它實現了你正在尋找的大部分功能。 – 2014-09-10 15:26:42

回答

3

那麼這是相當的問題。

首先,我不會自己實現這個。 有一些免費的圖書館(春季,冬眠) 爲你做這個,並在ORM的形式(http://en.wikipedia.org/wiki/Object-relational_mapping)更好。

如果你想自己做,這是我會怎麼做:

我會按照ADO,併爲每個表我有一個類。 例如,我會爲我的員工表創建Employee類。

然後,我將創建一個查詢生成器,像這樣:

QueryBuilder 
    .selectFrom(Employee.class) 
    .equalTo(propery, value) 
    .graterThenOrEqualTo(property, value); 

我的屬性看起來像這樣:

interface Property<From, To>{ 
    To get(From from); 
} 

因此,例如:在

class EmployeeToId<Employee, Integer>{ 
    public Integer get(Employee emp){ 
     return emp.id; 
    } 
} 

所以我previos示例:

QueryBuilder 
    .selectFrom(Employee.class) 
    .equalTo(new EmployeeToId(), 15) 
    .build().fetch(); // This returns an Optional<Collection<Employee>>; 

我的查詢生成器將有許多方法,如:

class QueryBuilder{ 
    public <Entity> SelectBuilder<Entity> selectFrom(Class<Entity> clazz); 
} 

這只是它的JIST。 你可以使它變得複雜,只要你喜歡。 但爲了使它好,這將需要很多時間,只要問冬眠或jooq。