扩展阅读
  • java命名空间java.sql接口resultset的类成员方法: isafterlast定义及介绍
  • 请问取得resultset后,如何得出记录集的总数
  • java命名空间java.sql接口resultset的类成员方法: isbeforefirst定义及介绍
  • ResultSet的问题
  • java命名空间java.sql接口resultset的类成员方法: previous定义及介绍
  • 关于ResultSet的Cursor移动的问题
  • java命名空间java.sql接口resultset的类成员方法: deleterow定义及介绍
  • 我想问的是,返回的 ResultSet 中的某个字段(int 型),如何放到一个 int[]数组里去。因为 ResultSet 不知道怎样取 size,我又不想用 vector, ResultSet的getArray()方法也是莫名其妙。 iis7站长之家
  • java命名空间java.sql接口resultset的类成员方法: updaterow定义及介绍
  • 有关ResultSet的问题,帮助解决问题者另外加分...
  • java命名空间java.sql接口resultset的类成员方法: getlong定义及介绍
  • 一个简单的问题,有关ResultSet.absolute()
  • java命名空间java.sql接口resultset的类成员方法: getint定义及介绍
  • 请问statement和resultset的关闭先后次序是否有规定,应该哪个先关闭?
  • java命名空间java.sql接口resultset的类成员方法: hold_cursors_over_commit定义及介绍
  • 急急急,关于ResultSet的简单问题。
  • java命名空间java.sql接口resultset的类成员方法: getdate定义及介绍
  • 紧急求救,关于ResultSet的问题
  • java命名空间java.sql接口resultset的类成员方法: last定义及介绍
  • EJB与ResultSet
  • java命名空间java.sql接口resultset的类成员方法: islast定义及介绍
  • 如何得到一个resultSet的长度,即一条select语句返回了多少符合条件记录
  •  
    当前位置:  编程语言>java/jsp

    将ResultSet结果集中的记录映射到Map对象中

     
        发布时间:2014-1-15  


        本文导语:  结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等。 &n...

         结果集(ResultSet)是数据查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等。

           结果集读取数据的方法主要是getXXX() ,他的参数可以使整型表示第几列(是从1开始的),还可以是列名。返回的是对应的XXX类型的值。如果对应那列时空值,XXX是对象的话返回XXX型的空值,如果XXX是数字类型,如Float等则返回0,boolean返回false。使用getString()可以返回所有的列的值,不过返回的都是字符串类型的。XXX可以代表的类型有:基本的数据类型如整型(int),布尔型(Boolean),浮点型(Float,Double)等,比特型(byte),还包括一些特殊的类型,如:日期类型(java.sql.Date),时间类型(java.sql.Time),时间戳类型 (java.sql.Timestamp),大数型(BigDecimalBigInteger等)等。还可以使用getArray(int colindex/String columnname),通过这个方法获得当前行中,colindex所在列的元素组成的对象的数组。使用getAsciiStream(

    int colindex/String colname)可以获得该列对应的当前行的ascii流。也就是说所有的getXXX方法都是对当前行进行操作。

        结果集从其使用的特点上可以分为四类,这四类的结果集的所具备的特点都是和Statement语句的创建有关,因为结果集是通过Statement语句执行后产生的,所以可以说,结果集具备何种特点,完全决定于Statement,当然我是说下面要将的四个特点,在Statement创建时包括三种类型。首先是无参数类型的,他对应的就是下面要介绍的基本的ResultSet对应的Statement。下面的代码中用到的Connection并没有对其初始化变量conn代表的就是Connection对应的对象。SqlStr代表的是响应的SQL语句

        这里查询提供了若干个查询方法,分别是:
                   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转换后,立即关闭了ResultSet对象,它们均调用底层的核心方法
                   private void _recordMappingToMap(String fieldClassName, String fieldName, ResultSet rs, Map fieldValue) throws SQLException
           在_recordMappingToMap中的
    参数Map fieldValue可以理解成Java的接口指针
           在早期设计PVO时,我始终认为SQL语言优于EJBEJBQL语言,优于HibernateHQL语言,无论Hibernate的创建者还是使用者怎样的吹捧HQL如何如何的棒,但一个客观的事实是,
    sql语言是一种标准的操作数据库的语言,sql除了在dbms中使用外,在vbdelphiphp、c/c++、java等等高级语言中均可以使用,它是任何一个软件工作者都无法回避的,是必须掌握的一门基础性语言
           核心ProcessVO提供了一个将每一条记录转换成一个Map对象的方法,通过循环语句将任意的查询结果ResultSet转换成List
    类型的变量。因此,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);
                if (rs.wasNull()) {
                    fieldValue.put(fieldName, null);
                } else {
                    fieldValue.put(fieldName, s);
                }
            } else if (fieldClassName.equals("java.sql.Timestamp")) {
                java.sql.Timestamp s = rs.getTimestamp(fieldName);
                if (rs.wasNull()) {
                    fieldValue.put(fieldName, null);
                } else {
                    fieldValue.put(fieldName, s);
                }
            } else if (fieldClassName.equals("java.sql.Date") || fieldClassName.equals("java.util.Date")) {
                java.util.Date s = rs.getDate(fieldName);
                if (rs.wasNull()) {
                    fieldValue.put(fieldName, null);
                } else {
                    fieldValue.put(fieldName, s);
                }
            } else if (fieldClassName.equals("java.sql.Time")) {
                java.sql.Time s = rs.getTime(fieldName);
                if (rs.wasNull()) {
                    fieldValue.put(fieldName, null);
                } else {
                    fieldValue.put(fieldName, s);
                }
            } else if (fieldClassName.equals("java.lang.Byte")) {
                byte s = rs.getByte(fieldName);
                if (rs.wasNull()) {
                    fieldValue.put(fieldName, null);
                } else {
                    fieldValue.put(fieldName, new Byte(s));
                }
            } else if (fieldClassName.equals("[B") || fieldClassName.equals("byte[]")) {
                //byte[]出现在SQL Server中
                byte[] s = rs.getBytes(fieldName);
                if (rs.wasNull()) {
                    fieldValue.put(fieldName, null);
                } else {
                    fieldValue.put(fieldName, s);
                }
            } else if (fieldClassName.equals("java.math.BigDecimal")) {
                BigDecimal s = rs.getBigDecimal(fieldName);
                if (rs.wasNull()) {
                    fieldValue.put(fieldName, null);
                } else {
                    fieldValue.put(fieldName, s);
                }
            } else if (fieldClassName.equals("java.lang.Object")
                    || fieldClassName.equals("oracle.sql.STRUCT")) {
                Object s = rs.getObject(fieldName);
                if (rs.wasNull()) {
                    fieldValue.put(fieldName, null);
                } else {
                    fieldValue.put(fieldName, s);
                }
            } else if (fieldClassName.equals("java.sql.Array")
                    || fieldClassName.equals("oracle.sql.ARRAY")) {
                java.sql.Array s = rs.getArray(fieldName);
                if (rs.wasNull()) {
                    fieldValue.put(fieldName, null);
                } else {
                    fieldValue.put(fieldName, s);
                }
            } else if (fieldClassName.equals("java.sql.Clob")) {
                java.sql.Clob s = rs.getClob(fieldName);
                if (rs.wasNull()) {
                    fieldValue.put(fieldName, null);
                } else {
                    fieldValue.put(fieldName, s);
                }
            } else if (fieldClassName.equals("java.sql.Blob")) {
                java.sql.Blob s = rs.getBlob(fieldName);
                if (rs.wasNull()) {
                    fieldValue.put(fieldName, null);
                } else {
                    fieldValue.put(fieldName, s);
                }
            } else {//对于其它任何未知类型的处理
                Object s = rs.getObject(fieldName);
                if (rs.wasNull()) {
                    fieldValue.put(fieldName, null);
                } else {
                    fieldValue.put(fieldName, s);
                }
            }
        }
            说明一点,对于一些极少数未知的数据库供应商特有的Java类类型的数据将以Object类型保存在Map对象中


    • 本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
      本站(WWW.)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
      转载请注明:文章转载自:[169IT-IT技术资讯]
      本文标题:将ResultSet结果集中的记录映射到Map对象中
    相关文章推荐:


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3