zoukankan      html  css  js  c++  java
  • 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);
            }
    
        }
    }

      

  • 相关阅读:
    二叉查找树详解
    探索推荐引擎内部的秘密
    个性化推荐漫谈
    网站的可扩展架构
    网站伸缩性架构--数据存储服务器集群的伸缩性设计
    SQL Server 分组后取Top N
    SQL SERVER 查询特定的前几条数据
    数据库的事务处理必须满足ACID原则,ACID分别是指什么
    String在JAVA里是固定长度的吗?为什么可用“+”连接
    怎样取得数组对象和arralist 的长度
  • 原文地址:https://www.cnblogs.com/vmax-tam/p/4154121.html
Copyright © 2011-2022 走看看