将 ResultSet 转换为通用 class,其中 class 构造函数是通过工厂定义的
transform ResultSet into generic class where the class constructor is defined via a factory
我定义了一个方法来将 MySQl select 查询的结果解析为通用的 class.
此方法如下所示:
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;
}
我用它在我定义了架构的两个数据库表上执行 select。
之前我已经定义了一个模式,上面的函数适用于该模式。 class 看起来像这样。
@Getter //lombok
@Setter
public class C extends A {
private String varA;
private String varB;
private String varC;
public C(String s1, String s2) {
...
...
}
public C (ResultSet resultSet) {
....
...
}
//Other class methods
}
现在我定义了一个工厂以使 class 不可变。我想知道如何修改 selectFromDb 代码来处理修改后的 class.
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)
您通过
创建实例
while (result.next()) {
T t = factory.apply(result);
listDbData.add(t);
}
你打电话给
selectFromDb(CFactory::from, searchKeyName, searchKeyValue);
事实上,您可以首先这样做,然后将 YourClass::new
作为方法引用传递给您通过代码中的反射检索的构造函数。
作为旁注,您可以保留构造函数 - 它不会使您的 class 不那么不可变。另外,为什么不制作工厂方法 static
? (我的代码示例假定它们是)
我定义了一个方法来将 MySQl select 查询的结果解析为通用的 class.
此方法如下所示:
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;
}
我用它在我定义了架构的两个数据库表上执行 select。
之前我已经定义了一个模式,上面的函数适用于该模式。 class 看起来像这样。
@Getter //lombok
@Setter
public class C extends A {
private String varA;
private String varB;
private String varC;
public C(String s1, String s2) {
...
...
}
public C (ResultSet resultSet) {
....
...
}
//Other class methods
}
现在我定义了一个工厂以使 class 不可变。我想知道如何修改 selectFromDb 代码来处理修改后的 class.
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)
您通过
创建实例while (result.next()) {
T t = factory.apply(result);
listDbData.add(t);
}
你打电话给
selectFromDb(CFactory::from, searchKeyName, searchKeyValue);
事实上,您可以首先这样做,然后将 YourClass::new
作为方法引用传递给您通过代码中的反射检索的构造函数。
作为旁注,您可以保留构造函数 - 它不会使您的 class 不那么不可变。另外,为什么不制作工厂方法 static
? (我的代码示例假定它们是)