最近翻了翻以前做的項目,發現了以前用jdbc做查詢,感覺里面有好多將查詢語句封裝到javaBean里的代碼,如
又或者
這種代碼很多,當時應該也用了很多時間在書寫這些相同的代碼,使代碼看起來很冗余,於是自己無事就做了一個工具類,用來自動從resultSet獲取數據並封裝成javabean。
package javaUtil;
import java.awt.List;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.naming.spi.DirStateFactory.Result;
import com.bean.Employee;
import com.bean.MeetingOrder;
import com.bean.MeetingRoom;
import com.dbConn.DbConn;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSetMetaData;
import com.mysql.jdbc.Statement;
/**
*
* @author zqy
* @version 1.0
*/
public class BeanUtil {
/**
*
* @param clazz 傳入一個需要封裝的類
* @param rs 需要進行封裝的rs
* @return 一個封裝好的VO(object)
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InvocationTargetException
* @throws InstantiationException
*/
public Object autoBean(Class<?> clazz,ResultSet rs) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException{
ArrayList<Method> setMethods = new ArrayList<Method>(); //用來存取set方法的集合
Object obj = clazz.newInstance(); // 實例化對象
try {
Method[] method = clazz.getMethods();//對象中的所有方法
for(Method m : method){
if(m.getName().substring(0, 3).contains("set"))//截取前面3個英文字符,看是否為set,如果是暫定為set方法
setMethods.add(m);//將set方法加入集合
}
ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();
int columCount = rsmd.getColumnCount(); //獲取結果中列的個數
//循環,目的為將每一列的值用正確的set方法
for(int i = 1;i<=columCount;i++){
String columName = rsmd.getColumnName(i);//獲取列名
String field = columName.replaceFirst(columName.substring(0, 1),
columName.substring(0, 1).toUpperCase());//因為set方法都是這種形式,setXxxx,因此將列名第一個字母大寫
for(Method m1:setMethods){//遍歷set方法集合
if(m1.getName().equals("set"+field)){//判斷,如果通過判斷既可知道該用對象的什么set方法
Class<?> para[] = m1.getParameterTypes();//獲取方法參數類型,判斷是否為為setBoolean
if(para[0].getName().equals("boolean")){
if(rs.getObject(columName).equals(0)){//因為mysql的boolean是以0,1存在,所以做以下判斷
m1.invoke(obj,false);
}else{
m1.invoke(obj, true);
}
}else{//如果不是setBoolean這種,則執行一下
System.out.println(columName+":"+rs.getObject(columName));
m1.invoke(obj,rs.getObject(columName));//通過反射調用方法
}
}
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;//返回對象
}
/*
*測試
*
*/
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
BeanUtil b = new BeanUtil();
Class a = MeetingRoom.class;
Connection conn = DbConn.getConnection();
String sql = "SELECT * FROM meetingRoom";
Statement stmt;
try {
stmt = (Statement) conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
rs.next();
MeetingRoom m = (MeetingRoom) b.autoBean(a, rs);
System.out.println(m.getMeetingRoomId());
System.out.println(m.getMeetingRoomId());
System.out.println(m.isStatus());
rs.next();
m = (MeetingRoom) b.autoBean(a, rs);
System.out.println(m.getMeetingRoomId());
System.out.println(m.getMeetingRoomId());
System.out.println(m.isStatus());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
輸出結果:
要求數據庫的列名跟bean的變量名相同一一對應。
大概就是以上代碼,可以實現基礎功能,但是感覺寫得還不大好,以后在改進。