日期:2014-05-16  浏览次数:20450 次

JDBC批量处理和事务实例

优势:1.节省传递时间。 2.并发处理。

PreparedStatement:
1) addBatch()将一组参数添加到PreparedStatement对象内部。
2) executeBatch()将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
Statement:
1) addBatch(String sql)方法会在批处理缓存中加入一条sql语句。
2) executeBatch()执行批处理缓存中的所有sql语句。
注意:PreparedStatement中使用批量更新时,要先设置好参数后再使用addBatch()方法加入缓存。批量更新中只能使用更改、删除或插入语句。


1.数据库的事务:
?事务的ACID属性
?* 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单 位,事务中的操作要么都发生,要么都不发生。?
?* 一致性(Consistency) 事务必须使数据库从一个一致性状态变 换到另外一个一致性状态。(数据不被破坏)
?* 隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被 其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他 事务是隔离的,并发执行的各个事务之间不能互相干扰。
?* 持久性(Durability) 持久性是指一个事务一旦被提交,它对数 据库中数据的改变就是永久性的,接下来的其他操作和数据库故障 不应该对其有任何影响





package com.saas.jdbc;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;

public class TestTransactionDemo01 {

	public static String _STR=" PreparedStatement:  1.addBatch() 将一组参数添加到 PreparedStatement对象内部  2.executeBatch() 将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。*  ";

	public static String _URL="jdbc:mysql://127.0.0.1:3306/shopping_thpad_com?useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true";
	
	public static String _LOGIN_NAME="root";
	
	public static String _LOGIN_PASSWORD="123456";
	
	private static Connection connect = null;
	
	private PreparedStatement pstmt=null;
	
	private ResultSet rs = null;
	
	public static Connection getConnection() {
		try{
			Class.forName("com.mysql.jdbc.Driver");
		}
		catch(ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		
		try {
			connect = DriverManager.getConnection(_URL, _LOGIN_NAME, _LOGIN_PASSWORD);	
		}
		catch(SQLException e) {
			e.printStackTrace();
		}
		return connect;
		
	}
	
	public void execInsert() {
		connect = getConnection();
		//添加
		String insert_sql ="insert into item_spec(item_spec_id,name,remarks) values(?,?,?)";
		try {
			connect.setAutoCommit(false);//事务开始,默认设置为false,表示不自动提交
			Calendar cal =	Calendar.getInstance();
		 	pstmt= connect.prepareStatement(insert_sql);
		 	pstmt.setString(1,String.valueOf(cal.getTimeInMillis()));
		 	pstmt.setString(2, _STR);
		 	pstmt.setString(3, "test333333333");
		 	//pstmt.executeUpdate();
		 	pstmt.addBatch();
		 	Calendar cal1 =	Calendar.getInstance();
		 	pstmt.setString(1,String.valueOf(cal1.getTimeInMillis()+2));
		 	pstmt.setString(2, "test_zhudansheng");
		 	pstmt.setString(3, "test_zhudansheng_3333333");
		 	pstmt.addBatch();
		 	Calendar cal2 =	Calendar.getInstance();
		 	pstmt.setString(1,String.valueOf(cal2.getTimeInMillis()+3));
		 	pstmt.setString(2, "g_test");
		 	pstmt.setString(3, "test_zhudansheng_test");
		 	
		 	pstmt.addBatch();
		 	pstmt.executeBatch();	//	执行批量处理语句。
		 	connect.commit();//执行事务
		 	System.out.println("提交事务成功");
		 	
		 	connect.setAutoCommit(true);
		 	this.doClose();
		}
		catch(SQLException e) {
			e.printStackTrace();
			
			try {
				if(!connect.isClosed()) {
					connect.rollback();
					System.out.println("提交事务失败");
				 	
					connect.setAutoCommit(true);
				}
			}
			catch(SQLException ee)  {
				ee.printStackTrace();
			}
			
		}
		finally {
			// 抛出异常则关闭所有链接
			this.doClose();
		}
	}
	
	public void execStatement() {
		connect = getConnection();
		
		String result_sql = "select * from item_spec ";//where item_spec_id=?
		
		try {
			pstmt = connect.prepareStatement(result_sql);
			//pstmt.setString(1, "1319729859937");
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				System.out.println(rs.getString("item_spec_id")+"-----------"+rs.getString("name")+"---------------"+rs.getString("remar