在java代碼中實現對數據庫事務的控制


  默認情況下,數據庫連接處於自動提交模式。每個sql語句一旦被執行便提交給數據庫。一旦命令提交,就無法對其進行回滾操作。在使用事務時需要關閉這個默認值。

package preparedStament;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

import org.junit.Test;

import bean.User_cursetom;
import JDBCutils.JdbcUtils;

/**
 * @author ztr
 * @version 創建時間:2021年4月1日 下午8:41:04
 * 類說明
 */
/**
 */
public class TransactionTest {
    /**
     * 考慮數據庫的事務
     * 
     * @param clazz
     * @param sql
     * @param args
     * @return
     */
    public <T> T GetInstance(Connection connection, Class<T> clazz, String sql,
            Object... args) {

        PreparedStatement prepareStatement = null;
        // 獲取結果集
        ResultSet resultSet = null;
        try {
            prepareStatement = connection.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                prepareStatement.setObject(i + 1, args[i]);
            }
            resultSet = prepareStatement.executeQuery();
            // 獲取元數據
            ResultSetMetaData metaData = resultSet.getMetaData();
            // 通過metaData獲取結果集中的列數
            int columnCount = metaData.getColumnCount();
            if (resultSet.next()) {
                T newInstance = clazz.newInstance();
                for (int i = 0; i < columnCount; i++) {
                    // 獲取列值
                    Object columnValue = resultSet.getObject(i + 1);
                    // 獲取每列的列名
                    String columnName = metaData.getColumnName(i + 1);
                    // 利用反射
                    Field field = clazz.getDeclaredField(columnName);
                    // 考慮該屬性是否為私有
                    field.setAccessible(true);
                    field.set(newInstance, columnValue);
                }
                return newInstance;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            // 關閉資源
            JdbcUtils.closeResource1(null, prepareStatement, resultSet);
        }

        return null;

    }

    public void update(Connection connection, String sql, Object... args) {
        // 獲取數據連接

        // 預編譯sql語句返回preparedStatement
        PreparedStatement prepareStatement = null;
        try {

            prepareStatement = connection.prepareStatement(sql);
            // 填充占位符
            // prepareStatement.setObject的下標從1開始
            for (int i = 0; i < args.length; i++) {
                prepareStatement.setObject(i + 1, args[i]);
            }
            // 執行
            prepareStatement.execute();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            // 資源的關閉
            JdbcUtils.closeResource(null, prepareStatement);
        }
    }

    @Test
    public void test1() throws Exception {
        Connection connection = JdbcUtils.getConnection();
        // 獲取事務的隔離級別
        System.out.println(connection.getTransactionIsolation());
        // 取消事務的自動提交
        // 設置事務的隔離級別
        connection
                .setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
        connection.setAutoCommit(false);
        String sql = "select id,balance from user_cursetom where id = ?";
        User_cursetom getInstance = GetInstance(connection,
                User_cursetom.class, sql, 1);
        System.out.println(getInstance);
    }

    @Test
    public void test2() throws Exception {
        Connection connection = JdbcUtils.getConnection();
        // 取消事務的自動提交
        connection.setAutoCommit(false);
        String sql = "update user_cursetom balance set balance  = 1000 where id = ?";
        update(connection, sql, 1);
        Thread.sleep(15000);
        System.out.println("修改結束");
        connection.rollback();
        connection.commit();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM