Maison > Questions et réponses > le corps du texte
代码:
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;
}
我想获取传进来的类的所有属性,然后通过re.getString获得值,但是我不知道属性有多少个,在rs.next里for循环遍历的话就会失去rs的作用域。麻烦哪位大神帮我看看怎么写 = =。
PHP中文网2017-04-18 10:30:16
Je ne suis pas très doué en composition, donc je peux simplement le lire.
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);
}
高洛峰2017-04-18 10:30:16
Il y a effectivement un problème avec votre réflexion :
Même si vous souhaitez récupérer l'objet de classe, il est préférable de ne pas transmettre Class.formName, sauf si vous avez vraiment besoin de charger dynamiquement des classes externes.
Je ne sais pas si écrire de cette façon répond à vos exigences
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;
高洛峰2017-04-18 10:30:16
org.springframework.jdbc.core.BeanPropertyRowMapper
Implémentation toute faite, vous pouvez vous y référer et l'imiter.