有没有办法将sql2o的结果集映射为泛型?

时间:2016-05-17 12:27:29

标签: java sql generics jdbc sql2o

我正在使用sql2o库编写数据库客户端。我的项目中有很多数据访问对象,所以我应该有很多类似的函数来访问表。例如,对于课程Persons

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);
        }
    }
}

2 个答案:

答案 0 :(得分: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));
            }
        }

}

使用与tableName相同的className不是最佳做法。但是如果你用表格映射每个类,你可以这样做

  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));
            }
        }
     ...
}

要实例化:

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);
...

答案 1 :(得分:0)

我改进了@tonino代码并删除了对Store类的需求。这是代码:

public <T> List<T> list(Class<T> clazz){ String sql = "SELECT * FROM " + getTablename(clazz); try(Connection con = sql2o.open()) { return con.createQuery(sql).executeAndFetch(clazz); } } public <T> T findById(Integer id, Class<T> clazz) { String sql = "SELECT *" + " FROM " + getTablename(clazz) + " WHERE id=:id"; try(Connection con = sql2o.open()) { return con.createQuery(sql) .addParameter("id", id) .executeAndFetchFirst(clazz); } } private String getTablename(Class clazz) { //This can be improved later with reflection return clazz.getSimpleName().toUpperCase(); }

相关问题