日期:2014-05-16  浏览次数:20496 次

将任意查询结果ResultSet转化成List<Map>
        在JadePool中,提供了若干个查询方法,分别是:
                public List query(String sqlquery, int position, int length, boolean isScrollSenstive) throws SQLException
                public List query(String sqlquery, int timeout) throws SQLException
                public List query(String sqlquery) throws SQLException
        它们支持任意复杂的SQL查询,只要受DBMS支持,只要没有语法错误均可
        在这些方法中,每次完成ResultSet到List<Map>的转换后,立即关闭了ResultSet对象,它们均调用底层的核心方法
                private void _recordMappingToMap(String fieldClassName, String fieldName, ResultSet rs, Map fieldValue) throws SQLException
        在_recordMappingToMap中的参数Map fieldValue可以理解成Java的接口指针
        在早期设计PVO时,我始终认为SQL语言优于EJB的EJBQL语言,优于Hibernate的HQL语言,无论Hibernate的创建者还是使用者怎样的吹捧HQL如何如何的棒,但一个客观的事实是,SQL语言是一种标准的操作数据库的语言,SQL除了在DBMS中使用外,在vb、delphi、php、c/c++、java等等高级语言中均可以使用,它是任何一个软件工作者都无法回避的,是必须掌握的一门基础性语言
        核心类ProcessVO提供了一个将每一条记录转换成一个Map对象的方法,通过循环语句将任意的查询结果ResultSet转换成List<Map>类型的变量。因此,JadePool查询操作没有标新立异,它遵守的是行业标准,在语言语法上追求的是道法自然

        以下是 _recordMappingToMap的源代码

    /**
     * 将ResultSet结果集中的记录映射到Map对象中.
     *
     * @param fieldClassName 是JDBC API中的类型名称,
     * @param fieldName 是字段名,
     * @param rs 是一个ResultSet查询结果集,
     * @param fieldValue Map对象,用于存贮一条记录.
     * @throws SQLException
     */
    private void _recordMappingToMap(String fieldClassName, String fieldName, ResultSet rs, Map fieldValue) throws SQLException {
        fieldName = fieldName.toLowerCase();

        //优先规则:常用类型靠前

        if (fieldClassName.equals("java.lang.String")) {
            String s = rs.getString(fieldName);
            if (rs.wasNull()) {
                fieldValue.put(fieldName, null);
            } else {
                fieldValue.put(fieldName, s);
            }
        } else if (fieldClassName.equals("java.lang.Integer")) {
            int s = rs.getInt(fieldName);
            if (rs.wasNull()) {
                fieldValue.put(fieldName, null);
            } else {
                fieldValue.put(fieldName, s);//早期jdk需要包装,jdk1.5后不需要包装
            }
        } else if (fieldClassName.equals("java.lang.Long")) {
            long s = rs.getLong(fieldName);
            if (rs.wasNull()) {
                fieldValue.put(fieldName, null);
            } else {
                fieldValue.put(fieldName, s);
            }
        } else if (fieldClassName.equals("java.lang.Boolean")) {
            boolean s = rs.getBoolean(fieldName);
            if (rs.wasNull()) {
                fieldValue.put(fieldName, null);
            } else {
                fieldValue.put(fieldName, s);
            }
        } else if (fieldClassName.equals("java.lang.Short")) {
            short s = rs.getShort(fieldName);
            if (rs.wasNull()) {
                fieldValue.put(fieldName, null);
            } else {
                fieldValue.put(fieldName, s);
            }
        } else if (fieldClassName.equals("java.lang.Float")) {
            float s = rs.getFloat(fieldName);
            if (rs.wasNull()) {
                fieldValue.put(fieldName, null);
            } else {
                fieldValue.put(fieldName, s);
            }
        } else if (fieldClassName.equals("java.lang.Double")) {
            double s = rs.getDouble(fieldName);