public class DnymicFormDao {
public static List getList(String form, ResultSet rs) throws ZDException{
if(form==null||form.equals("")){
throw new ZDException("进行动态赋值的form不能为空");
}
if(rs==null){
throw new ZDException("DnymicFormDao.getList的ResultSet参数不能为空");
}
List list = new ArrayList();
try {
      ResultSetMetaData rsmd = rs.getMetaData();
     
int cols = rsmd.getColumnCount();
String[] columnName = new String[cols];
for (int j = 0; j < cols; j++) {
columnName[j] = rsmd.getColumnName(j + 1);
} Class c = Class.forName(form);
Method[] method = c.getMethods();
while (rs.next()) {
Object o = c.newInstance();
for (int i = 0; i < method.length; i++) {
if(method[i].getName().substring(0, 3).equals("set")){
for (int j = 0; j < cols; j++) {
if (method[i].getName().substring(3).toUpperCase().equals(columnName[j])) {
String type = rsmd.getColumnTypeName(j);

if("date".equals(type.toLowerCase())){
System.out.println(columnName[j]);
method[i].invoke(o, rs.getDate(columnName[j]).toString());
}
else{
method[i].invoke(o, rs.getString(columnName[j]));
}
} }
}
}
list.add(o);
} } catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
   return list;
}

public static ResultSet getResultSet(String sql){
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
conn = JdbcUtil.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
}catch(Exception e){
e.printStackTrace();
}
return rs;
}
}能给这段代码加详细一些的注释吗?

解决方案 »

  1.   

    ResultSetMetaData 里可以获得搜索得到的结果集ResultSet的配置,
    比如列名,列类型一类的。然后反射的部分获取对应类的对应方法来获得数据,进行操作数据库了。
      

  2.   

    public class DnymicFormDao {
        public static List getList(String form, ResultSet rs) throws ZDException{
            if(form==null||form.equals("")){
                throw new ZDException("进行动态赋值的form不能为空");
            }
            if(rs==null){
                throw new ZDException("DnymicFormDao.getList的ResultSet参数不能为空");
            }
            List list = new ArrayList();
            try {
                 ResultSetMetaData rsmd = rs.getMetaData();  //得到数据库结果集(rs)的结构信息,比如字段数、字段名等
                 
                int cols = rsmd.getColumnCount();            //得到数据集的列数
               
                String[] columnName = new String[cols];      
                for (int j = 0; j < cols; j++) {
                    columnName[j] = rsmd.getColumnName(j + 1);//取得数据集列名,存到columnName数组当中
                }            Class c = Class.forName(form);               //加载和实例化该类,返回一个c的Class对象
                Method[] method = c.getMethods();            //取得C(类的对象)的方法,
                while (rs.next()) {
                    Object o = c.newInstance();              //使用类加载机制,创建对象
                    for (int i = 0; i < method.length; i++) {
                        if(method[i].getName().substring(0, 3).equals("set")){            //找出类的set方法
                            for (int j = 0; j < cols; j++) {
                                if (method[i].getName().substring(3).toUpperCase().equals(columnName[j])) {//找出数据库列名等于set方法名第四个字母的大写(找出列名对应的方法)
                                    String type = rsmd.getColumnTypeName(j);  //检索指定列的数据库特定的类型名称
                                    
                                    if("date".equals(type.toLowerCase())){  //判断字段是否为日期类型
                                        System.out.println(columnName[j]);
                                        method[i].invoke(o, rs.getDate(columnName[j]).toString());//使用反射来调用类的方法(如果为日期类型,toString转字符串)
                                    }
                                    else{
                                        method[i].invoke(o, rs.getString(columnName[j]));     //使用反射来调用类的方法
                                    }
                                }                        }
                        }
                    }
                    list.add(o);     
                }        } catch (Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
              return list;
        }
        
        public static ResultSet getResultSet(String sql){  //连接数据库
            Connection conn = null;
            Statement stmt = null;
            ResultSet rs = null;
            try{
                conn = JdbcUtil.getConnection();
                stmt = conn.createStatement();
                rs = stmt.executeQuery(sql);
            }catch(Exception e){
                e.printStackTrace();
            }
            return rs;
        }
    }
      

  3.   

    for (int i = 0; i < method.length; i++) {
                        if(method[i].getName().substring(0, 3).equals("set")){            //找出类的set方法
                            for (int j = 0; j < cols; j++) {
                                if (method[i].getName().substring(3).toUpperCase().equals(columnName[j])) {-----------------------------------------这种方式严重不符合 JavaBeans 规范,建议看看 java.beans.Introspector、java.beans.PropertyDescriptor
     类和 java.beans.BeanInfo 接口