这是个反射的东东,就是从数据库获取数据后通过反射获取每个列的内容..
但听课听了很晕,对以下代码不理解,特别是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; }}
但听课听了很晕,对以下代码不理解,特别是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; }}
for(String s:columnNames){
String cm = "set"+ s;//根据列信息拼出 对应的setter方法
for(Method m:methods){
//遍历对象中的方法 找到和拼起来的方法同名的
if (cm.equalsIgnoreCase(m.getName())) {
m.invoke(obj, res.getObject(s));//调用这个方法赋值
}
}
}
麻烦能把最后一个static 方法里的所有语句,给个注释么?谢谢
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; }}
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; //返回数组