自己做的一個簡易的resultSet動態封裝到javabean


最近翻了翻以前做的項目,發現了以前用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的變量名相同一一對應。

大概就是以上代碼,可以實現基礎功能,但是感覺寫得還不大好,以后在改進。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM