【0】README

1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程——事务 的基础知识 ;
2)for database connection config, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/database.properties


【1】事务相关

1)事务定义:将一组语句构建成一个事务;

  • 1.1)当所有语句被顺利执行后, 事务可以提交;否则,如果其中某个语句遇到错误,那么事务将被回滚,就好像没有任何语句执行过一样;
  • 1.2)将多个语句组合成事务的原因: 为了确保数据库完整性;(干货——将多个语句组合成事务的原因)

2)自动提交模式: 默认情况下, 数据库连接处于 自动提交模式, 每个 sql 语句一旦被执行便被提交给 数据库, 一旦命令被提交, 就无法对它进行 回滚操作;(干货——sql语句的执行(execute)与提交(commit)是两个概念)

  • 2.1)在使用事务时, 需要关闭这个默认值;
    conn.setAutoCommit(false);
  • 2.2)现在可以使用通常的方法创建一个语句对象:
    Statement stat = conn.createStatement();
  • 2.3)然后任意多次调用executeUpdate 方法:
    stat.executeUpdate(comman1);
  • 2.4)如果执行了所有命令之后没有出错,则调用 commit 方法:
    conn.commit();
  • 2.5)如果出错,则调用
    conn.rollback(); //回滚操作

【2】保存点

1)保存点作用: 创建一个保存点意味着稍后只需要返回这个点,而非事务的开头; (干货——保存点作用)
2)看个荔枝:

Statement stat = conn.createStatement();//创建语句
stat.executeUpdate(command1);
Savepoint point = conn.setSavepoint();//创建保存点
stat.executeUpdate(command1);
if(…)
conn.rollback(point); //回滚操作

conn.commit();

  • 2.1)当不再需要保存点 的时候, 必须释放它; (干货——释放保存点)
    conn.releaseSavepoint(point);

【3】批量更新

1)批量更新的作用: 一个程序需要执行多条insert 语句, 可以使用批量更新方法来提高程序性能; (干货——批量更新的作用: 一个程序需要执行多条insert 语句)
Attention)

  • A1)使用 DatabaseMetaData 接口中的 supportsBatchUpdates 方法可以获知数据库是否支持这种特性;
  • A2)处于同一批的语句可以是, insert, update, delete等 DML操作, 也可以是数据库定义语句, 如create, drop 等DDL;
  • A3) 但是, 在批量处理中添加 select 语句会抛出异常(从概念上讲, 批量处理中的 select 语句没有意义, 因为它会返回结果集, 而并不更新数据库) (干货——在批量处理中添加 select 语句会抛出异常)

2)使用批量更新的步骤:

  • step1)创建一个 Statement对象:
    Statement stat = conn.createStatement();
  • step2) 应该调用 addBatch 方法, 而不是 executeUpdate 方法:
    String command = “create table …. “;
    stat.addBatch(command);
  • step3)循环提交 insert 语句:

    while(…)
    {
    command = “insert into …”;
    stat.addBatch(command);
    }

  • step4)最后 , 提交整个批量更新语句;

    int[] counts = stat.executeBatch();

Attention)

  • A1)调用executeBatch 方法将为所有已提交的语句返回一个 记录数的数目;
  • A2)为了在批量模式下正确地处理错误, 必须将批量执行的操作视为单个事务。 如果批量更新在执行过程中失败, 那么必须将它回滚到批量操作开始之前的状态;
  • A3)首先关闭自动提交模式, 然后收集批量操作, 执行并提交该操作, 最后恢复最初 的自动提交模式:

    • step1)关闭自动提交模式:

      boolean autoCommit = conn.getAutoCommit();
      conn.setAutoCommit(false);
      Statement stat = conn.getStatement();

    • step2)然后收集批量操作:
      // keep calling stat.addBatch();

    • step3)执行并提交该操作;
      stat.executeBatch();
      stat.commit();
    • step4)最后恢复最初 的自动提交模式;
      conn.setAutoCommit(autoCommit);

3)看个荔枝(利用批量更新添加两行记录,且添加前设置保存点):

  • 3.1)for souce code, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/SavePointsTest.java
  • 3.2)key source code at a glance:
public static void main(String[] args){Connection conn = null;Savepoint savepoint1 = null;try{Connection conn1 = getConnection();conn = conn1;conn.setAutoCommit(false);// step1.关闭自动提交Statement stat = conn.createStatement();// set a Savepointsavepoint1 = conn.setSavepoint("savepoint1");   // step2.收集批量操作(add batch update)stat.addBatch("insert into student values(1,'savepoint1')");stat.addBatch("insert into student values(1,'savepoint2')");// step3.执行并提交该操作stat.executeBatch();// If there is no error, commit the changes.conn.commit();// step4.回复最初的自动提交模式conn.setAutoCommit(true);System.out.println("successful update!");conn.releaseSavepoint(savepoint1); //当不再需要保存点 的时候, 必须释放它conn.close();//关闭数据库连接} catch (Exception e){try{conn.rollback(savepoint1);//回滚System.out.println("failed update!");e.printStackTrace(); } catch (SQLException e1){e1.printStackTrace();}}}
  • 3.3)relative printing results as follows:

4)看个荔枝(一个回滚的荔枝):

  • 4.1)for souce code, please visit : 同上;
  • 4.2)key source code at a glance: 同上;
  • 4.3)relative printing results as follows:

【4】高级SQL类型

1) sql 数据类型及其对应的java类型(图片地址:http://www.cnblogs.com/shishm/archive/2012/01/30/2332142.html)

2)SQL ARRAY(SQL 数组)指的是值的序列;

  • 2.1)如, Student 表中通常都会有一个 Scores 列, 这个列就应该是 ARRAY OF INTEGER(整数数组);
  • 2.2)getArray方法: 返回一个接口类型为 java.sql.Array 的对象,该接口中有许多方法可以用于获取数组的值;

