天天看点

Java JDBC学习实战(二): 管理结果集

java提供了一个api,专门用于表示查询的结果集——resultset。此外,还提供了一个结果集的分析工具——resultsetmetadata。

一、 resultset的介绍

1.1 可移动、可更新的resultset

 《java jdbc学习实战(一): jdbc的基本操作》一文里,介绍过resultset的相关方法,可以通过一系列的方法来移动记录指针,如:absolute、previous、next、first、last、beforefirst、afterlast等方法。

resultset默认是不支持更新的,如果希望resultset完成更新操作,必须在创建statement或preparestatement时传入一些参数。

connection对象在创建statement或preparestatement时可以传入两个参数:

a、 resultsettype:控制resultset的类型,该参数有以下三个值:

    a、 resultset.type_forward_only该常量控制记录指针只能向前移动。

    b、 resultset.type_scroll_insensitive:该常量控制记录指针自由移动(可滚动结果集),但底层的数据改变不影响结果集resultset的内容

    c、 resultset.type_scroll_sensitive:该常量控制记录指针自由移动,但底层数据的影响会改变结果集resultset的内容

b、 resultsetconcurrency:控制resultset的并发类型,该参数可以接收如下两个值:

    a、 resultset.concur_read_only:该常量表示resultset是只读并发模式

    b、 resultset.concur_updatable:该常量表示resultset是更新并发模式

通过preparestatement、statement的创建时进行参数设置来创建可滚动、可更新的resultset,然后通过rs的updatexxx方法来完成某列的更新值设置,通过updaterow来提交修改。

1.2、 resultset中的二进制blob数据处理

blob类型通常用来存储文件,如:图片、音频、视频文件。将文件转换成二进制保存在数据库中,取出来的时候可以二进制数据恢复成文件。

如果要插入图片到数据库,显然不能直接设置sql参数拼接字符串进行插入。因为二进制常量无法表示。

但是将blob类型数据插入到数据可以用preparestatement,通过preparestatement对象的setbinarystream方法将参数传入到二进制输入流;也可以用blob对象的getbytes方法直接取出数据。

二、 操作可滚动可更新的结果集

示例:(来自《疯狂java讲义》)

注: 如果要创建可更新的结果集,则使用查询的数据通常只能来自一个数据表,而且查询结果集中的数据列必须包含主键列,否则将会更新失败。

三、 处理blob类型数据

比如我们有如下数据表,表中的字段img_data类型为mediumblob,专门保存图片数据

create table img_table(

   img_id int auto_increment primary key,

   img_name varchar(255),

   #创建一个mediumblob类型的数据列,用于保存图片数据

   img_data mediumblob

);

之前已经讲过,操作图片数据,需要通过preparestatement对象的setbinarystream方法来实现.

可见,上述程序已经能完成图片数据的插入操作,那如何读取数据库的图片数据呢?resultset结果集可以直接通过getblob()方法,得到blob数据,可以再将其转为stream进行操作。

四、 使用resultsetmetadata分析结果集

在我们查询数据返回的结果集中,我们不清楚结果集存放的数据类型、数据列数。

那样我们就可以用resultsetmetadata来读取resultset的信息。

通过resultset的getmetadata()的方法可以获取resultsetmetadata对象。

然后可以用resultsetmetadata对象的方法来操作resultset,常用方法如下:

int getcolumncount():返回resultset的列名数量

int getcolumntype(int column):返回指定索引的类型

string getcolumnname(int column):返回指定索引的列名

注:虽然,resultsetmetadata可以准确地分析出resultset里包含了多少列,以及每列的列名、数据类型等,但使用resulesetmetadata需要一定的系统开销,开发中尽量不要使用该api。