JavaWeb学习心得之JDBC批处理

本文介绍使用Java JDBC进行批量数据插入的方法,并对比Statement与PreparedStatement的性能差异。同时,展示了如何利用MySQL自增特性获取刚插入记录的ID。

一、Statement批处理

步骤

  1. statement.addBatch(sql)
  2. statement.executeBatch()
  3. statement.clearBatch()
范例
1.创建表
  create table testbatch
 (
      id int primary key,
      name varchar(20)
 );

2.测试代码
import java.sql.Connection;
import java.sql.Statement;

public class JDBCDemo01 {
	public static void main(String[] args) {
		Connection conn = null;
		Statement st = null;
		try{
			conn = JdbcUtils.getConnection();
			st = conn.createStatement();
			String sql1 = "insert into testbatch(id,name) values(1,'aaa')";
			String sql2 = "insert into testbatch(id,name) values(2,'bbb')";
			String sql3 = "insert into testbatch(id,name) values(3,'ccc')";
			String sql4 = "insert into testbatch(id,name) values(4,'ddd')";
			String sql5 = "insert into testbatch(id,name) values(5,'eee')";
			//添加比处理语句
			st.addBatch(sql1);
			st.addBatch(sql2);
			st.addBatch(sql3);
			st.addBatch(sql4);
			st.addBatch(sql5);
			//返回处理结果数组
			int[] result = st.executeBatch();
			int count = 0;
			for(int i=0;i<result.length;i++){
				if(result[i]>0){
					count++;
				}
			}
			System.out.println("插入"+count+"条数据");
			//清空批处理语句
			st.clearBatch();
		}catch(Exception e){
			e.printStackTrace();
		}finally {
			JdbcUtils.release(conn, st, null);
		}
		
	}
}
        statment可以向数据库发送不同的SQL语句,但是没有预编译,效率较低。

二、PreparedStatement批处理
范例
import java.sql.Connection;
import java.sql.PreparedStatement;

public class JDBCDemo02 {
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		Connection conn = null;
		PreparedStatement st = null;
		try{
			conn = JdbcUtils.getConnection();
			String sql = "insert into testbatch(id,name) values(?,?)";
			st = conn.prepareStatement(sql);
			for(int i=0;i<100000;i++){
				st.setInt(1, i);
				st.setString(2, "hanxin"+i);
				st.addBatch();
				if(i%1000==0){
					st.executeBatch();
					st.clearBatch();
				}
			}
			st.executeBatch();
			st.clearBatch();
		}catch(Exception e){
			e.printStackTrace();
		}finally {
			JdbcUtils.release(conn, st, null);
		}
		long end = System.currentTimeMillis();
		System.out.println("程序花费时间:"+(end-start));
	}
}

       preparedStatment发送预编译后的SQL代码,效率高,但是只能发送相同语句不同参数的SQL。

三、MySql自动生成主键
数据库:
 create table test1
(
      id int primary key auto_increment,
     name varchar(20)
 );
测试代码:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import com.mysql.jdbc.Statement;

public class JDBCDemo03 {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try{
			conn = JdbcUtils.getConnection();
			String sql1 = "insert into test1(name) values(?)";
			//添加Statement.RETURN_GENERATED_KEYS,否则报错
			st = conn.prepareStatement(sql1,Statement.RETURN_GENERATED_KEYS);
			st.setString(1, "阿里");
			st.executeUpdate();
			rs = st.getGeneratedKeys();
			if(rs.next()){
				System.out.println(rs.getInt(1));
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally {
			JdbcUtils.release(conn, st, rs);
		}
		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值