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;
}
}能给这段代码加详细一些的注释吗?
比如列名,列类型一类的。然后反射的部分获取对应类的对应方法来获得数据,进行操作数据库了。
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;
}
}
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 接口