利用JDBC批量处理语句

来源:互联网 发布:数据安全应急预案 编辑:程序博客网 时间:2024/05/17 02:35
      有时候我们想要在本地数据库的一个表中插入大量的数据,这时候如果用普通的方法,插入的速度就会很慢,所以JDBC中给我们提供了一个方法,用来批量的插入数据,该方法在PreparedStatement对象中,方法名为addBatch(String s),其中的参数根据情况传入,可以有参数,也可以无参数,有参数的情况是一条SQL语句的批量传参,而有参数的情况是多条语句的批量处理,这个方法可以将每一条准备好的SQL语句先保留下来,然后由开发人员设置其保存的最大容量,当达到其容量后,就可以调用executeBatch()方法批量执行SQL语句,执行完后调用clearBatch()清空执行过的SQL语句,以便于准备下一次批量处理。
      下面是一个一条语句批量传参的实例:
现在本地数据库中有这样一个表:
向其中插入100000条记录,看如下代码:
import java.sql.Connection;import java.sql.Date;import java.sql.PreparedStatement;import org.junit.Test;/* * 使用JDBC批量处理语句 */public class TestBatch {@Test    public void TestBatch(){//使用addBatch()方法批量处理SQL语句           Connection con = null;           PreparedStatement ps = null;           String sql = "INSERT INTO customer(id,name,date) VALUES(?,?,?)";           try {                    con = JDBCTools.getConnection();                    con.setAutoCommit(false);//取消事务执行完后自动提交                    ps = con.prepareStatement(sql);                    Date date = new Date(new java.util.Date().getTime());                    long start = System.currentTimeMillis();                    for(int i = 0;i < 100000;i++){                           ps.setInt(1, i+1);                           ps.setString(2, "name"+(i + 1));                           ps.setDate(3, date);                                                      ps.addBatch();//累积SQL                           if((i + 1) % 1000 == 0){                                 ps.executeBatch();//累积到一定数量时开始执行                                 ps.clearBatch();//执行完后清空                           }                    }                    long end = System.currentTimeMillis();                    con.commit();                    System.out.println("Time:"+(end - start));//Time:1647             } catch (Exception e) {            e.printStackTrace();             } finally{                    JDBCTools.release(null, con, ps);             }  }@Test    public void TestBathUsePreparedStatement(){//使用PreparedStatement插入100000条数据       Connection con = null;       PreparedStatement ps = null;           String sql = "INSERT INTO customer(id,name,date) VALUES(?,?,?)";                 try {                    con = JDBCTools.getConnection();                    con.setAutoCommit(false);//取消事务执行完后自动提交                    ps = con.prepareStatement(sql);                    Date date = new Date(new java.util.Date().getTime());                    long start = System.currentTimeMillis();                                        for(int i = 0;i < 100000;i++){                           ps.setInt(1, i+1);                           ps.setString(2, "name"+(i + 1));                           ps.setDate(3, date);                           ps.executeUpdate();                    }                    long end = System.currentTimeMillis();                    con.commit();                    System.out.println("Time:"+(end - start));//Time:13972             } catch (Exception e) {            e.printStackTrace();             } finally{                    JDBCTools.release(null, con, ps);             }    }}//JDBC工具类  包含数据库的连接,更新,关闭等功能import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;//JDBC的工具类,用于关闭数据库连接操作,更新操作和查询操作public class JDBCTools {       public static Connection getConnection() throws Exception{//连接数据库             String driverClass = null;             String url = null;             String user = null;             String password = null;                          Properties properties = new Properties();                          InputStream in = Review.class.getClassLoader().getResourceAsStream("jdbc.properties");             properties.load(in);                          driverClass = properties.getProperty("driver");             url = properties.getProperty("jdbcurl");             user = properties.getProperty("user");             password = properties.getProperty("password");             Class.forName(driverClass);             return DriverManager.getConnection(url, user, password);       }       public static void release(Connection con , Statement state){//关闭数据库连接             if(state != null){                    try {                           state.close();                    } catch (SQLException e) {                           e.printStackTrace();                    }             }             if(con != null){                    try {                           con.close();                    } catch (SQLException e) {                           e.printStackTrace();                    }             }                    }       public static void release(ResultSet rs , Connection con , Statement state){//关闭数据库连接             if(rs != null)             {                    try {                           rs.close();                    } catch (SQLException e) {                           e.printStackTrace();                    }             }             if(state != null){                    try {                           state.close();                    } catch (SQLException e) {                           e.printStackTrace();                    }             }             if(con != null){                    try {                           con.close();                    } catch (SQLException e) {                           e.printStackTrace();                    }             }       }}//连接数据库的类,在JDBCTools.类中利用该类使用了反射,从而实现了数据库的连接import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.util.Properties;public class Review {       public  Connection getConnection() throws Exception{//连接数据库             String driverClass = null;             String url = null;             String user = null;             String password = null;                          Properties properties = new Properties();                          InputStream in = Review.class.getClassLoader().getResourceAsStream("jdbc.properties");                          properties.load(in);                          driverClass = properties.getProperty("driver");             url = properties.getProperty("jdbcurl");             user = properties.getProperty("user");             password = properties.getProperty("password");             Class.forName(driverClass);             return DriverManager.getConnection(url, user, password);       }       }


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 打印机打不出来怎么办 羽绒服内里跑绒怎么办 奥迪冷冻液不足怎么办 奥迪冷冻液报警怎么办 电脑输入时乱码怎么办 电信路由器坏了怎么办 高铁坐错车次了怎么办 数字万用表显示1怎么办 滚筒冼衣机接水接头漏水怎么办 奶块设备被禁封怎么办 奶块设备封禁怎么办 晚上衣服干不了怎么办 3dmax视图混乱怎么办 钉枪能打进肉里怎么办 公司迟发工资怎么办 打枪后一直耳鸣怎么办 打枪震的耳鸣怎么办 尚方宝剑弄丢了怎么办 九五出款被黑18w怎么办 很容易感动伤感哭怎么办 为什么安卓版ps打不开怎么办 遇见职业打假人怎么办 打假投诉极限次怎么办 导师无故留学生要怎么办 孩子24了不争气怎么办 退休工资卡遗失怎么办大同市 天津体育惠民卡怎么办 高跟鞋走路太响怎么办 高跟鞋太响怎么办妙招 穿高跟鞋想开车怎么办 脚瘦穿高跟鞋容易掉怎么办 dq11时装卖了怎么办 廉洁教育手抄报怎么办 做美发口才不好怎么办 月嫂怎么办澳大利亚签证 高一学生叛逆怎么办 和异性说话紧张怎么办 幼儿教师模拟讲课紧张怎么办 静不下心来怎么办 失眠焦虑到极点怎么办 老师罚学生买东西怎么办