jdbc resultset 结果集
jdbc 执行 select 语句查询后,返回的数据放在结果集中,其中 java.sql.resultset 接口表示数据库查询的结果集。
resultset 对象维护指向结果集中当前行的游标。 结果集是指包含在 resultset 对象中的行和列数据。
resultset 接口的方法可以分为三类:
- 浏览方法:用于移动光标。
- 获取方法:用于查看光标指向的当前行的列中的数据。
- 更新方法:用于更新当前行的列中的数据。 然后在基础数据库中更新数据。
光标可以基于 resultset 的属性移动,当创建生成 resultset 的相应 statement 时,将指定这些属性。
jdbc 提供以下方法创建 resultset:
- createstatement(int rstype, int rsconcurrency);
- preparestatement(string sql, int rstype, int rsconcurrency);
- preparecall(string sql, int rstype, int rsconcurrency);
其中,方法中参数:
- 参数 rstype 用于指定 resultset 对象的类型;
- 参数 rsconcurrency 用于指定结果集是只读还是可更新。
1. resultset 类型取值
类型 | 描述 |
---|---|
resultset.type_forward_only | 光标只能在结果集中向前移动。 |
resultset.type_scroll_insensitive | 光标可以向前和向后滚动,结果集对创建结果集后发生的数据库所做的更改不敏感。 |
resultset.type_scroll_sensitive | 光标可以向前和向后滚动,结果集对创建结果集之后发生的其他数据库的更改敏感。 |
如果不指定任何resultset类型,将自动分配一个type_forward_only值。
2. resultset 并发性取值
并发 | 描述 |
---|---|
resultset.concur_read_only | 创建只读结果集,这是默认值。 |
resultset.concur_updatable | 创建可更新的结果集 |
如果不指定任何并发类型,将自动获得一个concur_read_only值。
3. 创建 statement 范例
初始化一个 statement 对象来创建一个向前只读的 resultset 对象:
try { statement stmt = conn.createstatement( resultset.type_forward_only, resultset.concur_read_only); } catch(exception ex) { .... } finally { .... }
4. resultset 移动光标的方法
编号 | 方法 | 描述 |
---|---|---|
1 | public void beforefirst() throws sqlexception | 将光标移动到第一行之前 |
2 | public void afterlast() throws sqlexception | 将光标移动到最后一行之后。 |
3 | public boolean first() throws sqlexception | 将光标移动到第一行。 |
4 | public void last() throws sqlexception | 将光标移动到最后一行。 |
5 | public boolean absolute(int row) throws sqlexception | 将光标移动到指定的行。 |
6 | public boolean relative(int row) throws sqlexception | 从当前指向的位置,将光标向前或向后移动给定行数。 |
7 | public boolean previous() throws sqlexception | 将光标移动到上一行。 如果上一行关闭结果集,此方法返回false。 |
8 | public boolean next() throws sqlexception | 将光标移动到下一行。 如果结果集中没有更多行,则此方法返回false。 |
9 | public int getrow() throws sqlexception | 返回光标指向的行号。 |
10 | public void movetoinsertrow() throws sqlexception | 将光标移动到结果集中的特殊行,该行可用于将新行插入数据库。当前光标位置被记住。 |
11 | public void movetocurrentrow() throws sqlexception | 如果光标当前位于插入行,则将光标移回当前行; 否则,此方法什么也不做 |
5. resultset 读取结果集的方法
resultset 接口包含数十种获取当前行数据的方法。
每个可能的数据类型都有一个 get 方法,每个 get 方法有两个版本。
- 一个是采用列名称。
- 另一个采用列索引。
序号 | 方法 | 描述 |
---|---|---|
1 | public int getint(string columnname) throws sqlexception | 返回名为columnname的列中当前行中的int值。 |
2 | public int getint(int columnindex) throws sqlexception | 返回指定列索引当前行中的int值。列索引从1开始,意味着行的第一列为1,行的第二列为2,依此类推。 |
类似地,在八个 java 基元类型中的每一个的 resultset 接口中都有 get 方法,以及常见的类型,如 java.lang.string,java.lang.object 和 java.net.url 等。
还有一些方法可以获取 sql 数据类型 java.sql.date,java.sql.time,java.sql.timestamp,java.sql.clob 和 java.sql.blob。
6. resultset 更新结果集的方法
resultset 接口包含用于更新结果集的方法。
与 get 方法一样,每种数据类型都有两种更新方法。
- 一个是采用列名称。
- 另一个采用列索引。
序号 | 方法 | 描述 |
---|---|---|
1 | public void updatestring(int columnindex, string s) throws sqlexception | 将指定列中的string值更改为指定的s值。 |
2 | public void updatestring(string columnname, string s) throws sqlexception | 与前前的方法类似,除了使用列的名称而不是列的索引指定。 |
有八种基本数据类型的更新方法,以及java.sql包中的string,object,url和sql数据类型。
更新结果集中的一行会更改resultset对象中当前行的列,但不会更改底层数据库中的列的值。 要更新数据库中的行,需要调用以下方法之一。
序号 | 方法 | 描述 |
---|---|---|
1 | public void updaterow() | 更新数据库中当前行 |
2 | public void deleterow() | 从数据库中删除当前行 |
3 | public void refreshrow() | 刷新结果集中的数据以反映数据库中最近的任何更改。 |
4 | public void cancelrowupdates() | 取消对当前行所做的任何更新。 |
5 | public void insertrow() | 在数据库中插入一行。 只有当光标指向插入行时,才能调用此方法。 |