zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }
  • 相关阅读:
    navicat 创建查询失败 can not create file
    使用Themeleaf时, HTML内嵌的JS代码需要注意< 和 >的问题
    window下查杀占用端口的进程
    Spring MVC的Rest URL 被错误解析成jsp, 导致404错误(XML方式下@Controller和@RestController需要配置<mvc:annotation-driving/>)
    一个本地DNS解析和mysql授权导致的Mysq连接失败问题(Access denied for user 'loan'@'kfcsdb1' (using password: YES))
    taglib报错The content of element type "taglib" must match "(tlib-version,...)
    cvc-complex-type.2.4.a: Invalid content was found starting with element 'display-name'
    在eclipse中运行spring web application时的异常: java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    Spring3升级到Spring4时, 运行时出现找不到MappingJacksonHttpMessageConverter的情况
    如何在Spring MVC Test中避免”Circular view path” 异常
  • 原文地址:https://www.cnblogs.com/FlySheep/p/3661926.html
Copyright © 2011-2022 走看看