发表于: 2020-04-28 23:00:47

1 1197


管理结果集 ResultSet

一,可滚动、更新的结果集

ResultSet 定位指针的方法有:next() previous() first() last() beforeFirst() afterLast() absolute() 可以使用这些方法自由移动指针的 ResultSet 被称为可滚动的结果集(java 5 以后默认打开的 ResultSet 就是可滚动的)。


默认打开的 ResultSet 是不可更新的,创建可更新的结果集需要在创建 Statement 对象的时候传入额外的参数。

(a)resultSetType:控制 ResultSet 的类型,可取以下三个值(后两个值的作用需要底层数据库的支持)

                ResultSet.TYPE_FORWARE_ONLY:控制指针只能向前移动(JDK1.4以前的默认值)

                ResultSet.TYPE_SCROLL_INSENSITIVE:控制指针可自由移动,但是底层数据的改变不会影响 ResultSet 的内容

                ResultSet.TYPE_SCROLL_SENSITIVE:控制指针可以自由移动,且底层数据的改变会影响内容。


(b)resultSetConcurrency:控制 ResultSet 的并发类型,可以接受如下两个值:

                ResultSet.CONNCUR_READ_ONLY:指示该 ResultSet 是只读的并发模式(默认)

                ResultSet.CONCUR_UPDATEABLE:指示是可更新的并发模式


可更新的结果集还需要满足以下条件:

(a)所有的数据都来自一个表

(b)选出的数据必须包含主键列


二,处理 Blob 类型数据(Binary Long Object)

Blob 通常用于存储大文件(图片与视频),需要使用 PrepareStatement,该对象有一个方法:setBinaryStream(int parameterIndex, InputStream x) 为指定参数传入二进制输入流,从而将 Blob 数据存储到数据库。

取出 blob 数据可以调用 ResultSet 的 getBlob(int columnIndex) 方法,返回的 Blob 对象提供了 getBinaryStream() 方法来获取该 Blob 数的输入流,也可以通过 Blob 对象的 getBytes() 方法直接去除 Blob 对象封装的二进制数据。


三,使用 ResultSetMetaData 分析结果集

获取到 ResultSet 对象后程序可能并不知道包含哪些数据列,以及每列的数据类型,那么可以用 ResultSetMetaData 来获取关于 ResultSet 的描述信息。

使用 ResultSet 的 getMetaData() 方法得到对应的 ResultMetaData 对象后通过其方法来获取描述信息。常用的方法有:

            int getColumnCount():返回该 ResultSet 的列数量

            String getColumnName(int column):返回指定索引的列名

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



【事务处理】

一,事务的概念和 MySQL 事务支持

事务:一步或者或几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。一段程序中可能包含多个事务。


事务的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)

       原子性:事务时应用中的最小执行单位,不可再分。

       一致性:事务执行结果必须使得数据库从一个一致性状态转变为另一个一致性状态。当数据库只包含事务执行成功提交的结果时,数据库处于一致性状态,否则数据库处于一种不正确状态。一致性是通过原子性来保证的。

       隔离性:各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务都是隔离的。

       持续性:也称为持久性,事务一旦提交,对数据库做的任何改变都要记录到永久存储器中,通常就是保存进物理数据库。


数据库的事务由以下语句组成:

       一组DML(数据操纵语言)语句,经过这组语句修改后数据库将保持较好的一致性。

       一条DDL(数据库定义语言)语句。

       一条DCL(数据库控制语言)语句。

DDL 与 DCL 语句最多只能有一条,因为 DDL 和 DCL 语句都会导致事务立即提交。

当事务包含的全部数据库操作都成功执行后,应该立即提交(commit)事务,使得这些修改永久生效。提交方式有两种:

       显式提交:使用 commit

       自动提交:执行 DDL 或者 DCL 语句,或者程序正常退出。

当事务的任何一个数据库操作执行失败后,应该立即回滚(rollback)事务,使该事务中所做的修改全部失效。事务回滚有两种方式,显式回滚、自动回滚

        显式回滚:使用 rollback

        自动回滚:系统错误或者强行退出

MySQL 默认关闭事务(默认自动提交),默认情况下,用户在 MySQL 控制台输入一条 DML 语句。


二,java 8 增强的批量更新

批量更新需要先创建一个 Statement 对象,然后用该对象的 addBatch() 方法将多条 SQL 语句同时收集起来,最后调用新增的 executeLargeBatch() 或者原有的 addBatch() 方法同时执行这些收集起来的 SQL 语句。因为执行的每条 DDL 或者 DML 语句都会返回一个数字,如果这些语句中返回的数字可能大于 Integer.MAX_VALUE,就应该使用 executeLargeBatch(),此时返回的是多个 long 值组成的 long[]。




返回列表 返回列表
评论

    分享到