JDBC高级特性(一)结果集,批量更新

一、ResultSet的高级特性

1 可滚动ResultSet

   1)向前和向后滚动

   滚动特性

在JDBC初期版本中, ResultSet仅能向前滚动

在JDBC后续版本中, ResultSet默认能向前滚动或前后滚动

迟缓滚动:记录集可前后滚动,不受数据库数据更新影响

灵敏滚动:记录集可前后滚动,受数据库数据更新影响

由结果集类型设定

con.createStatement()

con.createStatement(结果集类型, 结果集并发类型)

con.createStatement(结果集类型, 结果集并发类型,结果集可保存性)

结果集特性设置:

语法
Statement  stm = con.createStatement(int  resultSetType, int resultSetConcurrency,int  resultSetHoldability);
示例:
//默认可以前后滚动,记录集类型:受数据库数据修改影响,
//结果集并发类型:可以更新的并发类型
//结果集可保存性:当前事务提交时结果集被关闭
Statement  stm = con. createStatement(
    ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE,
    ResultSet.CLOSE_CURSORS_AT_COMMIT);
ResultSet  rs = stm.executeQuery(“select  *  from  student”);


ResultSet结果集类型,结果集并发类型,结果集可保存性特性对PreparedStatament及CallableStatement同样适用
con.prepareStatement(SQL,结果集类型, 结果集并发类型)
con.prepareStatement(SQL,结果集类型, 结果集并发类型,结果集可保存性)

con.prepareCall(SQL,结果集类型, 结果集并发类型)
con.prepareCall(SQL,结果集类型, 结果集并发类型,结果集可保存性)

2 ResultSet定位

   1)让游标指向某一行数据
   2)结果集支持相对定位和绝对定位

结果集定位就是使游标指向记录集中的某一行数据

ResultSet支持绝对和相对定位

使用absolute()和next()方法进行游标定位

示例

sql="select id,name,password,age from person";
rs=stmt.executeQuery(sql);
while(rs.next()){……..}     //从第一行前开始向下移动

rs.absolute(5);       //无论原来指向哪里,直接指向第五行

结果集定位的方法:


3 可更新ResultSet

   1)结果集存放查询结果,默认不可更新
   2)通过connection获得statement对象时可设置参数决定是否可通过结果集更新数据

结果集存放查询结果,默认不可更新

通过connection获得statement对象时可设置结果集并发类型参数决定是否可通过结果集更新数据

如果结果集并发类型设置为CONCUR_UPDATABLE就可以通过结果集修改数据

设置后,可以在结果集中对数据进行更新、删除和插入

使用结果集修改数据时,先定位光标位置然后执行更新、删除或插入数据

更新行:

语法
resultSetVar.updateXXX(columnIndex, value);
resultSetVar.updateXXX(“columnName”,value);
resultSetVar.updateRow();   //两个方法要配合使用
cancelRowUpdates();   //取消更新,必须在updateRow()之前使用
示例
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();     //更新底层数据库


删除行:

语法
resultSetVar.deleteRow();
示例
sql="select id,name,password,age from person";
rs=stmt.executeQuery(sql);
rs.absolute(10);     //将指针定位到对应的行
rs.deleteRow();      //删除当前行数据,同时删除底层数据库数据


插入新行:

语法
resultSetVar.moveToInsertRow();
resultSetVar.updateXXX(columnIndex, value);
resultSetVar.updateXXX(“columnName”, value);
resultSetVar.insertRow();
示例
rs.moveToInsertRow();    //记住指针位置
rs.updateString(2, “Rose”);
rs.updateString(“password”, “Rose”);
rs.updateInt(“age”, 11);
rs.insertRow();       //插入数据,更新底层数据库
rs.moveToCurrentRow();  //将指针移动到记住的指针位置


可更新结果集的要求:

不是所有结果集都能更新

可更新的结果集必须满足以下条件

查询只引用了一个数据表
查询不包含任何联接操作
查询结果中包含主键
查询结果所有列不可为空,没有默认值


二、批量更新

1 Statement批量更新

语法:
Statement stm = con.createStatement();
stm.addBatch(sqlString); stm.addBatch(sqlString);……
stm.executeBatch();
示例:
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();                //提交事务,使更改成为持久更改


批量更新一定要将事务提交设为非自动提交

con.setAutoCommit(false);
con.commit();
Statement的executeBatch()方法提交多个命令到数据库执行,返回每个命令更新行数所组成的数组
如果批量更新中的某些命令无法正确执行,则会抛出 BatchUpdateException异常
BatchUpdateException的getUpdateCounts()方法可以返回发生此异常之前批量更新中成功执行的每个更新语句的更新计数组成的数组


2  PreparedStatement批量更新

PreparedStatement预编译SQL语句,传入参数后执行
PreparedStatement批处理将传入的参数批量送入数据库执行对应的SQL语句

语法:
PreparedStatement  pstm = con.prepareStatement(sqlString);
pstm.setXXX(..);  pstm.addBatch(); 
pstm.setXXX(..);  pstm.addBatch();
pstm.excuteBatch();
示例
con.setAutoCommit(false);
PreparedStatement pstm = con.prepareStatement(“insert into t_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();


3 CallableStatement批量更新

CallableStatement处理数据库储存过程

CallableStatement接口继承PreparedStatement接口

相关批处理方法是从PreparedStatement接口继承而来

CallableStatement批处理与PreparedStatement批处理模式相同

将传入的参数批量送入数据库执行对应的存储过程


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值