JDBC之 自增长与事务

JDBC之 自增长与事务

1.自增长

有这样一个现象:数据库中有两个表格 学生表(学生姓名,所在班级),班级表(班级号(自增长的主键),班级人数)。

  现在我往班级表插入一条信息, 只提供班级人数,班级号由自增长自动生成。然后我们插入一条学生信息入这个新的班,这就需要新增的班级的班级号,但是这个班级号由自增长自动生成,那么我们该如何正确把这个学生的信息插入呢?

  看下面代码演示吧~

public class AutoIncrement {

    Connection connection = null;

    @Test
    public void    TestAuto() throws Exception
    {
        //获取连接
        connection = sqlUtil.getconnection();

        //准备SQL语句
        String classSQL = "insert into class(ccount) values(?)";
        String studentSQL = "insert into student values(?,?)"; 

        //获取对象,先往CLASS表插入一条数据,使用有两个参数的方法。
        //第二个参数Statement.RETURN_GENERATED_KEYS 可以获得自增长的值
        PreparedStatement preparedStatement =
                connection.prepareStatement(classSQL,Statement.RETURN_GENERATED_KEYS);

        //设置参数
        preparedStatement.setObject(1, 66);

        //执行
        preparedStatement.executeUpdate();

        //下面就来获得这个自增长的ID值
        Integer cid = null;
        //使用getGeneratedKeys()获得自增长参数的一个结果集
        ResultSet res = preparedStatement.getGeneratedKeys();
        //迭代得到该值,我这里只有一个自增长的参数
        if(res.next())
        {
            cid = res.getInt(1);
        }

        //******得到该增长的值后,我们就 来插入员工信息********
        preparedStatement=connection.prepareStatement(studentSQL);

        //设置参数,把获取的自增长的值作为参数
        preparedStatement.setObject(1, "张三");
        preparedStatement.setObject(2, cid);

        //执行
        preparedStatement.executeUpdate();

        //关闭资源
        sqlUtil.close(preparedStatement, connection);

    }
}

2.事务

  大家都知道,数据库中常常会用到事务,那么如何用java代码来操作呢~看下面代码和说明吧~

有一个表:bank(bname,money),用来记录人物的姓名和金钱数

@Test
    public void doCommit() throws Exception {
        // 获取连接
        connection = sqlUtil.getconnection();

        // Jack向Mark转账100元。
        String sql1 = "update bank set money=money-100 where bname=‘Jack‘";
        // Mark的账户获得100元
        String sql2 = "update bank set money=money+100 where bname=‘Mark‘";

        // 开始事务,false表示关闭自动提交,即开启事务
        // true 表示自动提交SQL
        connection.setAutoCommit(false);

        // Jack执行转账100
        PreparedStatement state = connection.prepareStatement(sql1);
        state.executeUpdate();

        // Mark获得100
        state = connection.prepareStatement(sql2);
        state.executeUpdate();

        // 提交事务
        connection.commit();

        // 关闭资源
        sqlUtil.close(state, connection);

    }

这样就能创建和提交一个事务。

那么,如果在”Jack执行转账100“ 这个操作执行后,出现了异常,没有执行:sql2语句, 那两个用户岂不是都有损失? 这时候就体现出事务的重要性,事务还有一个功能:回滚

下面就故意制造一个异常,然后回滚事务吧~

public class CommitTest {
    Connection connection = null;

    @Test
    public void doCommit()  {
        // Jack执行转账100
        PreparedStatement state = null;
        try {
            // 获取连接
            connection = sqlUtil.getconnection();

            // Jack向Mark转账100元。
            String sql1 = "update bank set money=money-100 where bname=‘Jack‘";
            // Mark的账户获得100元
            String sql2 = "update bank set money=money+100 where bname=‘Mark‘";

            // 开始事务,false表示关闭自动提交,即开启事务
            // true 表示自动提交SQL
            connection.setAutoCommit(false);

            // Jack执行转账100
            state = connection.prepareStatement(sql1);
            state.executeUpdate();

            //故意制造异常
            int a = 1/0;

            // Mark获得100
            state = connection.prepareStatement(sql2);
            state.executeUpdate();

            // 提交事务
            connection.commit();
        } catch (SQLException e) {
            e.printStackTrace();
            try {
                //遇到任何异常情况,回滚事务
                connection.rollback();

            } catch (SQLException e1) {
                e1.printStackTrace();
                throw new RuntimeException(e);
            }
        }finally{
            // 关闭资源
            sqlUtil.close(state, connection);
        }

    }
}

  

