天天看点

【Oracle】将数据批量导入到Oracle数据库

一:利用addBatch()和executeBatch()批量插入数据

public void addFlowCardDetail(String flowCardVouNo,
            List<FlowCardDetail> flowCardDetailList) throws DaoException {
        Connection conn=null;
        try{
            //加载驱动
            Class.forName("oracle.jdbc.driver.OracleDriver");
            //实例名
            String url ="jdbc:oracle:thin:@localhost:1521:orcl";
            String username="test";
            String password = "test";

            //关闭自动提交事务
            conn.setAutoCommit(false); 
            //拼接sql语句
            StringBuffer sbSql = new StringBuffer();
            sbSql.append("insert into t_flow_card_detail (flow_card_no,aim_client_id,");
            sbSql.append("item_no,opt_qty,adjust_flay)");
            sbSql.append("values (?,?,?,?,?)");
            PreparedStatement pstmt = null;

            //建立连接Connection 
            conn = DriverManager.getConnection(url, username, password)
            //预编译sql语句
            pstmt = conn.prepareStatement(sbSql.toString());
            for (Iterator<FlowCardDetail> iter = flowCardDetailList.iterator();iter.hasNext();) {
                FlowCardDetail flowCardDetail = iter.next();
                pstmt.setString(, flowCardVouNo);
                pstmt.setInt(, flowCardDetail.getAimClient().getId());
                pstmt.setString(, flowCardDetail.getItem().getItemNo());
                pstmt.setBigDecimal(, flowCardDetail.getOptQty());
                pstmt.setString(, flowCardDetail.getAdjustFlag());
                //添加一条sql语句,即把一条sql命令添加到命令列表中
                pstmt.addBatch();
            }
            //批量执行sql语句
            pstmt.executeBatch();
            //提交事务,真正的将操作执行到数据库
            conn.commit();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new DaoException(e);
        } finally {
            ConnectionManager.close(pstmt);
        }
    }
           

注释:

      1.addBatch():是将若干条sql语句装在一起,添加到prepareStatement对象的当前命令列表中,然后通过executeBatch()一次性的将所有的命令送到数据库执行所有的sql语句;

      2.executeUpdate():是将sql语句一条一条的送到数据库执行

     3.而数据库单次吞吐量很大,执行效率极高,如果是一条一条的执行,时间都浪费在数据库连接上了。就如饭店做饭一样,需要白菜,胡萝卜,青椒,厨师做每道菜需要5分钟,才从菜市场到饭店需要20分钟,前者相当于把白菜,胡萝卜,青椒一块买然后运动饭店,需要只需35分钟;后者相当于每次只买一样菜,送到饭店,厨师做完后,再去买另一样菜。。。需要75分钟,由此对比,时间都浪费来运菜的路上了,运菜的过程相当于打开连接的过程,做菜的过程相当于执行sql语句的过程

      4. 我这演示的是insert语句,批量执行的sql语句,可以是增删改,不能有select

      5.使用此种方法,必须要关闭自动提交事务:conn.setAutoCommit(false),减少与数据库的交互

      6. addBatch()到一定次数是要及时提交,jdbc批量数据处理的每个批次的限量大概是5w条,否则容易发生内存溢满的问题

      7. [JDBC中的Statement和PreparedStatement的区别](http://blog.csdn.net/weixin_36586564/article/details/71213206)

二:利用PL/SQL Developer工具将excel中数据批量导入oracle数据库

【Oracle】将数据批量导入到Oracle数据库

       选择Tools——ODBCImporter,因为我们导入的是excel,所以选择Excel Files

【Oracle】将数据批量导入到Oracle数据库

       选在Excel所在的路径,选中要导入的Excel,点击确定

【Oracle】将数据批量导入到Oracle数据库

       在Data from ODBC选项下,双击excel路径,在下面可以预览导入的数据

【Oracle】将数据批量导入到Oracle数据库

       切换到Data to Oracle选项卡下,填写要导入到哪个数据库的哪张表,必须在Fields中选中一列之后,Import按钮才可用,此时导入的已经是整张excel了,最后点击Import按钮,成功导入

【Oracle】将数据批量导入到Oracle数据库

注意事项:

  • excel列名必须要和Oracle数据库字段名对应,且是英文,否则导入时会出现问题
  • 注意excel单元格的数字类型,如如果数据库字段名为varchar(50)类型,excel就应该设为文本类型
  • PL/SQL Developer是一款windows下操作oracle的很好的一个可视化的图形工具,