以上所使用的开发模式是JDBC 1.0提出来的,而现在的JDBC的版本是4.0(没人用),而且从JDBC 2.0开始就已经提出了许多新的特征:可滚动结果集、使用结果集更新数据、批处理,这之中唯一有点用处的就是批处理操作,所谓的批处理指的是一次性向数据库之中发出多条更新指令,在Statement和PreparedStatement接口里面都有对应的方法:
· Statement接口定义的方法:
|- 增加批处理语句:public void addBatch(String sql) throws SQLException;
|- 执行批处理:public int[] executeBatch() throws SQLException;
|- 返回的是每一条SQL语句影响的数据行数量
· PreparedStatement接口定义的方法:
|- 增加批处理:public void addBatch() throws SQLException。
范例:利用Statement来观察问题
package cn.mldn.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class TestDemo {
private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";
private static final String DBUSER = "scott";
private static final String PASSWORD = "tiger";
public static void main(String[] args) throws Exception {
Connection conn = null; // 每一个Connection对象都表示一个连接
Statement stmt = null; // 定义数据库操作对象
Class.forName(DBDRIVER); // 加载数据库驱动程序
conn = DriverManager.getConnection(DBURL, DBUSER, PASSWORD); // 连接数据库
stmt = conn.createStatement() ;
stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");
stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");
stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");
stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");
stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");
int result [] = stmt.executeBatch() ;
for (int x = 0 ; x < result.length ; x ++) {
System.out.print(result[x] + "、");
}
conn.close();
}
}
但是如果说现在有这样一种情况,以上五个要执行SQL语句属于一个完整业务,即:要求所有的SQL一起成功或者是一起失败。但是默认情况下,JDBC中的事务都是自动提交的,所以如果中间出现了错误,那么之前没有错的正常执行,很明显这不符合要求,所以必须手工的进行事务处理,而所有的事务处理命令都在Connection接口中定义:
· 提交事务:public void commit() throws SQLException;
· 回滚事务:public void rollback() throws SQLException;
· 设置自动提交与否:public void setAutoCommit(boolean autoCommit) throws SQLException。
范例:使用事务处理
package cn.mldn.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class TestDemo {
private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:mldn";
private static final String DBUSER = "scott";
private static final String PASSWORD = "tiger";
public static void main(String[] args) throws Exception {
Connection conn = null; // 每一个Connection对象都表示一个连接
Statement stmt = null; // 定义数据库操作对象
Class.forName(DBDRIVER); // 加载数据库驱动程序
conn = DriverManager.getConnection(DBURL, DBUSER, PASSWORD); // 连接数据库
stmt = conn.createStatement() ;
conn.setAutoCommit(false);// 取消自动提交
try {
stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");
stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");
stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");
stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");
stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'张三')");
int result [] = stmt.executeBatch() ;
for (int x = 0 ; x < result.length ; x ++) {
System.out.print(result[x] + "、");
}
conn.commit(); // 提交事务
} catch (Exception e) {
e.printStackTrace();
conn.rollback();
}
conn.close();
}
}
因为日后的开发之中,事务都是自动处理的,用户只需要编写代码就行了。
0 0