事务

我们在通过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. 即时通讯(II)

    Socket 连接Demo Socket客户端代码 #import "ViewController.h" //0.导入头文件 #include <netinet/in.h&g ...

  2. linux手动测试 rsync 的同步情况

    特别强调:此步很关键,如果这不能同步,后面的 inotify 配好了也不会同步数据. 1) 分别创建待同步数据 [root@rsync-client-inotify ~]# mkdir /data/{ ...

  3. 网络基础-IP地址

  4. Redis 复制功能详解

    Redis 复制功能的几个重要方面: 1. 一个Master可以有多个Slave:2. Redis使用异步复制.从2.8版本开始,Slave会周期性(每秒一次)发起一个Ack确认复制流(replica ...

  5. 【LeetCode】未分类(tag里面没有)(共题)

    [334]Increasing Triplet Subsequence (2019年2月14日,google tag)(greedy) 给了一个数组 nums,判断是否有三个数字组成子序列,使得子序列 ...

  6. css:鼠标点击出现有颜色的边框?如何解决

    今天遇到上图这样出现有颜色的边框 解决办法: css设置属性 outline:none;

  7. 在Node.js环境下使用Express创建Web项目实例

    序:如果你还不知道Node.js是什么,那么你可以先看看这篇:Node.js 究竟是什么?或者任何关于它的介绍. 一.安装Node.js 1.进入Node.js官网下载并安装 2.启动cmd输入命令查 ...

  8. 在父组件中,直接获取子组件数据-vue

    1.通过 $ref 获取 主父组件中: <x-test ref="ch"></x-test> import XTest from '@/components ...

  9. 卷积神经网络(Text--cnn)(知识点整理)

    参考:http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/ 独热编码(one- ...

  10. php md5()函数 语法

    php md5()函数 语法 作用:字符串md5编码.dd马达价格 语法:md5(string,raw) 参数: 参数 描述 string     必需.规定要计算的字符串. raw     可选.规 ...