首页 > 代码库 > JDBC之 自增长与事务

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

 

  

JDBC之 自增长与事务