您的位置:首页 > 编程语言 > Java开发

java之JDBC相关整理

2015-12-15 15:47 344 查看
JDBC1.0 、JDBC2.0 、JDBC3.0 中分别用以下方法创建Statement 。

JDBC1.0 : createStatement()

JDBC2.0 : createStatement(resultSetType, resultSetConcurrency)

JDBC3.0 : createStatement(resultSetType, resultSetConcurrency, resultSetHoldability)

ResultSetType:

resultSetType 的可选值有: ResultSet.TYPE_FORWARD_ONLY 、ResultSet.TYPE_SCROLL_INSENSITIVE 、ResultSet.TYPE_SCROLL_SENSITIVE 。

1 :ResultSet.TYPE_FORWARD_ONLY

默认的cursor 类型,仅仅支持结果集forward ,不支持backforward ,random ,last ,first 等操作。 

2 :ResultSet.TYPE_SCROLL_INSENSITIVE

支持结果集backforward ,random ,last ,first 等操作,对其它session 对数据库中数据做出的更改是不敏感的。

实现方法:从数据库取出数据后,会把全部数据缓存到cache 中,对结果集的后续操作,是操作的cache 中的数据,数据库中记录发生变化后,不影响cache 中的数据,所以ResultSet 对结果集中的数据是INSENSITIVE 的。

3 :ResultSet.TYPE_SCROLL_SENSITIVE

支持结果集backforward ,random ,last ,first 等操作,对其它session 对数据库中数据做出的更改是敏感的,即其他session 修改了数据库中的数据,会反应到本结果集中。

实现方法:从数据库取出数据后,不是把全部数据缓存到cache 中,而是把每条数据的rowid 缓存到cache 中,对结果集后续操作时,是根据rowid 再去数据库中取数据。所以数据库中记录发生变化后,通过ResultSet 取出的记录是最新的,即ResultSet 是SENSITIVE 的。 但insert 和delete 操作不会影响到ResultSet ,因为insert 数据的rowid 不在ResultSet 取出的rowid 中,所以insert 的数据对ResultSet 是不可见的,而delete
数据的rowid 依旧在ResultSet 中,所以ResultSet 仍可以取出被删除的记录( 因为一般数据库的删除是标记删除,不是真正在数据库文件中删除 )。

ResultSetConcurrency:

ResultSetConcurrency的可选值有2个:

ResultSet.CONCUR_READ_ONLY 在ResultSet中的数据记录是只读的,不可以修改

ResultSet.CONCUR_UPDATABLE 在ResultSet中的数据记录可以任意修改,然后更新到数据库,可以插入,删除,修改。

ResultSetHoldability:

ResultSetHoldability 表示在结果集提交后结果集是否打开,可选值有2 个 :

HOLD_CURSORS_OVER_COMMIT: 在事务commit 或rollback 后,ResultSet 仍然可用。

CLOSE_CURSORS_AT_COMMIT: 在事务commit 或rollback 后,ResultSet 被关闭。

需要注意的地方:

1 :Oracle 只支持HOLD_CURSORS_OVER_COMMIT 。

2 :当Statement 执行下一个查询,生成第二个ResultSet 时,第一个ResultSet 会被关闭,这和是否支持支持HOLD_CURSORS_OVER_COMMIT 无关。

Statement st = conn.CreateStatement();

ResultSet rs = Statement.excuteQuery(sqlStr);

这个ResultSet他起到的作用就是完成了查询结果的存储功能,而且只能读去一次,不能够来回的滚动读取。

由于这种结果集不支持,滚动的读去功能所以,如果获得这样一个结果集,只能使用它里面的next()方法,逐个的读去数据。

Statement st = conn.createStatement(int resultSetType, int resultSetConcurrency)

ResultSet rs = st.executeQuery(sqlStr)

这个类型支持前后滚动取得纪录next()、previous(),回到第一行first(),同时还支持要去的ResultSet中的第几行absolute(int n),以及移动到相对当前行的第几行relative(int n),

Statement st = conn.createStatement(Result.TYPE_SCROLL_INSENITIVE, ResultSet.CONCUR_READ_ONLY);

ResultSet rs = st.excuteQuery(sqlStr);

用这个Statement执行的查询语句得到的就是可滚动的ResultSet。

Statement st = createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE);

ResultSet对象可以完成对数据库中表的修改,ResultSet只是相当于数据库中表的视图,所以并不是所有的ResultSet只要设置了可更新就能够完成更新的,能够完成更新的ResultSet的SQL语句必须要具备如下的属性:

a、只引用了单个表。

b、不含有join或者group by子句。

c、那些列中要包含主关键字。

具有上述条件的,可更新的ResultSet可以完成对数据的修改,

ResultSet 维护指向其当前数据行的光标。每调用一次 next 方法,光标向下移动一行。最初它位于第一行之前,因此第一次调用 next 将把光标置于第一行上,使它成为当前行。随着每次调用 next 导致光标向下移动一行,按照从上至下的次序获取ResultSet 行。

在 ResultSet 对象或其父辈 Statement 对象关闭之前,光标一直保持有效。

在 SQL 中,结果表的光标是有名字的。如果数据库允许定位更新或定位删除,则需要将光标的名字作为参数提供给更新或删除命令。可通过调用方法getCursorName 获得光标名。

String s = rs.getString("title");

String s = rs.getString(2);

注意列是从左至右编号的,并且从列 1 开始。同时,用作 getXXX 方法的输入的列名不区分大小写。

有些情况下,SQL 查询返回的结果集中可能有多个列具有相同的名字。如果列名用作 getXXX 方法的参数,则 getXXX 将返回第一个匹配列名的值。因而,如果多个列具有相同的名字,则需要使用列索引来确保检索了正确的列值。

如果列名已知,但不知其索引,则可用方法 findColumn 得到其列号。

ResultSetMetaData rsmd = rs.getMetaData();

int columnCount = rsmd.getColumnCount();

columnCount 就是ResultSet的总列数。

使用 ResultSet.getXXX 方法读取 JDBC NULL 时:

null值:对于返回 Java 对象的 getXXX 方法(例如 getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、   getUnicodeStream、getBinaryStream、getObject 等)。

零值:对于 getByte、getShort、getInt、getLong、getFloat 和 getDouble。

false 值:对于 getBoolean。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: