批量处理PreparedStatement实现批量数据的操作

批量处理 insert
使用PreparedStatement实现批量数据的操作

update、delete本身就具有批量操作的效果
此时的批量操作,主要指的是批量插入。使用PreparedStatement如何实现更高效的批量插入

题目:向goods表中插入20000条数据
CREATE TABLE goods(
id int PRIMARY KEY AUTO_INCREMENT
NAME VARCHAR(25)
);

 * 方式一:使用statement
 * Connection conn = JDBCUtil.getConnection();
 * Statement st = conn.createStatement();
 * for(int i = 0; i < 20000; i++){
 * 		String sql = "insert into goods (name)values('name_ " + i + "')";
 * 		st.execute(sql);
 * }

批量出入的方式二:

//批量插入的方式二:使用PreparedStatement
	@Test
	public void testInsert1() {
		
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = JDBCUtil.getConnection();
			
			String sql = "insert into goods(name) values(?)";
			ps = conn.prepareStatement(sql);
			for(int i =0; i < 20000; i++) {
				
				ps.setObject(i+1, "name_"+i);
				ps.execute();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		JDBCUtil.closeResourse(conn, ps);
	}

批量出入的方式三:

//批量出入的方式三:
	/*	1.addBatch()、executeBatch()、clearBarch()
	 * 	2.mysql服务器默认是关闭批处理的,我们需要通过一个参数,然mysql开启批处理的支持
	 * 		?rewriteBatchedStatements=true 卸载配置文件的url后面
	 * 	3.使用更新的mysql驱动:mysql-connector-java-5.1.37-bin.jar
	 */
	@Test
	public void testInsert2() {
		
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = JDBCUtil.getConnection();
			
			String sql = "insert into goods(name) values(?)";
			ps = conn.prepareStatement(sql);
			for(int i =0; i < 20000; i++) {
				
				ps.setObject(i+1, "name_"+i);
				//1."攒"sql
				ps.addBatch();
				
				if(i % 500 == 0) {
					//2.执行batch
					ps.executeBatch();
					//3.清空batch
					ps.clearBatch();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		JDBCUtil.closeResourse(conn, ps);
	}
	1.addBatch()、executeBatch()、clearBarch()
 	2.mysql服务器默认是关闭批处理的,我们需要通过一个参数,然mysql开启批处理的支持
 	?rewriteBatchedStatements=true 卸载配置文件的url后面
 	3.使用更新的mysql驱动:mysql-connector-java-5.1.37-bin.jar

3.

批量出入的方式四:最终版 效率最高

//批量插入的方式四:设置不允许自动提交数据
	@Test
	public void testInsert3() {
		
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = JDBCUtil.getConnection();
			
			//设置不允许自动提交数据
			conn.setAutoCommit(false);
			
			String sql = "insert into goods(name) values(?)";
			ps = conn.prepareStatement(sql);
			for(int i =0; i < 20000; i++) {
				
				ps.setObject(i+1, "name_"+i);
				//1."攒"sql
				ps.addBatch();
				
				if(i % 500 == 0) {
					//2.执行batch
					ps.executeBatch();
					//3.清空batch
					ps.clearBatch();
				}
			}
			
			conn.commit();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		JDBCUtil.closeResourse(conn, ps);
	}
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值