一、介绍
批量操作(batch):当需要成批插入或者更新记录时。可以采用Java的批量更新机制.
这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率.
JDBC的批量处理语句包括下面两个方法:
addBatch(String sql):添加需要批量处理的SQL语句或是参数;
executeBatch();执行批量处理语句;
通常我们会遇到两种批量执行SQL语句的情况:
多条SQL语句的批量处理; :Statement
一个SQL语句的批量传参; :PreparedStatement
Statement 批处理: 一次性可以执行多条sql语句,需要编译多次。
应用场景:系统初始化 (创建表,创建数据等)
添加sql语句,st.addBatch(sql) --添加sql语句
批量处理sql语句,int[] st.executeBatch()
清除缓存: st.clearBatch();
采用Statement.addBatch(sql)方式实现批处理:
• 优点:可以向数据库发送多条不同的SQL语句。
• 缺点:
lSQL语句没有预编译。
l当向数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句。例如:
Insert into user(name,password)values(‘aa’,’111’);
Insert into user(name,password)values(‘bb’,’222’);
Insert into user(name,password)values(‘cc’,’333’);
Insert into user(name,password)values(‘dd’,’444’);
-------------------------------------------------------------------------
PreparedStatement 批处理: 执行一条sql语句,编译一次,执行sql语句的参数不同。
应用场景:表数据初始化
添加批量参数:psmt.addBatch() --添加实际参数,执行之前,需要执行psmt.setXxx()
设置实际参数
执行批处理:int[] psmt.executeBatch()
清除缓存:pstm.clearBatch();
采用PreparedStatement.addBatch()实现批处理
• 优点:发送的是预编译后的SQL语句,执行效率高。
• 缺点:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。
二、用法
实例:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.hbsi.utils.DBManager;
public class Demo3 {
public static void main(String[] args) {
Demo3 d=new Demo3();
d.testBatch();
}
public void testBatch(){
Connection con=null;
Statement st=null;
ResultSet rs=null;
try {
con=DBManager.getConnection();
String sql1="insert intotestbatch value(1,'aaa')";
String sql2="insert intotestbatch value(1,'aaa')";
String sql3="select fromtestbatch where id=1";
st=con.createStatement();//st对象中有一个集合对象list
//向批中添加sql语句
st.addBatch(sql1);
st.addBatch(sql2);
st.addBatch(sql3);
//提交给批
st.executeBatch();//影响行数
st.clearBatch();
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBManager.release(con, st, rs);
}
}
public void testBatch2(){
Connection con=null;
PreparedStatement st=null;
ResultSet rs=null;
try {
con=DBManager.getConnection();
String sql="inster intotestbatch value(?,?)";
st=con.prepareStatement(sql);
for(int i=3;i<10000004;i++){
st.setInt(1, i);
st.setString(2, "aa"+i);//已经形成了一条完整的sql语句
st.addBatch();
//可防止outofmemoryError异常,但是Mysql插入时比较慢。
if(i%1000==0){
st.executeBatch();
st.clearBatch();
}
st.executeBatch();
st.clearBatch();
}
st.executeBatch();
st.clearBatch();
// st.setInt(1, 3);
// st.setString(1, "qq");//已经形成了一条完整的sql语句
// st.addBatch();
// st.setInt(1, 4);
// st.setString(2, "ddd");//有形成了第二条完整的sql语句
// st.addBatch();
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBManager.release(con, st, rs);
}
}
}
三、使用addBatch进行批处理操作的几种方式
public static void exeBatch(Connection conn) {
try {
String sql = "insert into t_example (code, name) values (?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "java2");
pstmt.setString(2, "java");
//添加一次预定义参数
pstmt.addBatch();
pstmt.setString(1, "360sdn");
pstmt.setString(2, "软件开发技术网");
//再添加一次预定义参数
pstmt.addBatch();
//批量执行预定义SQL
pstmt.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConnection(conn);
}
}
方式二、批量执行混合模式的SQL、有预定义的,还有静态的
//批量执行混合模式的SQL、有预定义的,还有静态的
public static void exeBatchMixedSQL( Connection conn) {
PreparedStatement pstmt =null;
try {
String sql = "insert into t_example (code, name) values (?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "java");
pstmt.setString(2, "360sdn");
//添加一次预定义参数
pstmt.addBatch();
pstmt.setString(1, "360sdn");
pstmt.setString(2, "软件开发技术网");
//再添加一次预定义参数
pstmt.addBatch();
//添加一次静态SQL
pstmt.addBatch("update t_example set code= '360.com' where code='360sdn'");
//批量执行预定义SQL
pstmt.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConnection(conn);
}
}
方式三、执行批量静态的SQL
//执行批量静态的SQL
ublic static void exeBatchSQL(Connection conn) {
try {
Statement stmt = conn.createStatement();
//连续添加多条静态SQL
stmt.addBatch("insert into t_example (code, name) values ('java', '360sdn.com')");
stmt.addBatch("insert into t_example (code, name) values ('360', '360sdn')");
stmt.addBatch("delete from t_example where code='java'");
stmt.addBatch("update t_example set kind = '360data' where kind='360'");
//批量执行不支持Select语句
// stmt.addBatch("select count(*) from t_example");
//执行批量执行
stmt.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConnection(conn);
}
}