1 概述
SQL语句执行后从数据库查询读取数据,返回的数据放在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);
1.1 RSType
类型 | 描述 |
---|
ResultSet.TYPE_FORWARD_ONLY | 光标只能在结果集中向前移动(默认) |
ResultSet.TYPE_SCROLL_INSENSITIVE | 光标可以向前和向后滚动,结果集对创建结果集后发生的数据库所做的更改不敏感。 |
ResultSet.TYPE_SCROLL_SENSITIVE | 光标可以向前和向后滚动,结果集对创建结果集之后发生的其他数据库的更改敏感。 |
1.2 RSConcurrency
并发 | 描述 |
---|
ResultSet.CONCUR_READ_ONLY | 创建只读结果集,默认。 |
ResultSet.CONCUR_UPDATABLE | 创建可更新的结果集 |
2 浏览结果集
方法 | 描述 |
---|
void beforeFirst() | 将光标移动到第一行之前 |
void afterLast() | 将光标移动到最后一行之后。 |
boolean first() | 将光标移动到第一行。 |
void last() | 将光标移动到最后一行。 |
boolean absolute(int row) | 将光标移动到指定的行。 |
relative(int row) | 从当前指向的位置,将光标向前或向后移动给定行数。 |
boolean previous() | 将光标移动到上一行。 |
boolean next() | 将光标移动到下一行。 |
int getRow() | 返回光标指向的行号。 |
void moveToInsertRow() | 将光标移动到结果集中的特殊行,该行可用于将新行插入数据库。当前光标位置被记住。 |
void moveToCurrentRow() | 如果光标当前位于插入行,则将光标移回当前行; 否则,此方法什么也不做 |
3 查看结果集
方法 | 功能 |
---|
int getInt(String columnName) | 返回名为columnName的列中当前行中的int值。 |
int getInt(int columnIndex) | 返回指定列索引当前行中的int值。列索引从1开始 |
每个可能的数据类型都有一个get方法,每个get方法有两个版本:采用类名称和列索引。
在八个Java基本类型中的每一个ResultSet接口中都有get方法,以及常用的类型。如java.lang.String,java.lang.Ojbect和java.net.URL等。还有一些方法可以获取SQL数据类型:java.sql.Date,java.sql.Time,java.sql.TimeStamp,java.sql.Clob和java.sql.Blob等等
4 更新结果集
与get方法一样,每种数据类型都有两种更新方法:采用列名称和列索引。
更新结果集中的一行会更改ResultSet对象中当前行的列,但不会更改底层数据库中的列的值。要更新数据库中的行,需要调用以下方法之一。
方法 | 描述 |
---|
void updateRow() | 更新数据库中当前行 |
void deleteRow() | 从数据库中删除当前行 |
void refreshRow() | 刷新结果集中的数据以反映数据库中最近的任何更改。 |
void cancelRowUpdates() | 取消对当前行所做的任何更新。 |
void insertRow() | 在数据库中插入一行。 只有当光标指向插入行时,才能调用此方法 |
5 数据类型
SQL类型 | JDBC/Java类型 | setXXX |
---|
VARCHAR | String | setString |
CHAR | String | setString |
LONGVARCHAR | String | setString |
BIT | boolean | setBoolean |
NUMERIC | BigDecimal | setBigDecimall |
TINYINT | byte | setByte |
SMALLINT | short | setShort |
INTEGER | int | setInt |
BIGINT | long | setLong |
REAL | float | setFloat |
FLOAT | float | setFloat |
DOUBLE | double | setDouble |
VARBINARY | byte[ ] | setBytes |
BINARY | byte[ ] | setBytes |
DATE | java.sql.Date | setDate |
TIME | java.sql.Time | setTime |
TIMESTAMP | java.sql.Timestamp | setTimestamp |
CLOB | java.sql.Clob | setClob |
BLOB | java.sql.Blob setBlob | |
ARRAY | java.sql.Array | setARRAY |
REF | java.sql.Ref | setRef |
STRUCT | java.sql.Struct | setStruct |
5.1 处理NULL
- SQL使用NULL值和Java使用null是不同的概念
- 避免使用返回原始数据类型的getXXX()方法
- 对原始数据类型使用包装类,并使用ResultSet对象的wasNull()方法来测试接收getXXX()方法的返回值的包装器类变量是否应该设置为null。
- 使用原始数据类型和ResultSet对象的wasNull()方法来测试接收到由getXXX()方法返回的值的原始变量是否应设置为表示NULL的可接受值。