普通批处理
import java.sql.*;
public class jdbctest1 {
public static void main(String[] args){
String sql1="insert into users values (null,'zhang1','zhang1')";
String sql2="insert into users values (null,'zhang2','zhang2')";
String sql3="insert into users values (null,'zhang3','zhang3')";
String sql4="insert into users values (null,'zhang4','zhang4')";
String sql5="insert into users values (null,'zhang5','zhang5')";
String sql6="insert into users values (null,'zhang6','zhang6')";
String sql7="insert into users values (null,'zhang7','zhang7')";
String sql8="insert into users values (null,'zhang8','zhang8')";
String sql9="update users set nuername='li4' where nuername='zhang4' ";
String sql10="delete from users where nuername='zhangfei' ";
//加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.err.println("驱动加载失败!");
e.printStackTrace();
}
//创建链接
Connection conn=null;
try {
conn= DriverManager.getConnection("jdbc:mysql://localhost:33060/mytest","root","Root");
} catch (SQLException e) {
System.err.println("连接创建失败!");
e.printStackTrace();
}
//生成对象
Statement stmt=null;
try {
stmt=conn.createStatement();
} catch (SQLException e) {
System.err.println("对象生成失败!");
e.printStackTrace();
}
//对话
try {
stmt.addBatch(sql1);
stmt.addBatch(sql2);
stmt.addBatch(sql3);
stmt.addBatch(sql4);
stmt.addBatch(sql5);
stmt.addBatch(sql6);
stmt.addBatch(sql7);
stmt.addBatch(sql8);
stmt.addBatch(sql9);
stmt.addBatch(sql10);
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.setAutoCommit(false);
stmt.executeBatch();
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}
//收尾
}
}
在对话阶段,将各个语句执行加入批处理,然后统一执行,同时增加事务管理机制(commit,rollback),如果一条语句出现问题,则全部回滚
预编译批处理
import java.sql.*;
public class jdbctest3 {
public static void main(String[] args) throws SQLException {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.err.println("驱动加载失败!!");
e.printStackTrace();
}
Connection conn=null;
try {
conn=DriverManager.getConnection("jdbc:mysql://localhost:33060/mytest","root","Root");
} catch (SQLException e) {
System.err.println("连接建立失败!!");
e.printStackTrace();
}
String insertsql="insert into users values(null,?,?)";
PreparedStatement pstmt=null;
try {
pstmt=conn.prepareStatement(insertsql);
} catch (SQLException e) {
System.err.println("对象生成失败!!");
e.printStackTrace();
}
pstmt.setObject(1,"zhao1");
pstmt.setObject(2,"zhao1");
pstmt.addBatch();
pstmt.setObject(1,"zhao2");
pstmt.setObject(2,"zhao2");
pstmt.addBatch();
pstmt.setObject(1,"zhao3");
pstmt.setObject(2,"zhao3");
pstmt.addBatch();
pstmt.setObject(1,"zhao4");
pstmt.setObject(2,"zhao4");
pstmt.addBatch();
conn.setAutoCommit(false);
pstmt.executeBatch();
conn.commit();
if (pstmt!=null){
pstmt.close();
}
if (conn!=null){
conn.close();
}
}
}
同样是在对话阶段,进行批处理。但是观察两个批处理我们可以发现预编译批处理灵活性大大降低。在预编译批处理中,同一批处理只能处理相同类型,例如执行insert操作,那么在这一批中全部都是insert
但是,相对于普通批处理,预编译批处理的安全性要好得多得多,而且,预编译处理是先进行编译的,所以效率相对于普通批处理也很高
大家可以点击这里参考预编译处理机制(sql注入问题解决原理)