码迷,mamicode.com
首页 > 数据库 > 详细

JDBC之 自增长与事务

时间:2014-12-09 22:47:21      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   os   使用   sp   java   

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);
        }

    }
}

 

  

JDBC之 自增长与事务

标签:style   blog   io   ar   color   os   使用   sp   java   

原文地址:http://www.cnblogs.com/vmax-tam/p/4154121.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!