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