2016-05-17 75 views
1

我正在使用sql2o庫編寫數據庫客戶端。我的項目中有很多數據訪問對象,所以我應該有很多類似的功能來訪問表。例如,對於類Persons有沒有什麼方法將sql2o的結果集映射爲泛型?

public List<Persons> getPersonsData(){ 
    String sql = "SELECT * FROM " + PERSONS; 
    try(org.sql2o.Connection con = sql2o.open()) { 
     return con.createQuery(sql).executeAndFetch(Persons.class); 
    } 
} 

有什麼方法可以優化它嗎?我正在考慮使用泛型,但據我所知,沒有辦法獲得泛型類的實例。創建這樣的東西真的不可能嗎?

public class Getter<T> { 
    public List<T> getGenericClass(){ 
     String sql = "SELECT * FROM " + T.tableName; 
     try(org.sql2o.Connection con = sql2o.open()) { 
      return con.createQuery(sql).executeAndFetch(T.class); 
     } 
    } 
} 
+0

你可以給這個用例:但如果你把每類表圖,您可以用這種方式

public class GenericClass{ ... public <T> void storeGenericClass(List<T> store, Class<T> clazz){ String sql = "SELECT field1, field2 FROM " + clazz.getName().toUpperCase(); try(org.sql2o.Connection con = sql2o.open()) { store.addAll(con.createQuery(sql).executeAndFetch(clazz)); } } ... } 

要實例嗎?爲什麼這對你很重要?據我所見,sql2o是非常安全的。 –

回答

1

我們管理,創造一個商店

public class Store<T> { 
    private T value; 

    public void set(T object){ 
     value = object; 
    } 

    public T get(){ 
     return value; 
    } 
} 

和修改您的GenericClass

public class GenericClass{ 
    public <T> void storeGenericClass(Store<T> store, Class<T> clazz){ 
      String sql = "SELECT field1, field2 FROM MYTABLE WHERE ID = 1"; 
      try(org.sql2o.Connection con = sql2o.open()) { 
       store.set(con.createQuery(sql).executeAndFetchFirst(clazz)); 
      } 
     } 

     public <T> void storeGenericClass(List<T> store, Class<T> clazz){ 
      String sql = "SELECT field1, field2 FROM " + 
       clazz.getName().toUpperCase(); 
      try(org.sql2o.Connection con = sql2o.open()) { 
       store.addAll(con.createQuery(sql).executeAndFetch(clazz)); 
      } 
     } 

} 

使用相同的類名作爲表名是不是最佳做法。

public class MyClass { 

    public String field1, field2; 
} 


... 
    GenericClass generic= new GenericClass(sql2o); 
    Store<MyClass> store = new Store<>(); 
    generic.storeGenericClass(store, MyClass.class); 
    MyClass retrieved = store.get(); 
    System.out.println("My Class fields are: "+retrieved.field1 + "-"+retrieved.field2); 
... 
+0

請問您能演示如何實例化嗎? – Atticus29

+0

@ Atticus29我重構了代碼並添加了一個示例。我希望它是有用的:) – Tonino

相關問題