下面的方法是使用反射把ResultSet对象得到的单条结果放入到java对象中,返回Object对象
public static Object singleResultset(ResultSet rs,String str){
try {
//加载类
Class clazz = Class.forName(str);
//创建此 Class对象所表示的类的一个新实例。
Object obj = clazz.newInstance();
//获取此 ResultSet对象的列的编号、类型和属性。
ResultSetMetaData rsmd = rs.getMetaData();
//ResultSetMetaData.getColumnCount()方法获取此 ResultSet对象中的列数。
int count = rsmd.getColumnCount();
//遍历该ResultSet对象的行数据
while(rs.next()){
//遍历ResultSet对象的列数据
for(int i=1;i<count+1;i++){
//ResultSetMetaData.getColumnName()方法获取指定列的名称。
String columnName = rsmd.getColumnName(i);
//将指定列的列名首字母转换成大写
columnName = columnName.substring(0, 1).toUpperCase() + columnName.substring(1);
//根据指定列的名称获取指定的get方法
Method methodGet = clazz.getMethod("get"+columnName, null);
//Method.getGenericReturnType()获取该方法的返回类型。(获取该实例的get方法的返回类型)
Class type = (Class)methodGet.getGenericReturnType();
//根据指定列的名称获取指定的set方法
Method methodSet = clazz.getMethod("set"+columnName, type);
//判断并转换该实例中的set方法中参数的类型
if(type.isAssignableFrom(int.class) || type.isAssignableFrom(Integer.class)){
//将传给该实例的set方法的参数值转换成int类型,然后执行该实例的set方法将数据放入Po类的字段中
methodSet.invoke(obj, Integer.parseInt(rs.getString(columnName)));
}
if(type.isAssignableFrom(String.class)){
methodSet.invoke(obj, rs.getString(columnName));
}
if(type.isAssignableFrom(double.class) || type.isAssignableFrom(Double.class)){
methodSet.invoke(obj, Double.parseDouble(rs.getString(columnName)));
}
if(type.isAssignableFrom(boolean.class) || type.isAssignableFrom(Boolean.class)){
methodSet.invoke(obj, Boolean.parseBoolean(rs.getString(columnName)));
}
}
}
//返回该Class对象的实例
return obj;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
调用该方法
AssetPo ap = (AssetPo)singleResultset(rs,"com.wlx.po.AssetPo");//参数一是查询到的ResultSet对象,参数二是反射得到的结果集放入的java对象(应返回的是一个Object对象所以需要强转一下)
下面的方法是使用反射把ResultSet对象得到的多条结果放入到List 集合中,和上面的方法没有什么区别,唯一不同的是下面的结果集放入的是一个集合,返回List 集合
public static List listResultset(ResultSet rs,String str){
List list = new ArrayList();
try {
//加载类
Class clazz = Class.forName(str);
//获取此 ResultSet 对象的列的编号、类型和属性。
ResultSetMetaData rsmd = rs.getMetaData();
//返回此 ResultSet 对象中的列数。
int count = rsmd.getColumnCount();
while(rs.next()){
//创建此 Class对象所表示的类的一个新实例。
Object obj = clazz.newInstance();
for(int i=1;i<count+1;i++){
//获取指定列的名称。
String columnName = rsmd.getColumnName(i);
//将指定列的列名首字母转换成大写
columnName = columnName.substring(0, 1).toUpperCase() + columnName.substring(1);
//获取该实例中的get方法
Method methodGet = clazz.getMethod("get"+columnName, null);
//获取该实例中get方法的返回类型
Class type = methodGet.getReturnType();
//获取该实例中的set方法
Method methodSet = clazz.getMethod("set"+columnName, type);
//判断并转换该实例中的set方法中参数的类型
if(type.isAssignableFrom(int.class) || type.isAssignableFrom(Integer.class)){
//将传给该实例的set方法的参数值转换成int类型,然后执行该实例的set方法将数据放入Po类的字段中
methodSet.invoke(obj, Integer.parseInt(rs.getString(columnName)));
}
if(type.isAssignableFrom(String.class)){
methodSet.invoke(obj, rs.getString(columnName));
}
if(type.isAssignableFrom(double.class) || type.isAssignableFrom(Double.class)){
methodSet.invoke(obj, Double.parseDouble(rs.getString(columnName)));
}
if(type.isAssignableFrom(boolean.class) || type.isAssignableFrom(Boolean.class)){
methodSet.invoke(obj, Boolean.parseBoolean(rs.getString(columnName)));
}
}
list.add(obj);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
调用该方法
List list = listResultset(rs, "com.wlx.po.AssetPo");//参数一是查询到的ResultSet对象,参数二是反射得到的结果集放入的java对象
上面的两个方法是使用java的反射机制来获得Po类中get方法的返回类型,来设置set的参数类型,并把查询得到的ResultSet对象中的结果通过执行set方法设入Po类中。