JDBC基础(四)

作为基础知识的最后部分,我们来说一说结果集的处理,当然是说对一般结果集的处理.至于存储过程返回的多结果集,我们仍然放在高级应用中介绍.
    SQL语句如何执行的是查询操作,那就要返回一个ResultSet对象,要想把查询结果最后明白地显示给用户,必须对ResultSet进行处理.ResultSet返回的是一个表中符合条件的记录,对ResultSet的处理要逐行处理,而对于每一行的列的处理,则可以按任意顺序(注意,这只是JDBC规范的要求,有些JDBC实现时对于列的处理仍然要求用户按顺序处理,但这是极少数的).事实上,虽然你可以在处理列的时候可以按任意顺序,但如果你按从左到右的顺序则可以得到较高的性能.

    这儿从底层来讲解一下ResultSet对象,在任何介绍JDBC的书上你是不会获得这样的知识的,因为那是数据库厂商的事.ResultSet对象实际维护的是一个二维指针,第一维是指向当前行,最初它指向的是结果集的第一行之前,所以如果要访问第一行,就要先next(),以后每一行都要先next()才能访问,然后第二维的指针指向列,只要当你去rs.getXXX(列)时,才通过Connection再去数据库把真实的数据取出来,否则没有什么机器能真的把要取的数据都放在内存中.
    所以,千万要记住,如果Connection已经关闭,那是不可能再从ResultSet中取到数据的.有很多人问我,我可不可以取到一个ResultSet把它写到Session中然后关闭Connection,这样就不要每次都连结了.我只能告诉你,你的想法非常好,但,是错误的!当然在javax.sql包中JDBC高级应用中有CacheRow和WebCacheRow可以把结果集缓存下来,但那和我们自己开一个数据结构把ResultSet的行集中所有值一次取出来保存起来没有什么两样.
    访问行中的列,可以按字段名或索引来访问.下面是一个简单的检索结果的程序:

    ResultSet rs = stmt.executeQuery(/"select a1,a2,a3 from table/");
    while(rs.next()){
        int i = rs.getInt(1);
        String a = rs.getString(/"a2/");
        ..............
    }

    对于用来显示的结果集,用while来进行next()是最普通的,如果next()返回false,则说明已经没有可用的行了.但有时我们可能连一行都没有,而如果有记录又不知道是多少行,这时如果要对有记录和没有记录进行不同的处理,应该用以下流程进行判断:

    if(rs.next()){
        //因为已经先next()了,所经对记录应该用do{}while();来处理
        do{
            int i = rs.getInt(1);
            String a = rs.getString(/"a2/");
        }while(rs.next());
    }
    esle{
        System.out.println(/"没有取得符合条件的记录!/");
    }

    类型转换:
    ResultSet的getXXX方法将努力把结果集中的SQL数据类型转换为JAVA的数据类型,事实大多数类型是可以转换的,但仍然有不少糊弄是不能转换的,如你不能将一个SQL的float转换成JAVA的DATE,你无法 VARCHAR /"我们/"转换成JAVA的Int.

    较大的值:
    对于大于Statement中getMaxFieldSize返回值的值,用普通的getBytes()或getString()是不能读取的,好在JAVA提供了读取输入浪的方法,对于大对象,我们可以通过rs.getXXXStream()来得到一个InputStream,XXX的类型包括Ascii,Binay,Unicode.根据你存储的字段类型来使用不同的流类型,一般来说,二进制文件用getBinayStream(),文本文件用getAsciiStyream(),对于Unicode字符的文本文件用getUnicodeStream(),相对应的数据库字段类型应该:Blob,Clob和Nlob.

    获取结果集的信息:
    大多数情况下编程人员对数据库结构是了解的,可以知道结果集中各列的情况,但有时并不知道结果集中有哪些列,是什么类型.这时可以通过getMetaData()来获取结果集的情况:
    ResulSetMetaData rsmd = rs.getMetaData();
    rsmd.getColumnCount()返回列的个数.
    getColumnLabel(int)返回该int所对应的列的显示标题
    getColumnName(int)返回该int所对应的列的在数据库中的名称.
    getColumnType(int)返回该int所对应的列的在数据库中的数据类型.
    getColumnTypeName(int)返回该int所对应的列的数据类型在数据源中的名称.
    isReadOnly(int)返回该int所对应的列是否只读.
    isNullable(int)返回该int所对应的列是否可以为空
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值