???????????????ResultSetMetaData??????DBUtils???????????????

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了???????????????ResultSetMetaData??????DBUtils???????????????相关的知识,希望对你有一定的参考价值。

?????????shm   override   update   time   ??????   ????????????   ??????????????????   ??????   cti   

??????DBUtils???????????????JDBC?????????,??????????????????????????????,???????????????????????????,?????????JDBC???????????????.??????????????????????????????????????????????????????????????????????????????????????????????????????????????????,??????DBUtils??????????????????????????????????DBUtils????????????????????????,???????????????????????????DBUtils?????????,??????????????????????????????????????????.??????

??????ResultSetMetaData???????????????ResultSet??????????????????????????????????????????.??????????????????????????????,??????????????????,???????????????:getColumnCount():??????ResultSet????????????????????????.getColumnName(int column):????????????????????????????????????.?????????????????????????????????????????????????????????????????????DBUtils???~???????????????????????????:

??????1.??????MyQueryRunner???executeUpdate??????.

???????????????????????????????????????,??????????????????dataSource??????Connection,?????????????????????????????????jdbc??????.??????????????????,????????????????????????????????????PreparedStatement???.????????????:

public int update(String sql, Object... params) {
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        try {
            connection=dataSource.getConnection();
            preparedStatement=connection.prepareStatement(sql);
            for(int i=0;i<params.length;i++) {
                preparedStatement.setObject((i+1), params[i]);//????????????.
            }
            int x=preparedStatement.executeUpdate();//??????????????????.
            return x;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        finally {
            if(preparedStatement!=null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

??????2.??????MyQueryRunner???executeQuery??????.

????????????????????????????????????,?????????????????????????????????????????????ResultSetHandler?????????????????????.????????????:

//?????????????????????.
    //??????????????????BeanHandler BeanListHandler MapListHandler
     public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) {
         Connection connection=null;
            PreparedStatement preparedStatement=null;
            ResultSet rs=null;
            try {
                connection=dataSource.getConnection();
                preparedStatement=connection.prepareStatement(sql);
                if(params!=null) {
                    for(int i=0;i<params.length;i++) {
                        preparedStatement.setObject((i+1), params[i]);
                    }
                }
                rs=preparedStatement.executeQuery();
                return rsh.handle(rs);//?????????????????????
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
            finally {
                if(rs!=null) {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(preparedStatement!=null) {
                    try {
                        preparedStatement.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if(connection!=null) {
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
     }

??????3.3?????????????????????.

?????????MyQueryRunner?????????????????????????????????,???????????????????????????,????????????????????????BeanHandler,BeanListHandler,MapListHandler???????????????,??????????????????????????????(?????????????????????????????????= =)?????????.????????????BeanHandler???????????????,Handler?????????????????????????????????,???????????????????????????????????????,???????????????????????????.

??????BeanHandler????????????????????????,??????T t????????????????????????JavaBean,??????????????????????????????????????????,??????Class type??????,????????????Class,??????JavaBean???????????????t,??????Field?????????t?????????????????????.?????????????????????,?????????getColumnCount???????????????????????????,???????????????,??????getColumnName(int columnCount)??????????????????,???Class?????????getField????????????Field??????(??????JavaBean???????????????????????????????????????!???????????????),?????????Field?????????set????????????.??????Field?????????????????????????????????????????????(JavaBean?????????.)?????????????????????setAccessable???????????????.?????????????????????:

public class MyBeanHandler<T> implements ResultSetHandler{
    private Class<T> type;
    T t;//???????????????JavaBean
    public MyBeanHandler(Class<T> type) {
        this.type=type;
    }
    
    @Override
    public Object handle(ResultSet rs) throws SQLException {
        try {
            t=type.newInstance();
            ResultSetMetaData metaData = rs.getMetaData();
            int count=metaData.getColumnCount();//??????ResultSet??????????????????
            rs.next();//????????????
            //??????????????????????????????,???????????????????????????
            for(int i=1;i<=count;i++) {
                String name=metaData.getColumnName(i);
                Object obj=rs.getObject(i);
                Field field = type.getDeclaredField(name);
                field.setAccessible(true);
                field.set(t, obj);//??????????????????JavaBean
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t;
    }

}

??????MyBeanListHandler???????????????,?????????BeanHandler??????.???????????????????????????????????????next???????????????????????????,??????????????????????????????????????????,?????????????????????List????????????????????????????????????????????????ArrayList.??????????????????:

public class MyBeanListHandler<T> implements ResultSetHandler<List<T>>{
    private Class<T> type;
    List<T> list=new ArrayList<T>();//?????????????????????.????????????ArrayList
    
    public MyBeanListHandler(Class<T> type) {
        this.type = type;
    }

    @Override
    public List<T> handle(ResultSet rs) throws SQLException {
        try {
            ResultSetMetaData metaData = rs.getMetaData();
            int count=metaData.getColumnCount();
            while(rs.next()) {
                T t=type.newInstance();
                for(int i=1;i<=count;i++) {
                    String name=metaData.getColumnName(i);//?????????????????????.???????????????????????????.??????name,age...
                    Object obj=rs.getObject(i);//???????????????
                    Field field = type.getDeclaredField(name);//??????field??????
                    field.setAccessible(true);
                    field.set(t, obj);//?????????
                }
                list.add(t);
            }
            return list;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}

??????MapList????????????????????????,???????????????????????????????????????????????????????????????,???????????????,????????????:

public class MyMapListHandler implements ResultSetHandler<List<Map<String, Object>>> {

    private List<Map<String,Object>> data=new ArrayList<>();

    @Override
    public List<Map<String, Object>> handle(ResultSet rs) throws SQLException {
        ResultSetMetaData metaData = rs.getMetaData();
        int count=metaData.getColumnCount();
        while(rs.next()) {
            Map<String,Object> map=new HashMap<>();
            for(int i=1;i<=count;i++) {
                Object value=rs.getObject(i);
                String name=metaData.getColumnName(i);
                map.put(name, value);
            }
            data.add(map);
        }
        return data;
    }

}

 

以上是关于???????????????ResultSetMetaData??????DBUtils???????????????的主要内容,如果未能解决你的问题,请参考以下文章