Oracle培训(三十一)—JDBC第三章知识点总结——JDBC高级特性1--结果集,批量更新,高级数据类型
知识点预览
ResultSet的高级特性
批量更新
高级数据类型
ResultSet的高级特性
1.ResultSet的高级特性
a)可滚动
向前和向后滚动
b)定位
让游标指向某一行数据
结果集支持相对定位和绝对定位
c)可更新
结果集存放查询结果,默认不可更新
通过connection获得statement对象时可设置参数决定是否可通过结果集更新数据
2.滚动特性
a)在JDBC初期版本中,ResultSet仅能向前滚动
b)在JDBC后续版本中,ResultSet默认能向前滚动或前后滚动
迟缓滚动:记录集可前后滚动,不受数据库数据更新影响
灵敏滚动:记录集可前后滚动,受数据库数据更新影响
由结果集类型设定
con.createStatement()
con.createStatement(结果集类型, 结果集并发类型)
con.createStatement(结果集类型, 结果集并发类型,结果集可保存性)
3.结果集特性设置
a)语法
Statement stm = con.createStatement(int resultSetType, intresultSetConcurrency,intresultSetHoldability);
b)示例:
//默认可以前后滚动,记录集类型:受数据库数据修改影响,
//结果集并发类型:可以更新的并发类型
//结果集可保存性:当前事务提交时结果集被关闭
Statement stm = con.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE,
ResultSet.CLOSE_CURSORS_AT_COMMIT);
ResultSet rs =stm.executeQuery(“select * fromstudent”);
…
4.特性设置
a)con.createStatement(结果集类型,结果集并发类型,结果集可保存性);
b)ResultSet.常量
c)结果集特性与数据库及驱动是否支持有关。
5.ResultSet特性总结
a)ResultSet结果集类型,结果集并发类型,结果集可保存性特性对PreparedStatament及CallableStatement同样适用
con.prepareStatement(SQL,结果集类型, 结果集并发类型)
con.prepareStatement(SQL,结果集类型, 结果集并发类型,结果集可保存性)
con.prepareCall(SQL,结果集类型, 结果集并发类型)
con.prepareCall(SQL,结果集类型, 结果集并发类型,结果集可保存性)
6.结果集定位
a)结果集定位就是使游标指向记录集中的某一行数据
b)ResultSet支持绝对和相对定位
c)使用absolute()和next()方法进行游标定位
d)示例
sql="select id,name,password,age from person";
rs=stmt.executeQuery(sql);
while(rs.next()){……..} //从第一行前开始向下移动
…
rs.absolute(5); //无论原来指向哪里,直接指向第五行
…
7.结果集定位的方法
8.结果集修改
a)结果集存放查询结果,默认不可更新
b)通过connection获得statement对象时可设置结果集并发类型参数决定是否可通过结果集更新数据
如果结果集并发类型设置为CONCUR_UPDATABLE就可以通过结果集修改数据
设置后,可以在结果集中对数据进行更新、删除和插入
使用结果集修改数据时,先定位光标位置然后执行更新、删除或插入数据
9.更新行
a)语法
resultSetVar.updateXXX(columnIndex, value);
resultSetVar.updateXXX(“columnName”,value);
resultSetVar.updateRow(); //两个方法要配合使用
cancelRowUpdates(); //取消更新,必须在updateRow()之前使用
b)示例
sql="select id,name,password,age from person";
rs=stmt.executeQuery(sql);
rs.last(); //定位
rs.updateString("name",“oracle");
rs.updateString(3,“oracle”); //updateXXX()方法
rs.updateInt(“age”,21); //这些update方法不会更新底层数据库
rs.updateRow(); //更新底层数据库
10.删除行
a)语法
resultSetVar.deleteRow();
b)示例
sql="select id,name,password,age from person";
rs=stmt.executeQuery(sql);
rs.absolute(10); //将指针定位到对应的行
rs.deleteRow(); //删除当前行数据,同时删除底层数据库数据
11.插入新行
a)语法
resultSetVar.moveToInsertRow();
resultSetVar.updateXXX(columnIndex, value);
resultSetVar.updateXXX(“columnName”, value);
resultSetVar.insertRow();
b)示例
rs.moveToInsertRow(); //记住指针位置
rs.updateString(2, “Rose”);
rs.updateString(“password”, “Rose”);
rs.updateInt(“age”, 11);
rs.insertRow(); //插入数据,更新底层数据库
rs.moveToCurrentRow(); //将指针移动到记住的指针位置
12.可更新结果集的要求
a)不是所有结果集都能更新
b)可更新的结果集必须满足以下条件
i.查询只引用了一个数据表
ii.查询不包含任何联接操作
iii.查询结果中包含主键
iv.查询结果所有列不可为空,没有默认值
批量更新
1.批量更新
a)批量更新是允许同时提交多个更新操作到数据库
b)主要是插入、更新和删除操作
c)实现批量更新
Statement
PreparedStatement
CallableStatement
2.Statement批量更新
a)语法:
Statement stm = con.createStatement();
stm.addBatch(sqlString); stm.addBatch(sqlString);……
stm.executeBatch();
b)示例:
con.setAutoCommit(false);//设置事务非自动提交
Statement stm = con.createStatement();
stm.addBatch(“insert into t_user(id, name, password) values(11,‘Rose’, ‘Rose’)”);
stm.addBatch (“insert into t_user(id, name, password) values(12,‘Mary’, ‘Mary’)”);
int[] results = stm.executeBatch(); //提交执行
con.commit();//提交事务,使更改成为持久更改
c)批量更新一定要将事务提交设为非自动提交
con.setAutoCommit(false);
con.commit();
d)Statement的executeBatch()方法提交多个命令到数据库执行,返回每个命令更新行数所组成的数组
e)如果批量更新中的某些命令无法正确执行,则会抛出 BatchUpdateException异常
f)BatchUpdateException的getUpdateCounts()方法可以返回发生此异常之前批量更新中成功执行的每个更新语句的更新计数组成的数组
3.PreparedStatement批量更新
a)PreparedStatement预编译SQL语句,传入参数后执行
b)PreparedStatement批处理将传入的参数批量送入数据库执行对应的SQL语句
c)语法:
PreparedStatement pstm =con.prepareStatement(sqlString);
pstm.setXXX(..);pstm.addBatch();
pstm.setXXX(..);pstm.addBatch();
pstm.excuteBatch();
d)示例
con.setAutoCommit(false);
PreparedStatement pstm = con.prepareStatement(“insert intot_user(name) values(?)”);
pstm.setString(1, “Rose”); pstm.addBatch();
pstm.setString(1, “John”); pstm.addBatch();
pstm.setString(1, “Mary”); pstm.addBatch();
int[] counts = pstm.excuteBatch(); con.commit();
4.CallableStatement批量更新
a)CallableStatement处理数据库储存过程
b)CallableStatement接口继承PreparedStatement接口
相关批处理方法是从PreparedStatement接口继承而来
CallableStatement批处理与PreparedStatement批处理模式相同
c)将传入的参数批量送入数据库执行对应的存储过程
高级数据类型
1.高级数据类型
a)SQL3将会成为下一个版本的ANSI/ISO数据库语言标准
其中出现了一些高级数据类型,如array等
b)JDBC高级版本中为Java程序开发提供了对应的类型接口
c)SQL数据类型 JDBC接口
d)JDBC中的接口----SQL中的数据类型
Array接口—SQL Array:数组对象
Blob接口—SQL Blob:大二进制对象
Clob接口—SQL Clob:大字符对象
Struct接口—SQL Structure:结构体对象
Ref接口—SQL REF:结构体引用对象
e)与数据库的实现有直接关系,有的数据库不支持
2.JDBC中的高级数据类型接口
a)Array接口
b)Blob接口
c)Clob接口
d)Struct接口
e)Ref接口
f)是SQL类型在Java编程语言中的映射形式
g)用来在Java应用程序中访问数据库中对应类型的数据
h)如果数据库中有实际对象数据,我们使用SQL命令和JDBC将对应数据提取到客户端
3.使用高级数据类型
a)SQL3 数据类型许多运算需要getXXX(), setXXX()和updateXXX()方法
4.Array对象
a)数据库中创建array类型数据(Oracle)
//Oracle中使用array,自定义一个存10个小数的数组类型ints
create type intsas varray(10) of number(4)
//定义一个表,其中一列values类型为自定义的类型ints
create table numbers(values ints)
b)使用:
ResultSet rs =stmt.executeQuery(
“select valuesfrom numbers”);
rs.next();
ARRAY vs = ((OracleResultSet)rs).getARRAY(1);
BigDecimal[] values =(BigDecimal[])vs.getArray();
5.Struct类型
a)SQL Structured类型中包含属性及对应的值
b)SQL Structured类型的成员可以是任意数据类型
c)使用ResultSet的getObject()和setObject()访问结构实例
d)当在Java程序中使用getObject()获得的结构对象必须明确的转换成Struct类型
e)可以使用getAttributes()方法检索Struct对象中属性的值
6.定义新类型
a)在SQL中使用现有类型定义新类型
//定义新类型money,实数,最大长度为10,小数点后2位
create type money as numeric(10, 2)
b)在Java应用程序中会映射到对应基本类型