JDBC第三讲:jdbc2.0新特征和Updatability结果更新
2014-02-23 16:22
411 查看
一、JDBC 2.0新特性:
1、 Scrollability 结果集可滚动
滚动:可双向支持绝对与相对滚动,对结果集可进行多次迭代。Con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
//上句的 SCROLL 再到 CONCUR;不可以写反,编译器无法检测到,因为他们都是int类型的。
TYPE_FORWARD_ONLY:(单向,一般不用)该常量指示指针只能向前移动的 ResultSet 对象的类型。
TYPE_SCROOL_INSENSITIVE:(双向、不敏感)可滚动但不受其他更改影响的 ResultSet 对象的类型。
TYPE_SCROLL_SENSITIVE:(双向、敏感)该常量指示可滚动并且通常受其他的更改影响的 ResultSet 对象的类型。
CONCUR_READ_ONLY:(只读)该常量指示只可以读取的 ResultSet 对象的并发模式。
CONCUR_UPDATABLE:(可更新)该常量指示可以更新的 ResultSet 对象的并发模式。
绝对定位:boolean absolute(int row)将游标移动到指定位置。(row指记录的序号,没有这位置则返回false)
void afterLast() 将游标指向最后一条记录的后一位(有这位置,但记录为空)。
void beforeFirst()将游标指向最前一条记录的前一位。
boolean first()将游标移动到结果集最前。
boolean last()将游标移动到结果集末尾。
相对定位:boolean next()指向下一个。
boolean previous()指向前一个。
boolean relative(int) 向next()方向移动 int 位(int 可负)。
判位函数:boolean isAfterLast() 是否在最后一条的后一位。
boolean isBeforeFirst() 是否最前一条记录的前一位。
boolean isFirst() 是否最前位置。
boolean isLast() 是否最后位置。
2、 Updatability 结果集可更新。(主要应用于桌面应用)
更新:rs.updateString(“name”,”Tony”);//前面一个是字段的名字或者序号rs.updateInt(1,”122323”);修改
rs.deleteRow();删除
rs.updateRow();
注:只有在必要的时候(如桌面应用)才用结果集更新数据库,因为使用结果集更新数据库效率低下。
可更新结果集还要看数据库驱动程序是否支持,如Oracle就支持,MySql不支持。
并且只能针对一张表做结果集更新(不能子查询)。而且不能有join操作。
必须有主健,必须把所有非空没有默认值的字段查出。
处理可更新结果集时不能用select *来查询语句,必须指出具体要查询的字段。(不能使用通配符)
3、 Batch updates 可批量更新。
将多组对数据库的更新操作发送到数据库统一执行(数据库支持并发执行操作),以提高效率。主要是通过减少数据(Sql语句或参数)在网络上传输的次数来节省时间。//数据有两组以上都应该用这批量更新
(1)对于Statement的批量更新处理:
stm.addBatch(Sql);
int[] ResultSet=stm.executeBatch();
`
(2)对于PreparedStatement的批量跟新处理
pstm.setInt(1,12);pstm.setString(2,”gaga”);……..
pstm.addBatch();
if(i%100==0) int[] ResultSet=pstm.executeBatch();//每个包50~200组数据,包太大也影响速度
注:int[] 中每一个数表示该Sql语句影响到的记录条数。
PreparedStatement的更新操作比Statement的更新操作多了一个设置参数的过程。
二、SQL 3.0规范中的新类型:
Blob,大的二进制数据文件,最多存储2G。Clob,大文本文件对象,最多存储2G。
在使用上述大对象的时候,在使用JDBC插入记录时要先插入一个空的占位对象,
"insert into tableName valuse(?,?,empty_blob())"//在数据库制造一个空的blob对象字段值
然后使用"select blobdata from t_blob where id = ? for update"对获得的大对象进行实际的写入操作
Blod通过getBinaryOutputStream()方法获取流进行写入。
getBinaryStream()方法获得流来获取Blob中存储的数据。
Clob的操作也和、Blob相同。
getAsciiStream()用于读取存储的文本对象,getAsciiOutputStream()方法之获得流用来向文件对象写入的。
BLOB与CLOB的异同点:
① 都可以存储大量超长的数据;
② BLOB (Binary Large Object) 以二进制格式保存,特别适合保存图片、视频文件、音频文件、程序文件等;
③ CLOB (Character Large Object) 以Character格式保存于数据库中,适合保存比较长的文本文件。
三、JDBC 2.0扩展
(一)JNDI(命名目录服务器):
定义:是Java的命名目录服务器。而JDBC是Java的数据库访问接口。跟JDBC是平级的关系,是两个独立的JNDI;JDBC存储的数据都是以二维表的接口来大规模存储数据。
而JNDI存储的是差异性比较大的Java对象。JDBC取数据时用Sql语言访问数据。JNDI只用lookup和bind读写
JDBC API依赖于驱动程序,而JNDI依赖于服务提供者。
JDBC一般把数据存储到关系型数据库,而JNDI一般把数据存储到小型数据库、文件、甚至是注册表中。
JNDI相当于一个电话本。允许程序将一个对象和一个命名绑定到目录树上。
(JNDI的方法是在javax.naming包下,接口是Context实现类是InitialContext)
bind(String name, Object obj) 将名称绑定到对象资源,建立指定的字符串和对象资源的关联
lookup(String name) ,通过指定的字符串获得先前绑定的资源
/*********以下是将资源和JNDI命名绑定的方法**************/
public static void bind(String context, Object obj) throws NamingException{
Properties pro = new Properties();
//Weblogic的JNDI服务器参数
pro.put(InitialContext.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
pro.put(InitialContext.PROVIDER_URL, "t3://localhost:7001");
Context ctx = new InitialContext(pro);//连接服务器
ctx.bind(context, obj);//存储
}
(二)DataSourse(数据源)
1、包含了连接数据库所需的信息,可以通过数据源获得数据库连接,有时由于某些连接数据库的信息会变更,所以经常使用包含数据库连接信息的数据源。
2、一个标准的数据库连接工厂,作为DriverManager的替代项,保存与数据库相关的信息,
可以将数据库的连接信息放在一个共享的空间进行提取,不用在本地安装。
支持JNDI的绑定,支持连接池,支持分布式服务,用getConnection方法可获得与数据库的连接。
数据源应该由管理员创建(目的是为了保证数据库的安全)。所以数据源对象一般放在JNDI服务器中。
/*********通过JNDI获得绑定的资源**************/
public static Object lookup(String context) throws NamingException{
Properties pro = new Properties();
//Weblogic的JNDI服务器参数
pro.put(InitialContext.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
pro.put(InitialContext.PROVIDER_URL, "t3://localhost:7001");
Context ctx = new InitialContext(pro);
return ctx.lookup(context);//查找;通过指定的字符串获得先前绑定的资源。
}
(三)连接池:
在内存中用来保存一个个数据库连接的对象。访问数据库时,建立连接和拆连接需要花费较长时间,通过以连接池直连的方式获取连接,不需要注册驱动程序,可以大量
的节省销毁和创建连接的资源消耗,提高访问数据库的效率。
注:通过连接池获得的Connection,当执行con.close()时,不是关闭连接,而是表示将连接释放回连接池。
连接池是一个很复杂的算法,由服务器厂商实现。
(四)分布式的事务管理器JTA
分布式事务是通过多个异地数据库执行一组相关的操作,要保证原子操作的不可分,也不用再自己写commit,和rollback,全部都交给中间服务器(TM)来处理。
(两阶段提交),也就是在中间服务器发送sql语句等待数据库回应,都回应操作成功才提交,否则同时回滚。
---------------- commit
con1 ------->| TM(事务管理器) | -----------> DB1
con2 ------->| commit | -----------> DB2
---------------- commit
1、regester
2、TM->execute()
3、commit->TM
4、TM->commit->DB
相关文章推荐
- JDBC之处理可滚动的结果集和可更新的结果集
- JDBC可滚动可更新感知更新结果集
- JDBC可滚动和可更新结果集
- JDBC 如何使用可滚动 可更新结果集
- 在JDBC中处理可更新的结果集
- [Java] JDBC 08 处理可更新的结果集 (sun提供了这样的接口,但是不见得所有的数据库厂商都支持)
- JDBC可滚动可更新结果集的探究(来自网络)
- [Java] JDBC 08 处理可更新的结果集 (sun提供了这样的接口,但是不见得所有的数据库厂商都支持)
- 关于JDBC(四)--- 可滚动和可更新结果集
- jdbc 可更新结果集
- 【学习摘记】马士兵JDBC技术_课时15_JDBC处理可更新的结果集
- jdbc 可更新的结果集
- JDBC 如何使用可滚动 可更新结果集
- JDBC2.0操作:结果集,更新,插入,删除,批处理语句
- [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之四十九:使用SqlDataSource插入、更新以及删除数据
- Swift2.0语法更新(3)
- 微软发布SQL Server JDBC Driver 2.0
- 8、关于增强版的GenericityJDBCUtils的实现,可灵活的处理select的返回结果
- JDBC增删改查--数据库增加删除、更新、查找实例
- 金山反间谍2.0即将发布——金山毒霸07年2月更新版