利用反射技术将查询结果封装为对象

public class ORMTest extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建sql语句
        String sql = "select username as Username,password as Password from user where id<?";
        //创建个数组,用于给sql语句中的sql赋值
        Object obj[] = new Object[]{1020};
        try {
            //调用getObject方法得到一个Object对象的集合
            List<Object> list = getObject(sql, obj, User.class);
            //将list存在request域中
            request.setAttribute("list", list);
            //转发到index.jsp页面
            request.getRequestDispatcher("/index.jsp").forward(request, response);
        } catch (InstantiationException | IllegalAccessException
                | IllegalArgumentException | InvocationTargetException e) {
            e.printStackTrace();
        }


    }
    static List<Object> getObject(String sql,Object obj[],Class clazz) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
        Connection conn=null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        JDBCUtils utils = JDBCUtils.getInstance();
        List<Object> list = new ArrayList<>();
        try {
            conn = utils.getConnection();
            ps = conn.prepareStatement(sql);
            //获取参数的元数据
            ParameterMetaData pmd = ps.getParameterMetaData();
            //获取?个数
            int count = pmd.getParameterCount();
            //将数组中的元素对应的赋值给sql中的?
            for(int i=1;i<=count;i++){
                ps.setObject(i, obj[i-1]);
            }
            //执行sql
            rs=ps.executeQuery();
            //得到传进来的Bean的所有方法
            Method ms[] = clazz.getMethods();
            //遍历结果集
            while(rs.next()){
                //得到结果集元数据
                ResultSetMetaData rsmd = rs.getMetaData();
                //得到一个结果集的列数
                int columnCount = rsmd.getColumnCount();
                //得到bean的实例对象
                Object object = clazz.newInstance();
                //遍历结果集的列
                for(int i=1;i<=columnCount;i++){
                    String columnLabel =rsmd.getColumnLabel(i);//得到列的别名
                    //得到别名后 可以得到这个列的bean的set方法
                    String methodName = "set"+columnLabel;
                    //遍历bean的所有方法
                    for (Method method : ms) {
                        //如果有和这个列的set方法相同的方法
                        if(method.getName().equals(methodName)){
                            //就将数据库查出来的这个列的值付给这个bean
                            method.invoke(object, rs.getObject(columnLabel));
                        }
                    }
                }
                //将这个bean添加到集合中
                list.add(object);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            utils.free(conn, ps, rs);
        }
        return list;
    }

}

//bean
public class User {
    public User() {

    }

    public int id;
    public String username;
    public String password;
    public String sex;
    public String age;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "id="+this.id+"username="+this.username+"password="+this.password
        +"age="+this.age+"sex:"+this.sex;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值