Java Web总结十三之四使用JDBC进行批处理

一、实现批处理有两种方式

  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);
        }
    }
}
原文地址:https://www.cnblogs.com/FlySheep/p/3661926.html