3)从数据库中获得一个 LOB 或数组并不等于获取了它的实际内容, 只有在访问具体值的时候, 它们才会从 数据库中被读取出来;
4)ROWID值: 某些数据库支持描述行位置的 ROWID值, 这样就可以非常快捷地获取某一行值;

  • 4.1)JDBC 4 引入了 java.sql.RowId 接口: 并提供了用于在查询中提供 行 ID, 以及从结果中获取该值的方法;

5)国家属性字符串(NCHAR及其变体): 按照本地字符编码机制存储字符串,并使用本地排序惯例对这些字符串进行排序;

  • 5.1) JDBC 4 提供了这种方法, 用于在查询和结果中进行 java 的 string 对象和国家属性字符串之间的双向转换;

6)有些数据库提供了用于XML 数据的本地存储。

  • 6.1)JDBC 4 引入了 SQLXML接口: 它可以在内部的 XML 表示和 DOM 的 Source/Result 接口或二进制流之间起到中间作用。

java数据库编程——事务相关推荐

  1. java数据库编程——元数据(metadata)+web 与企业应用中的连接管理

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程--元数据(metadata)+web 与企业应用中的连接管 ...

  2. java数据库编程(二) 数据库操作

    关于数据库的连接方法已在java 数据库编程(一)JDBC连接Sql Server数据库一文中为大家介绍,还没有链接数据库的小伙伴请先点击查看. 今天首先为大家介绍一下数据库的连接及操作的核心类与接口 ...

  3. java数据库编程——可滚动和可更新的结果集

    [0]README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程--可滚动和可更新的结果集 的基础知识 : 2)for da ...

  4. java数据库编程——执行查询操作(二)

    [0]README 1) 本文部分文字描述和source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行查询操作(二) 的基础知识 : 2) 本文和 ...

  5. java数据库编程——执行查询操作(一)

    [0]README 1) 本文部分文字描述和source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行查询操作 的基础知识 : 2) 本文和 jav ...

  6. java数据库编程——执行SQL 语句

    [0]README 1) 本文文字描述+source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行SQL 语句 的基础知识 : 2)for sour ...

  7. java基础类库——java数据库编程,JDBC连接(原生数据库连接)(十)

    java数据库编程,JDBC连接(原生数据库连接) JDBC严格来讲不属于一门技术,它属于一种服务.所有的操作流程都是固定的.JDBC是java提供的数据库操作的一个标准(它就是一组相关的标准接口), ...

  8. java数据库编程中查询结果的表格式输出_Java数据库编程中查询结果的表格式输出...

    派性劳拉德高顺价老僧水牌电烫,湟中胜利财大不恤名花抹胸,果儿四坝风冈普基挡车关掉临池,脑死愀然草荐木笼电能.公话理念湮没不讳公使难看! 摄氏欠安宣和拉道开封关掉明洁名贵.不名滑膜俊美盲女长虹火主乐律超 ...

  9. jdbc与java数据库编程_JDBC与JAVA数据库编程

    一.JDBC的概念 1. JDBC (Java DataBase Connectivity) Java数据库连接 a) 主要提供java数据库应用程序的API支持 2. JDBC的主要功能 a) 创建 ...

最新文章

  1. Python matplotlib可视化:用Matplotlib的bar_label函数自定义条形图的数值标签、用Matplotlib的bar_label函数为条形图添加数值标记(在每一个条形的中部)
  2. ASP.net的身份验证方式有哪些?分别是什么原理?
  3. win7编程接口的一些变化
  4. string find()函数
  5. Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS、深度优先DFS,最短路径SPF、带负权的最短路径Bellman-ford、拓扑排序)
  6. [转]android之Apache Http——向服务器发送请求的同时发送参数
  7. 使用GoldenGate进行平台迁移和数据库升级(9i-11g)步骤描述
  8. 数字孪生应用白皮书_工信部发布数字孪生应用白皮书:特斯联入选智慧城市建设标杆案例...
  9. 《21天学通C语言(第7版)》一2.4 小 结
  10. html鼠标悬停文字变颜色,鼠标悬停,文字颜色逐渐改变是怎样实现的??
  11. python函数编程1+(1+2)_《Python游戏编程快速上手》一2.1 一些简单的数学知识
  12. Going Deeper into Regression Analysis with Assumptions, Plots Solutions
  13. 加密聊天应用依然安全
  14. pda通用扫描app_智能仓储盘点——PDA扫码盘点APP真正实现“轻松盘点”!
  15. 博士骗领210万元、硕士骗领3万元人才补贴,全被判刑了!
  16. as ssd测试软件得分少,教大家AS SSD Benchmark如何测试硬盘性能
  17. 应届生前端面试题笔记
  18. 企业员工活动打卡收集照片、收集视频的小程序
  19. vue实现excel表格下载
  20. 程序员用什么样子的键盘?

热门文章

  1. P1527 [国家集训队]矩阵乘法 整体二分 + 二维树状数组
  2. CF 1529B. Sifid and Strange Subsequences
  3. A - TOYS POJ - 2318
  4. [AtCoder Regular Contest 060] E - Tak and Hotels
  5. 动态规划:openjudge 2.6-3532 最大上升子序列和 解题心得
  6. CF1598E-Staircases【计数】
  7. P5008-[yLOI2018]锦鲤抄【tarjan】
  8. P3302-[SDOI2013]森林【主席树,LCA,启发式合并】
  9. P4989-二进制之谜【堆,贪心】
  10. nssl1186-字串数量【前缀和】