事务

我们在通过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 = -;  
    rs = stmt.getGeneratedKeys();                                  // 获取自增主键!  
    if (rs.next()) {  
        autoIncKeyFromApi = rs.getInt();  
    }  else {  
        // throw an exception from here  
    }   
    rs.close();  
    rs = null;  
    System.out.println("Key returned from getGeneratedKeys():"  
        + autoIncKeyFromApi);  
}  finally { ... } 

java_第一年_JDBC(3)的更多相关文章

  1. java_第一年_JDBC(7)

    Commons-dbutils是一个开源的JDBC工具类库,对JDBC进行封装,简化编码的工作量,包含的API: org.apache.commons.dbutils.QueryRunner org. ...

  2. java_第一年_JDBC(2)

    上篇说到,通过JDBC可实现java编程程序和mysql数据库进行连接并交互,而交互后所形成的结果集是通过ResultSet对象来操作的. 创建ResultSet对象: stmt = conn.cre ...

  3. java_第一年_JDBC(1)

    JDBC(Java Data Base Connectivity),用于实现java语言编程与数据库连接的API. 数据库驱动:应用程序并不能直接使用数据库,而需要通过相应的数据库驱动程序后再操作数据 ...

  4. java_第一年_JDBC(6)

    DataBaseMetaData对象:由Connection.getDataBaseMetaData()方法获得,可以用来获取数据库的元数据,提供的方法有: getURL():返回一个String类, ...

  5. java_第一年_JDBC(5)

    事务概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功: 开始事务:start transaction 提交事务:commit 回滚事务:rollback 事务的四大特 ...

  6. java_第一年_JDBC(4)

    注:该篇只是为了小白的我熟悉下JDBC的代码,练习篇 在mysql中建test测试库,并创建一张employees表,加入一些数据如下图: 通过JDBC连接对表中数据进行添加: package lzj ...

  7. java_第一年_JavaWeb(14)

    EL :EL表达式主要用于获取数据.执行运算.获取对象.调用java方法: 获取数据 语法:"${标识符}" 会调用pageContext.findAttribute方法,从pag ...

  8. java_第一年_JavaWeb(13)

    JSTL标签库——核心标签库 为了弥补html标签的不足,为了更加方便地在jsp页面中使用java逻辑代码,JSTL标签库因运而生,而其中的佼佼者,被恩宠最多的就是核心标签库了: 核心标签库从功能上可 ...

  9. java_第一年_JavaWeb(11)

    自定义标签:主要是用来移除JSP页面中的java代码. 先从一个简单的案例了解其怎么移除代码: 一个正常的jsp页面: <%@ page language="java" pa ...

随机推荐

  1. JDK 8 中Stream流中的去重的方法

    JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...

  2. HTML5中的Web Worker

    什么是 Web Worker? 当在 HTML 页面中执行脚本时,页面是不可响应的,直到脚本已完成. Web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能.您 ...

  3. Vue build打包之后,刷新页面出现404解决方案

    Vue build打包之后,刷新页面出现404,HTML5 History 模式 原因分析: vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于 ...

  4. 一、ffmpeg理论

    一.ffmpeg三件套 ffprobe看文件属性 ffmpeg 编转码 ffplay 播放器 C:\Users\Bruce\Desktop\Temp\ffmpeg\ffmpeg\ToolPack\ff ...

  5. Linux下NFS服务器的搭建与配置(转)

    一.NFS服务简介 NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的. 它最大的功能就是可以透过网络,让不同的机器.不同的操作系统.可以彼此分享个别 ...

  6. MYSQL学习笔记——常用语句

    1.检索数据 1.1.检索单个列:SELECT prod_name FROM products; 1.2.检索多个列:SELECT prod_id, prod_name, prod_price FRO ...

  7. ps:不规则选区

    尽管我们学会了如何添加减去或是交叉选区,但选取出来的选区还是比较规则,不是矩形就是圆形,这样的形状很难胜任在实际制作中的需要.现在我们就要学习如何建立一个任意形状的选区.建立任意选区的工具是套索工具. ...

  8. 关于<label>的for属性的简单探索

    在freecodecamp上HTML教程的Create a Set of Radio Buttons这一节中,看到这样一段话, It is considered best practice to se ...

  9. 获取不到最新的url地址展示图片可以盖时间戳

    如:  $("#"+attachId).on('click', function() {                 params1 = [];                 ...

  10. Xib中用自动布局设置UIScrollView的ContenSize

    1. 在UIScrollView上拖一个UIView 2.设置UIScrollView上下左右约束为0,设置UIView上下左右约束为0,并且设置水平中线约束.那么可以把水平中线约束拖到对应视图,利用 ...