Java 将ResultSet转换为泛型类,其中类构造函数是通过工厂定义的
我定义了一个方法,将MySQl select查询的结果解析为一个泛型类 此方法如下所示:Java 将ResultSet转换为泛型类,其中类构造函数是通过工厂定义的,java,mysql,design-patterns,factory,Java,Mysql,Design Patterns,Factory,我定义了一个方法,将MySQl select查询的结果解析为一个泛型类 此方法如下所示: public <T> List<T> selectFromDb(Class<T> _class, String tableName, String searchKeyName, String searchKeyValue) throws SQLException, IllegalAccess
public <T> List<T> selectFromDb(Class<T> _class, String tableName,
String searchKeyName, String searchKeyValue)
throws SQLException, IllegalAccessException,
InstantiationException, NoSuchMethodException, InvocationTargetException, ClassNotFoundException {
List<T> listDbData = new ArrayList<>();
final String selectQuery = String.format("select * from %s.%s where %s = ?;",
schemaName, tableName, searchKeyName);
PreparedStatement selectStatement = connection.prepareStatement(selectQuery);
try {
selectStatement.setString(1, searchKeyValue);
ResultSet result = selectStatement.executeQuery();
while (result.next()) {
T t = _class.getDeclaredConstructor(ResultSet.class).newInstance(result);
listDbData.add(t);
}
selectStatement.close();
}catch (SQLException e) {
log.error("Query failed:" + selectQuery);
throw e;
} finally {
selectStatement.close();
}
return listDbData;
}
现在我定义了一个工厂以使类不可变。我想知道如何修改selectFromDb代码来处理修改后的类
public class CFactory {
public static C from(String s1, String s2) {
C c;
...
...
return c;
}
public static C from(ResultSet resultSet) throws SQLException {
C c;
....
...
return c;
}
}
@Builder
@Getter //lombok
public class C extends A{
private final String varA;
private final String varB;
private final String varC;
....
....
}
谢谢。
Swagatika你申报了吗
public <T> List<T> selectFromDb(Function<ResultSet,T> factory, String tableName,
String searchKeyName, String searchKeyValue)
你打电话过来
selectFromDb(CFactory::from, searchKeyName, searchKeyValue);
事实上,您本来可以这样做,并将YourClass::new
作为方法引用传递给通过代码中的反射检索的构造函数
顺便说一句,您可以保留构造函数——它不会降低类的不可变性。另外,为什么不使工厂方法
静态?(我的代码示例假定它们是)工厂方法是静态的。我忘了更新。现在编辑函数。当我执行listC=mySqlClient.selectFromDb(CFactory::from,tableName,searchKeyName,searchKeyValue);我从我的方法中得到错误:未处理的表达式:java.sql.SQLException do throw SQLException。我用atry{…}catch(SQLException e){throw new RuntimeException(e);}return c;}包装了CFactory::from。这解决了异常处理问题
while (result.next()) {
T t = factory.apply(result);
listDbData.add(t);
}
selectFromDb(CFactory::from, searchKeyName, searchKeyValue);