zoukankan      html  css  js  c++  java
  • java_第一年_JDBC(3)

    事务

    我们在通过JDBC连接数据库并开始交互时,默认情况下是自动提交的,有时由于为了保持业务流程的完整性、提高性能或是使用分布式事务,需要启动支持事务,此时的方法是调用Connection对象的setAutoCommit();传递布尔值false关闭默认自动提交:

    conn.setAutoCommit(false);

    提交事务:

    conn.setAutoCommit();

    数据库回滚操作:

    conn.rollback();

    配合数据库的回滚,我们可以先设置保存点,通过Connection对象的方法setSavepoint(String savepointName)可以定义新的保存点、releaseSavepoint(Savepoint savepointName)可以删除保存点;通过以下实例加深理解:

    try{
        conn.setAutoCommit(false);
        stmt = conn.createStatement();
        Savepoint savepoint1 = conn.setSavepoint("DELETED_1");
        String SQL = "DELETE FROM employees WHERE ID =100";
        stmt.executeUpdate(SQL);
        conn.rollback(savepoint1);
        Savepoint savepoint2 = conn.setSavepoint("DELETED_2");
        SQL = "DELETE FROM employees WHERE ID =101";
        stmt.executeUpdate(SQL);
        conn.commit();
    }catch(SQLException e){
          e.printStackTrace();
    }  

    异常

    对于JDBC,要处理的异常最常见的是java.sql.SQLException。

    发生异常后会将其重定向catch子句中,如果没有相应的catch子句在,则程序的执行会结束。

    处理异常有以下方法:

     批量处理SQL语句

    需要先使用DatabaseMeteData.supportsBatchUpdates()方法来确认目标数据库是否支持批量处理,若支持则会返回true;

    通过交互对象Statement中的addBatch()增加SQL语句,然后通过executeBatch()方法来批量处理,其返回一个整数数组,每个元素是相应更新语句的更新计数;可以使用clearBatch()方法来删除SQL语句,会将所有addBatch()增加的语句都删除,没法删除指定的语句

    Statement stmt = conn.createStatement();
    conn.setAutoCommit(false);
    String SQL = "INSERT INTO employees (id,age,first,last) VALUES(200,30,'ZHAO','XIAO')";
    stmt.addBatch(SQL);
    String SQL = "INSERT INTO employees (id,age,first,last) VALUES(201,35,'JIA','XIAO')";
    stmt.addBatch(SQL);
    int[] count = stmt.executeBatch();
    conn.commit

     获取自动生成的主键:

    通常我们在应用中对mysql执行了insert操作后,需要获取插入记录的自增主键,这时候通常用getGeneratedKeys()方法获取主键

      1. 获得数据库返回的主键
               insert into book values(null,'编程珠玑',45);
      2. 获得主键的步骤
                conn.prepareStatement(sql,autoGeneratedKeys)
                autoGeneratedKeys是一个int值 ,1代表返回生成的主键,2代表不返回生成的主键;为了方便记忆,使用                 Statement.Statement.RETURN_GENERATED_KEYS,Statement.NO_GENERATED_KEYS
    3.获得生成的主键
      ResultSet rs=ps.getGeneratedKesy();
      rs.next();
      int userno= rs.getInt(1);

    Statement stmt = null;  
    ResultSet rs null;  
    try {  
        stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,  java.sql.ResultSet.CONCUR_UPDATABLE);    
        // ...  
        // 省略若干行  
        // ...  
        stmt.executeUpdate(  
                "INSERT INTO xxx (dataField) "  
                "values ('xxx')",  
                Statement.RETURN_GENERATED_KEYS);                      // 向驱动指明需要自动获取generatedKeys!  
        int autoIncKeyFromApi = -1;  
        rs = stmt.getGeneratedKeys();                                  // 获取自增主键!  
        if (rs.next()) {  
            autoIncKeyFromApi = rs.getInt(1);  
        }  else {  
            // throw an exception from here  
        }   
        rs.close();  
        rs null;  
        System.out.println("Key returned from getGeneratedKeys():"  
            + autoIncKeyFromApi);  
    }  finally { ... } 
  • 相关阅读:
    三元运算
    sys and os
    print.format
    while loop
    线段树模板
    Round #431 (Div.2)
    D. Make a Permutation!
    Round #411 (Div.2)
    Round #432 (Div.2)
    Round #433 (Div.2)
  • 原文地址:https://www.cnblogs.com/lzj-learn/p/11590761.html
Copyright © 2011-2022 走看看