这是个反射的东东,就是从数据库获取数据后通过反射获取每个列的内容..
但听课听了很晕,对以下代码不理解,特别是for循环里面的内容..
请高手帮我在每个语句后面加个注释好么?
谢谢..
import java.lang.reflect.Method;
import java.sql.*;import entity.*;public class GetAll2 {
static Object getObject(String sql,Class clazz) throws Exception{

Connection con = null;
PreparedStatement pstmt = null;
ResultSet res = null;

try{
con = ConnectionManager.getConnection();
pstmt = con.prepareStatement(sql);
res = pstmt.executeQuery();


ResultSetMetaData resultdata = res.getMetaData();
String[] columnNames = getColumnNames(resultdata);
Object obj = null;

if(res.next()){
obj = clazz.newInstance();
Method[] methods = clazz.getDeclaredMethods();
for(String s:columnNames){
String cm = "set"+ s;
for(Method m:methods){
if (cm.equalsIgnoreCase(m.getName())) {
m.invoke(obj, res.getObject(s));
}
}
}
}

return obj;


}
finally{
ConnectionManager.CloseResultSet(res);
ConnectionManager.ClosePreparedStatement(pstmt);
ConnectionManager.CloseConnection(con);
}



} static public String[] getColumnNames(ResultSetMetaData metaData)
throws Exception {
int count = metaData.getColumnCount();
String[] ss = new String[count];
for (int i = 0; i < count; i++) {
ss[i] = metaData.getColumnName(i + 1);
}
return ss; }}

解决方案 »

  1.   

    就是将 数据库中查出的记录封装成 clazz 类型的对象
      

  2.   


     for(String s:columnNames){
                        String cm = "set"+ s;//根据列信息拼出 对应的setter方法
                        for(Method m:methods){
                             //遍历对象中的方法 找到和拼起来的方法同名的 
                            if (cm.equalsIgnoreCase(m.getName())) {
                                m.invoke(obj, res.getObject(s));//调用这个方法赋值
                            }
                        }
                    }
      

  3.   


    麻烦能把最后一个static 方法里的所有语句,给个注释么?谢谢
      

  4.   


    import java.lang.reflect.Method;
    import java.sql.*;import entity.*;public class GetAll2 {
        static Object getObject(String sql,Class clazz) throws Exception{
            
            Connection con = null;
            PreparedStatement pstmt = null;
            ResultSet res = null;
            
            try{
                con = ConnectionManager.getConnection();
                pstmt = con.prepareStatement(sql);
                res = pstmt.executeQuery();
                
                
                ResultSetMetaData resultdata = res.getMetaData();//获得结果集的所以信息
                String[] columnNames = getColumnNames(resultdata); //获得结果集的所有列
                Object obj = null;
                
                if(res.next()){ 
                    obj = clazz.newInstance();
                    Method[] methods = clazz.getDeclaredMethods();//通过类对象拿到所有定义的方法
                    for(String s:columnNames){  //遍历结果集的所有列
                        String cm = "set"+ s;   //拼方法名,如结果的第一列是 id 则方法名就是setid
                        for(Method m:methods){  //遍历类对象中所有方法
                            if (cm.equalsIgnoreCase(m.getName())) { //如果方法名和String cm 这个字符串一致(忽略大小写)
                                m.invoke(obj, res.getObject(s));  //反射,方法调用
                            }
                        }
                    }
                }
                
                return obj;
                
            
            }
            finally{
                ConnectionManager.CloseResultSet(res);
                ConnectionManager.ClosePreparedStatement(pstmt);
                ConnectionManager.CloseConnection(con);
            }
        
            
            
        }    static public String[] getColumnNames(ResultSetMetaData metaData)
                throws Exception {
            int count = metaData.getColumnCount();
            String[] ss = new String[count];
            for (int i = 0; i < count; i++) {
                ss[i] = metaData.getColumnName(i + 1);
            }
            return ss;    }}
      

  5.   


     static public String[] getColumnNames(ResultSetMetaData metaData)
                throws Exception {
            int count = metaData.getColumnCount();  //获得结果集的列的个数总和
            String[] ss = new String[count];        //new 一个和 结果集的列的个数总和 相等大小的字符串数组
            for (int i = 0; i < count; i++) {       
                ss[i] = metaData.getColumnName(i + 1);  //将结果集中的每一列的列名放进字符串数组
            }
            return ss;   //返回数组