`
java_hanyu
  • 浏览: 69784 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

jdbc学习笔记(三)

    博客分类:
  • jdbc
阅读更多
一.事务(Transaction)
原子操作:不可再分的操作,一个操作不能再分成比它更细小的操作.
事务是针对原子操作的,要求原子操作不可再分,并且必须同时成功同时失败。
事务就是把一些非原子操作,变成原子操作,由应用服务器来提出要求,由数据库服务器来执行操作.

在JDBC中默认是自动提交的,如果要想使用事务,需要按以下步骤执行:
1.要调用con.setAutoCommite(false)方法,把自动提交(commit)置为false。
2.进行正常的数据库操作
3.如果操作成功了可以选择con.commit(),或者操作失败时选择con.roolback();
注意:打开事务就要关闭自动提交,当不需要再使用事务的时候调用setAutoCommite(true).

二.事务并发产生的问题
    三种并发产生的后果:
1,脏读:一个事务读取到了另外一个事务没有提交的数据。
2,重复读:一个事务读取到了另外一个事务提交的数据。它是要保持在同一时间点上读取到的数据相同,希望在一段时间内的数据是不变的。
3,幻读:一个事务读取到了另外一个事务提交的数据。用同样的操作读取两次,得到的记录数不相同。

三.事务隔离级别
    五种控制级别:
TRANSACTION_NONE不使用事务。
TRANSACTION_READ_UNCOMMITTED 允许脏读。
TRANSACTION_READ_COMMITTED防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别
TRANSACTION_REPEATABLE_READ可以防止脏读和不可重复读,
TRANSACTION_SERIALIZABLE可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率

以上的五个事务隔离级别都是在Connection类中定义的静态常量,使用setTransactionIsolation(int level) 方法可以设置事务隔离级别。
如:con.setTransactionIsolation(Connection.REPEATABLE_READ);

四.JDBC2.0新特性
1.可滚动特性和可更新特性
JDBC1.0中是指游标的移动的方向和方式是单向,单步(相对)移动,功能比较简单.
JDBC2.0中游标可以双向,相对或者绝对移动.
可滚动结果集:这种结果集不但可以双向滚动,相对定位,绝对定位,并且还可以修改数据信息。

1)滚动特性
定位函数:
boolean absolute(int row),定位到指定的记录位置。定位成功返回true,不成功返回false。
void afterLast() ,把游标移动到最后一条记录的后面(逻辑位置)。
void beforeFirst() ,把游标移动到第一条记录的前面(逻辑位置)。
//由于第一条记录的前面和最后一条记录的后面这两个位置肯定存在,所以无需判断是否存在,返回值设为void.
boolean first(),把游标定位到第一条记录。
boolean last(),把游标定位到最后一条记录。
//当结果集为空的时候,这两个方法会返回false.
boolean next(),此方法是使游标向下一条记录移动。
boolean previous() ,此方法可以使游标向上一条记录移动,前提是前面还有记录。
boolean relative(int rows) ,相对定位方法,参数值可正可负,参数为正,游标从当前位置向后移动指定值条记录,参数为负,游标从当前位置向前移动指定值条记录。

判断函数:
ifBeforeFirst()判断是否在在第一条记录之前.
ifAfterLast()判断是否在在最后一条记录之后.
ifFirst()判断是否为第一条记录.
ifLast()判断是否为最后一条记录.

要使用可滚动结果集时,需要一次设置更新特性与滚动特性,不能分开.

1.更新特性常量:
CONCUR_READ_ONLY 只读结果集(默认)
CONCUR_UPDATABLE 可更新结果集

2.滚动特性常量:
TYPE_FORWARD_ONLY ,该常量表示指针只能向前移动的 ResultSet 对象的类型。(默认)
TYPE_SCROLL_INSENSITIVE ,该常量指示可滚动但通常不受其他更改影响的 ResultSet 对象的类型。
TYPE_SCROLL_SENSITIVE ,该常量指示可滚动并且通常受其他更改影响的 ResultSet 对象的类型。
//敏感:数据库改变,结果集改变.
语法:        
Statement st=null;
st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE)
在创建Statement的时候就要指定这两个参数,使用Statement,第一个参数代表滚动特性常量,第二个代表更新特性常量

2)可更新特性
a.moveToInsertRow();记录当前游标位置,将游标移到和结果集结构类似的缓冲区;
b.使用updateXxx(int column,columnType value)方法来更新指定列数据;
c.使用insertRow() 方法插入记录;
d.将游标指回原位,moveToCurrentRow() 。

能否使用JDBC2.0 ResultSet的新特性,要看使用的数据库驱动是否支持.
还有只能用于单表且表中有主键字段(可能会是联合主键),不能够有表连接,会取
可更新操作必须满足以下条件:
a.查询只能引用一张表.
b.不能包含任何连接操作.
c.必须把完整的主键查到结果集里面;
d.保证所有字段为非空字段并且没有默认值。

五.数据库元数据:
DatabaseMetaData dbmd = con.getMetaData();//得到数据库元数据
dbmd.supportsResultSetConcurrency(ResultSet.TYPE_FORWARD_ONLY,
                    ResultSet.CONCUR_UPDATABLE);//判断是否支持可更新操作

六.批量更新
优势:
1.节省传递时间
2.并发处理

PreparedStatement:
1.addBatch() 将一组参数添加到 PreparedStatement对象内部
2.executeBatch() 将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。

Statement:
addBatch(String sql)方法会在批处理缓存中加入一条sql语句
executeBatch()执行批处理缓存中的所有sql语句。

注意:PreparedStatement中使用批量更新时,要先设置好参数后再使用addBatch()方法加入缓存。
批量更新中只能使用更新或插入语句

七.SQL3中的数据类型
Array:数组
Sturct:结构
大对象:
Blob:大的二进制数据文件对象。
Clob:大的文本文件对象。
优点:
1.理论上大小没有上限,受制于数据库表空间的大小.
2.流式读取.

使用大对象的步骤:
1.先插入一个空的占位对象empty_blob()(oracle的函数):insert into t_blob values(?,?,empty_blob());
2.获得大对象:select blob_data from t_blob where name = ? for update;
3.获取流进行写入:blob.setBinaryStream(0);
4.通过流来获取blob中存储的数据:blob.getBinaryStream()
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics