JDBC⾼级特性(⼀)结果集,批量更新⼀、ResultSet的⾼级特性
1 可滚动ResultSet
1)向前和向后滚动
滚动特性
在JDBC初期版本号中, ResultSet仅能向前滚动
在JDBC兴许版本号中, ResultSet默认能向前滚动或前后滚动
迟缓滚动:记录集可前后滚动。不受数据库数据更新影响
灵敏滚动:记录集可前后滚动,受数据库数据更新影响南安军
由结果集类型设定
结果集特性设置:
语法
Statement stm = ateStatement(int resultSetType, int resultSetConcurrency,int resultSetHoldability);
南朝鲜北朝鲜演⽰样例:
//默认能够前后滚动。记录集类型:受数据库数据改动影响。
//结果集并发类型:能够更新的并发类型
//结果集可保存性:当前事务提交时结果集被关闭
Statement stm = con. createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE,
ResultSet.CLOSE_CURSORS_AT_COMMIT);
ResultSet rs = uteQuery(“lect * 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="lect id,name,password,age from person";
uteQuery(sql);
()){……..} //从第⼀⾏前開始向下移动
…
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="lect id,name,password,age from person";
uteQuery(sql);
rs.last(); //定位
rs.updateString("name",“oracle");
rs.updateString(3,“oracle”); //updateXXX()⽅法
rs.updateInt(“age”,21); //这些update⽅法不会更新底层数据库
rs.updateRow(); //更新底层数据库
删除⾏:
语法
resultSetVar.deleteRow();
演⽰样例
sql="lect id,name,password,age from person";
uteQuery(sql);
rs.absolute(10); //将指针定位到相应的⾏
rs.deleteRow(); //删除当前⾏数据。同⼀时候删除底层数据库数据
插⼊新⾏:
近期热点新闻
resultSetVar.updateXXX(columnIndex, value);
resultSetVar.updateXXX(“columnName”, value);
resultSetVar.inrtRow();
演⽰样例
rs.updateString(2, “Ro”);
rs.updateString(“password”, “Ro”);
rs.updateInt(“age”, 11);
rs.inrtRow(); //插⼊数据,更新底层数据库
可更新结果集的要求:
不是全部结果集都能更新
可更新的结果集必须满⾜下⾯条件
查询仅仅引⽤了⼀个数据表
查询不包括不论什么联接操作
查询结果中包括主键
查询结果全部列不可为空。没有默认值
做演讲英语⼆、批量更新
1 Statement批量更新
语法:
Statement stm = ateStatement();
设备锁怎么设置
stm.addBatch(sqlString); stm.addBatch(sqlString);……
演⽰样例:
con.tAutoCommit(fal); //设置事务⾮⾃⼰主动提交
Statement stm = ateStatement();
stm.addBatch(“inrt into t_ur(id, name, password) values(11, ‘Ro’, ‘Ro’)”);小脸美女
stm.addBatch (“inrt into t_ur(id, name, password) values(12, ‘Mary’, ‘Mary’)”);
int[] results = uteBatch(); //提交运⾏
批量更新⼀定要将事务提交设为⾮⾃⼰主动提交
con.tAutoCommit(fal);
Statement的executeBatch()⽅法提交多个命令到数据库运⾏。返回每⼀个命令更新⾏数所组成的数组
假设批量更新中的某些命令⽆法正确运⾏,则会抛出 BatchUpdateException异常
BatchUpdateException的getUpdateCounts()⽅法能够返回发⽣此异常之前批量更新中成功运⾏的每⼀个更新语句的更新计数组成的数组
2 PreparedStatement批量更新
PreparedStatement预编译SQL语句。传⼊參数后运⾏
搬迁合同
PreparedStatement批处理将传⼊的參数批量送⼊数据库运⾏相应的SQL语句
PreparedStatement pstm = con.prepareStatement(sqlString);
pstm.tXXX(..); pstm.addBatch();
pstm.tXXX(..); pstm.addBatch();
演⽰样例
con.tAutoCommit(fal);
PreparedStatement pstm = con.prepareStatement(“inrt into t_ur(name) values(?)”); pstm.tString(1, “Ro”); pstm.addBatch();
pstm.tString(1, “John”); pstm.addBatch();
pstm.tString(1, “Mary”); pstm.addBatch();
int[] counts = uteBatch(); it();
3 CallableStatement批量更新
CallableStatement处理数据库储存过程
CallableStatement接⼝继承PreparedStatement接⼝
相关批处理⽅法是从PreparedStatement接⼝继承⽽来
CallableStatement批处理与PreparedStatement批处理模式同样
将传⼊的參数批量送⼊数据库运⾏相应的存储过程