我是靠谱客的博主 文静菠萝,最近开发中收集的这篇文章主要介绍JDBC数据库的事务处理1. 事务:2. 事务处理的原则:3. 说明:4. 代码的体现:5. 考虑到事务的以后增删改查操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

JDBC数据库的事务处理

  • 1. 事务:
  • 2. 事务处理的原则:
  • 3. 说明:
  • 4. 代码的体现:
  • 5. 考虑到事务的以后增删改查操作

1. 事务:

一组逻辑操作单元,使数据从一种状态变换到另一种状态。
一组逻辑操作单元:一个或多个DML操作。

2. 事务处理的原则:

保证所事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。
当在一个事务中执行多个操作时,

要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;
要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。

3. 说明:

  1. 数据一旦提交,就不可回滚
  2. 哪些操作会导致数据的自动提交?

    DDL操作一旦执行,都会自动提交。
    set autocommit = false 对DDL操作失效
    DML默认情况下,一旦执行,就会自动提交。
    我们可以通过set autocommit = false的方式取消DML操作的自动提交。
    默认在关闭连接时,会自动的提交数据

4. 代码的体现:

@Test
public void testUpdateWithTx(){
    Connection connection = null;
    try {
        connection = JDBCUtils.getConnection();
        connection.setAutoCommit(false);
        String sql1 = "update user_table set balance = balance - 100 where user = ?";
        //1.取消数据的自动提交
        update(connection,sql1,"AA");
        //模拟网络异常
        System.out.println(10 / 0);
        String sql2 = "update user_table set balance = balance + 100 where user = ?";
        update(connection,sql2,"BB");
        System.out.println("转账成功");
        //2.提交数据
        connection.commit();
    } catch (Exception e) {
        e.printStackTrace();
        //回滚数据
        try {
            connection.rollback();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    } finally {
        try {
        	//修改其为自动提交数据
			//主要针对于使用数据库连接池的使用
            connection.setAutoCommit(true);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        JDBCUtils.closeResource(connection,null);
    }
}

5. 考虑到事务的以后增删改查操作

考虑到事务的以后,实现的通用的增删改操作:

public int update(Connection connection,String sql, Object... args) {
// sql中占位符的个数与可变形参的长度相同!
    PreparedStatement preparedStatement = null;
    try {
    	// 1.预编译sql语句,返回PreparedStatement的实例
        preparedStatement = connection.prepareStatement(sql);
        // 2.填充占位符
        for (int i = 0; i < args.length; i++) {
            preparedStatement.setObject(i + 1, args[i]);
        }
        // 3.执行
        return preparedStatement.executeUpdate();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
    	// 4.资源的关闭
        JDBCUtils.closeResource(null,preparedStatement);
    }
    return 0;
}

考虑到事务以后,实现的通用的查询:

public <T> T getInstance(Connection connection,Class<T> clazz,String sql,Object ...args){
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    try {
        preparedStatement = connection.prepareStatement(sql);
        for (int i = 0; i < args.length; i++) {
            preparedStatement.setObject(i + 1,args[i]);
        }
        resultSet = preparedStatement.executeQuery();
        // 获取结果集的元数据 :ResultSetMetaData
        ResultSetMetaData metaData = resultSet.getMetaData();
        // 通过ResultSetMetaData获取结果集中的列数
        int columnCount = metaData.getColumnCount();
        if (resultSet.next()){
            T t = clazz.newInstance();
            // 处理结果集一行数据中的每一个列
            for (int i = 0; i < columnCount; i++) {
            	// 获取列值
                Object columnValue = resultSet.getObject(i + 1);
                // 获取每个列的列名
                String columnLabel = metaData.getColumnLabel(i + 1);
                // 给t对象指定的columnName属性,赋值为columValue:通过反射
                Field field = clazz.getDeclaredField(columnLabel);
                field.setAccessible(true);
                field.set(t,columnValue);
            }
            return t;
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        JDBCUtils.closeResource(null,preparedStatement,resultSet);
    }
    return null;
}

最后

以上就是文静菠萝为你收集整理的JDBC数据库的事务处理1. 事务:2. 事务处理的原则:3. 说明:4. 代码的体现:5. 考虑到事务的以后增删改查操作的全部内容,希望文章能够帮你解决JDBC数据库的事务处理1. 事务:2. 事务处理的原则:3. 说明:4. 代码的体现:5. 考虑到事务的以后增删改查操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部