自己做的一个简易的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的变量名相同一一对应。

大概就是以上代码,可以实现基础功能,但是感觉写得还不大好,以后在改进。

 

posted @ 2017-03-07 19:23  白夜梦想家  阅读(2445)  评论(0编辑  收藏  举报