• JDBC批处理


    批处理:

      当我们需要向数据库中插入大量数据时,批处理会将这些数据打成多个批次addBatch(),统一发送给数据库服务器执行executeBatch(),减少与数据库的交互次数提高程序的执行效率。

    实现批处理方法:

      利用statement对象;

      利用PreparedStatement对象;

    共同使用的方法

      addBatch();

      executeBatch();

    代码:

    package cn.yikuan.batch;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import org.junit.Test;
    
    import cn.tedu.util.JDBCUtils;
    
    /**
     * 这个类用来测试jdbc的批处理
     * @author Administrator
     *
     */
    public class BatchTest {
        //实现方式一:利用statement对象完成
        @Test
        public void StatementBatch(){
            Connection conn = null;
            Statement st = null;
            
            try {
                //1.注册驱动
                //2.获取数据库连接
                conn = JDBCUtils.getConnection();
                long t = System.currentTimeMillis();
                //)))1.关闭jdbc的事务管理,
                conn.setAutoCommit(false);
                //3.获取传输器
                st = conn.createStatement();
                //4.执行sql
                for(int i=0;i<1000000;i++){
                    String sql = "insert into dept values(null,'"+i+"')";
                    
                    //把sql打包成批次
                    st.addBatch(sql);
                }
                //统一发送给服务器执行批
                int[] rows = st.executeBatch();
                //)))2.手动提交事务
                conn.commit();
                //5.遍结果集
                System.out.println(rows.length);
                t = System.currentTimeMillis()-t;
                System.out.println(t);
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                //6.释放资源
                JDBCUtils.close(null,st, conn);
            }
        }
        
        @Test
        public void psBatch(){
            Connection conn = null;
            PreparedStatement ps = null;
            try {
                //1.注册驱动
                //2.获取数据库连接
                conn = JDBCUtils.getConnection();
                long t = System.currentTimeMillis();
                //)))1.关闭jdbc的事务管理,
                conn.setAutoCommit(false);
                //3.获取传输器;4.执行sql
                String sql = "insert into dept values(null,?)";
                ps = conn.prepareStatement(sql);
                for (int j = 0; j < 1000000; j++) {
                    ps.setString(1,"ps"+j);
                    //把sql打成批次
                    ps.addBatch();
                }
                //统一发送给数据库服务器
                int[] rows = ps.executeBatch();
                //)))2.手动提交事务
                conn.commit();
                //5.遍历结果集
                System.out.println(rows.length);
                t = System.currentTimeMillis()-t;
                System.out.println(t);
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JDBCUtils.close(null, ps, conn);
            }
        }
        
    }

    JDBCUtils.java

    package cn.yikuan.util;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ResourceBundle;
    /**
     * 这个类用来提供JDBC的工具类
     * @author Administrator
     *
     */
    public class JDBCUtils {
        //1.私有化构造函数,外界无法直接创建对象
        private JDBCUtils(){
    
        }
    
        static ResourceBundle rb = null;
        static {
            //读取属性文件
            rb = ResourceBundle.getBundle("jdbc");
        }
    
        //2.提供公共的,静态的,getConnection方法,用来给外界提供数据库连接
        public static Connection getConnection(){
            try {
                //2.1注册驱动
                Class.forName(rb.getString("driverClass"));
                //2.2获取数据库连接
                String url = rb.getString("jdbcUrl");
                String user = rb.getString("user");
                String password = rb.getString("password");
                Connection conn = DriverManager.getConnection(url, user, password);
                return conn;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;    
        }
    
        //3.提供公共的,静态的,close方法,用来释放资源
        public static void close(ResultSet rs,Statement st,Connection conn){
            //3.1非空判断,防止空指针异常
            //3.2手动置为空,保证完全释放
            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    rs = null;
                }
            }
            if(st != null){
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    st = null;
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    conn = null;
                }
            }
    
        }
    }
  • 相关阅读:
    嵌入式移动数据库Oracle Lite
    一生至少应该看的60本书
    似水年华,如梦光阴
    MS SQL Server数据库中合并复制详解
    登录Windows Live Messenger失败,因为服务暂时不可用
    ASCII码表
    写在监考之后
    ASP.NET基本对象
    linux网络命令 vconfig ifconfig
    grep使用
  • 原文地址:https://www.cnblogs.com/yikuan-919/p/9519832.html
Copyright © 2020-2023  润新知