java - 有什么方法可以将 sql2o 的结果集映射为泛型吗?

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

最佳答案

我们设法创建了一个 Store

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

关于java - 有什么方法可以将 sql2o 的结果集映射为泛型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37276203/

相关文章:

java - 如何避免java中重复的代码密集型if语句

SQL Server 选择两个值之间的行

C# 泛型未按预期工作

c# - 将 byte[] 数组转换为 DataTable

java + sqlite : how to open database as read-only?

Java 8 通用 java.util.Function

generics - 如何在 Haxe (haxe3) 中编写通用比较函数

java - 无法解析注释参数

java - SWT - 将我的所有图像存储在一个位置的图像资源

java - 如何设置门户组件:resourceURL to output https URL?