时间: 2024-10-20 13:16:11

JDBC之 自增长与事务的相关文章

JDBC基础学习(四)—数据库事务

一.事务基本认识 1.事务的概述      为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元.当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视为错误,所有从起始点以后的操作应全部回退到开始状态.      事务的操作: 先定义开始一个事务,然后对数据做修改操作,这时如果提交(commit),这些数据就永久的保存下来,如果回退(rollback),数据库管理系统就放弃所有的修改而回到开始事务的状态.   2.事务的属性 (1)原子性(Atm

JDBC学习笔记(11):事务

事务(Transaction):是并发控制的单元,是用户定义的一系列操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,可以将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性.事务通常是以begin transaction开始,以commit或rollback结束.commit表示提交,即提交事务的所有操作.具体地说就是将事务中所有的数据的更新写回到磁盘上的物理数据库中去,事务正常结束.rollback表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行

【JDBC】实现JDBC实现银行的转账事务

JDBC中的事务是默认提交的,也就是说每执行一次PreparedStatement,那么数据就会被写入到磁盘.如果需要关闭默认提交,使用  void setAutoCommit(false)  . db.properties driverClassName=oracle.jdbc.OracleDriver url=jdbc:oracle:thin:@localhost:1521:xe username=system password=517839 db.properties JDBCUtilPr

JAVAWEB开发之事务详解(mysql与JDBC下使用方法、事务的特性、锁机制)和连接池的详细使用(dbcp以d3p0)

事务简介 事务的概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功 在开发中,有事务的存在,可以保证数据的完整性. 注意:数据库默认事务是自动提交的,也就是发一条SQL 就执行一条.如果想多条SQL语句放在一个事务中执行,需要添加事务有关的语句. 如何开启事务? 事务的操作方式: 创建表: create table account( id int primary key auto_increment, name varchar(20), money double

sql 批处理、获取自增长、事务、大文本处理

批处理 需要批量执行sql语句! 需求:批量保存信息! 设计: AdminDao Public void save(List<Admin list){ // 目前用这种方式 // 循环 // 保存 (批量保存) } Public void save(Admin admin ){ // 循环 // 保存 } 技术: |-- Statement 批处理相关方法 void addBatch(String sql) 添加批处理 void clearBatch() 清空批处理 int[] executeB

jdbc java数据库连接 9)事务编程

1. 事务 基本概念: 事务使指一组最小逻辑操作单元,里面有多个操作组成. 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚. 事务ACID特性: l 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. l 一致性(Consistency 事务必须使数据库从一个一致性状态变换到另外一个一致性状态. l 隔离性(Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务

JDBC事务管理及SavePoint示例

JDBC API提供了setAutoCommit()方法,通过它我们可以禁用自动提交数据库连接.自动提交应该被禁用,因为只有这样事务才不会自动提交,除非调用了连接的commit()方法.数据库服务器使用表锁来实现事务管理,并且它是一种紧张的资源.因此,在操作完成后应该尽快提交事务.让我们编写另外一个程序,这里我将使用JDBC事务管理特性来保证数据的完整性不被破坏. .......... try { con = DBConnection.getConnection(); // set auto c

Java的JDBC事务详解

一.事务的理解: 1.事务的特性: 1) 原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行. 2) 一致性(consistency):事务在完成时,必须是所有的数据都保持一致状态.在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性. 3) 隔离性(isolation):一个事务的执行不能被其他事务所影响. 4) 持久性(durability):一个事务一旦提交,事物的操作便永久性的保存在DB中.即

JDBC事务的相关知识

事务的定义 事务(Transaction):是并发控制的单元,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,sql server 能将逻辑相关的一组操作绑定在一起,以便服务器 保持数据的完整性. 事务的相关特性 用几个字母总结就是ACID. 1) 原子性(atomicity):事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行. 2) 一致性(consistency):事务在完成时,必须是所有的数据都保