JDBC之 自增长与事务

王朝学院·作者佚名  2016-05-28
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航