一、实现批处理有两种方式
1、第一种方式:Statement.addBatch(sql)。
优点:可以向数据库发送多条不同的SQL语句。
缺点:SQL语句没有预编译。单向数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句。
2、第二种方式:PreparedStatement.addBatch()。
优点:发送的是预编译后的SQL语句,执行效率高。
缺点:只能应用在SQL语句相同,但参数不同的批处理中。
因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。
二、获得数据库自动生成的主键
PreparedStatement st = conn. prepareStatement(sql,Statement.RETURN_GENERATED_KEYS );
此参数仅对insert操作有效。
三、案例:
1、批处理代码:
package cn.itcast.web.jdbc.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import cn.itcast.web.jdbc.util.JdbcUtil; //Statement和PreparedStatment的批处理 public class Demo3 { public static void statementBatch() { Connection conn = null; Statement stmt = null; ResultSet rs = null; String insertSQL = "insert into user(username,password,birthday,salary) values(‘jack‘,‘000111‘,‘2011-10-26‘,5000)"; String updateSQL = "update user set username=‘杰克‘ where username=‘jack‘"; try { conn = JdbcUtil.getMySqlConnection(); stmt = conn.createStatement(); //将需要执行的多条命令加入到批对象中 stmt.addBatch(insertSQL); stmt.addBatch(updateSQL); //一次性发送批对象到数据库端执行,返回每条SQL的结果 int[] is = stmt.executeBatch(); //将批对象清空 stmt.clearBatch(); //显示结果 System.out.println(is[0]+":"+is[1]); } catch (Exception e) { e.printStackTrace(); }finally{ JdbcUtil.close(rs); JdbcUtil.close(stmt); JdbcUtil.close(conn); } } public static void preparedBatch() { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; String insertSQL = "insert into user(username,password,birthday,salary) values(?,?,?,?)"; try { conn = JdbcUtil.getMySqlConnection(); pstmt = conn.prepareStatement(insertSQL); long begin = System.currentTimeMillis(); for(int i=1;i<=1000;i++){ pstmt.setString(1,"jack"+i); pstmt.setString(2,"111111"); pstmt.setDate(3,new java.sql.Date(12345)); pstmt.setFloat(4,5000); //加入到批对象中 pstmt.addBatch(); if(i%100==0){ //执行批对象 pstmt.executeBatch(); //清空批对象 pstmt.clearBatch(); } } //执行批对象 pstmt.executeBatch(); //清空批对象 pstmt.clearBatch(); long end = System.currentTimeMillis(); System.out.println((end-begin)/1000+"秒"); } catch (Exception e) { e.printStackTrace(); }finally{ JdbcUtil.close(rs); JdbcUtil.close(pstmt); JdbcUtil.close(conn); } } public static void main(String[] args) { //statementBatch(); preparedBatch(); } }
2、获取主键:
package cn.itcast.web.jdbc.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import cn.itcast.web.jdbc.util.JdbcUtil; //获取数据库表插入的主键 public class Demo4 { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; String insertSQL = "insert into user(username,password,birthday,salary) values(‘jack‘,‘000111‘,‘2011-10-26‘,5000)"; try { conn = JdbcUtil.getMySqlConnection(); pstmt = conn.prepareStatement(insertSQL,Statement.RETURN_GENERATED_KEYS); pstmt.executeUpdate(); //获取插入记录的键值 rs = pstmt.getGeneratedKeys(); if(rs.next()){ Long temp = (Long) rs.getObject(1); int primaryValue = temp.intValue(); System.out.println("主键值="+primaryValue); } } catch (Exception e) { e.printStackTrace(); }finally{ JdbcUtil.close(rs); JdbcUtil.close(pstmt); JdbcUtil.close(conn); } } }