热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

JDBC高级特性(一)结果集,批量更新:1可滚动ResultSet1)向前和向后滚动滚动特性在JDBC初期版本号中,ResultSet仅能向前滚动在JDBC兴许版本号中,Resul

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批处理模式同样

将传入的參数批量送入数据库运行相应的存储过程


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


推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
author-avatar
请允许我的每一天有你_248
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有