代碼:
public static List<Object> select(String sql, String o)
throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
Class c = Class.forName(o);
Field[] fls = c.getDeclaredFields();
List<String> list= new ArrayList<>();
for (int i = 0; i < fls.length; i++) {
System.out.println("公有屬性之" + fls[i].getName());
list.add(fls[i].getName());
}
Object object = c.newInstance();
List<Object> l = new ArrayList<>();
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
// Retrieve by column name
String id = rs.getString("href");
String name = rs.getString("title");
// Display values
System.out.print("ID: " + id);
System.out.print(", name: " + name);
}
rs.close();
stmt.close();
conn.close();
return l;
}
我想獲取傳進(jìn)來的類的所有屬性,然后通過re.getString獲得值,但是我不知道屬性有多少個,在rs.next里for循環(huán)遍歷的話就會失去rs的作用域。麻煩哪位大神幫我看看怎么寫 = =。
3 回答

縹緲止盈
TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個贊
不太會排版,湊合看。
while(rs.next()){
//cls: Class<T> cls
T t=cls.newInstance();
//rsmd: ResultSetMetaData rsmd
for(int i=0;i<rsmd.getColumnCount();i++){
errorIndex=i+1;
String columnName=(rsmd.getColumnName(i+1)).toLowerCase();
//rs: ResultSet rs
Object obj=rs.getObject(columnName);
if(null==obj) continue;
columnName=String.valueOf(columnName.charAt(0)).toUpperCase()+columnName.substring(1);
Method m;
m=cls.getMethod("set"+columnName, obj.getClass());
m.invoke(t, obj);
}
dataList.add(t);
}

RISEBY
TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個贊
你的反射其實(shí)存在點(diǎn)問題:
即使要獲取class對象,最好不要通過Class.formName,除非你確實(shí)是需要動態(tài)加載外部類。
不知道這樣寫是否符合你的要求
public static List<Map<String,Object>> select(Object o)
throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
Field[] fds=o.getClass().getDeclaredFields();
String[] names=new String[fds.length];
for(int i=0;i<fds.length;i++){
names[i]=fds[i].getName();
System.out.println(names[i]);
}
List<Map<String,Object>> list=new ArrayList<>();
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
Map<String,Object> m=new HashMap<>();
for(String name:names){
String tmp = rs.getString(name);
m.put(name, tmp);
}
list.add(m);
}
rs.close();
stmt.close();
conn.close();
return list;

慕標(biāo)琳琳
TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個贊
org.springframework.jdbc.core.BeanPropertyRowMapper
現(xiàn)成的實(shí)現(xiàn),你可以參考,并且模仿一下。
添加回答
舉報(bào)
0/150
提交
取消