• 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);
            }
        }
    }
  • 相关阅读:
    Python:virtualenv 和 venv
    NHibernate从入门到精通系列(9)——一对多关联映射
    开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo
    Android与IIS身份验证——基本验证
    NHibernate从入门到精通系列(8)——一对一关联映射
    NHibernate从入门到精通系列(10)——多对多关联映射
    Android与IIS身份验证——Form验证
    以C#编写的Socket服务器的Android手机聊天室Demo
    【算法系列】使用LINQ来检测和删除重复的文件
    【算法系列】一道笔试试题——回文数算法
  • 原文地址:https://www.cnblogs.com/FlySheep/p/3661926.html
Copyright © 2020-2023  润新知