java数据库编程——事务

【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 接口或二进制流之间起到中间作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法九之基数排序

一、基数排序 (1)基数排序的简介 基数排序不同于其他的排序算法,它不是基于比较的算法。基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。它是一种稳定的排序算法。  通常用于对数的排序选择的是最低位优先法&#xff…

在Spring中使用多个动态缓存

在第三篇有关Spring(长时间)的缓存管理器的文章中,我想通过展示如何配置多个动态创建缓存的缓存管理器来扩展前 两个 。 Spring具有CompositeCacheManager ,从理论上讲,它应该允许使用多个缓存管理器。 它通过询问基础…

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

【0】README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java数据库编程——元数据(metadata)web 与企业应用中的连接管理 的基础知识 ; 2)for database co…

托管 非托管_如何在托管的Kubernetes上备份Neo4J

托管 非托管在下面的视频中,我将解释如何对在托管Kubernetes环境中运行的Neo4J实例进行完整和增量备份。 我们将使用其他Pod进行远程备份,并将备份数据存储在托管环境提供的持久卷上。 如果您想知道如何将Neo4J部署到托管Kubernetes,请查看以…

java国际化——Locale+数字格式

【0】README 1) 本文部分文字描述转自 core java volume 2 , 测试源代码均为原创, 旨在理解 java国际化——Locale数字格式 的基础知识 ; 2) java 编程语言是第一个设计成为全面支持国际化的语言。 2.1)…

Linux指令类型(一)change指令

一、change指令 chattr chgrp chmod chown chfn chsh chroot 二、ch指令详细介绍 &#xff08;1&#xff09;chattr 全名&#xff1a;change attribute 作用&#xff1a;chattr命令用于改变文件属性 语法&#xff1a;chattr [-RV][-v<版本编号>]…

restful rest_HATEOAS的RESTful服务。 REST:刷新器

restful rest在这篇文章中&#xff0c;我们将介绍有关HATEOAS的RESTful服务的综合文章。 REST&#xff1a;刷新器。 1.简介 “不好了&#xff01; 请&#xff0c;不要再发表有关REST的文章&#xff01;” 你们中的许多人可能会尖叫&#xff0c;这是正确的。 已经出版了太多的…

Unicode® Character Name Index

【0】README 0.1&#xff09; there are unicodes for varients of alphabet a, for that of b, c, or d and so on, please visit http://unicode.org/charts/charindex.html [A] A WITH ACUTE, LATIN CAPITAL LETTER 00C1 A WITH ACUTE, LATIN SMALL LETTER 00E1 A WITH…

java8 hash算法

一、hash算法哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值&#xff0c;这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母&#xff0c;随后的哈希都将产生不同的值。要找到散列为同…

exchanger_如何通过示例在Java中使用Exchanger

exchanger大家好&#xff0c;如果您在并发Java应用程序中工作&#xff0c;那么您可能听说过java.util.concurrent包的Exchanger类。 Java中的Exchanger是Java 1.5中与CountDownLatch &#xff0c; CyclicBarrier和Semaphores一起引入的另一个并发或同步实用程序。 顾名思义&…

Java Enumeration接口与Iterator接口

一、Enumeration接口 Enumeration接口中定义了一些方法&#xff0c;通过这些方法可以枚举&#xff08;一次获得一个&#xff09;对象集合中的元素。 这种传统接口已被迭代器取代&#xff0c;虽然Enumeration 还未被遗弃&#xff0c;但在现在代码中已经被很少使用了。尽管如此&a…

java国际化——日期和时间+排序

【0】README 1&#xff09; 本文部分文字描述转自 core java volume 2 &#xff0c; 测试源代码均为原创&#xff0c; 旨在理解 java国际化——日期和时间排序 的基础知识 &#xff1b; 【1】日期和时间 1&#xff09;当格式化日期和时间时&#xff0c;需要考虑4个与 Locale …

jvm 垃圾收集算法_JVM垃圾收集和优化

jvm 垃圾收集算法总览 在对系统进行性能相关问题的故障排除时&#xff0c;内存优化是一个需要深入分析每个系统在内存中存储的内容&#xff0c;存储时间和访问方式的场所。 这篇文章是要对背景信息进行注释&#xff0c;并在此工作中要注意一些要点&#xff0c;这些工作要针对基…

数据库SQL索引

一、索引的意义 表中创建索引&#xff0c;以便更加快速高效地查询数据。 用户无法看到索引&#xff0c;它们只能被用来加速搜索/查询。 注释&#xff1a;更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间&#xff0c;这是由于索引本身也需要更新。因此&#x…

java国际化——消息格式化+文本文件和字符集

【0】README 1&#xff09; 本文部分文字描述转自 core java volume 2 &#xff0c; 测试源代码均为原创&#xff0c; 旨在理解 java国际化——消息格式化文本文件和字符集 的基础知识 &#xff1b; 2&#xff09; 由于本文涉及到的源代码都比较简单&#xff0c;所以直接将全…

java 8 新功能详解_Java 8和Java 14之间的新功能

java 8 新功能详解从版本9开始&#xff0c;Java每6个月就有一次新功能&#xff0c;因此很难跟踪这些新更改。 互联网上的大多数信息都描述了最近2个Java版本之间的变化。 但是&#xff0c;如果您的情况与我相似&#xff0c;则说明您使用的不是Java的最新版本&#xff0c;而是使…

Tomcat配置虚拟内存

一、Tomcat启动参数JAVA_OPTS参数说明   -server 启用jdk 的 server 版&#xff1b;   -Xms java 虚拟机初始化时的堆最小内存&#xff1b;   -Xmx java 虚拟机可使用堆的最大内存&#xff1b;   -XX: PermSize 非堆内存永久保留区域   -XX:MaxPermS…

ISO语言代码和国家代码+Locale常量+ISO货币符号

【1】ISO语言代码和国家代码 【2】Locale常量 【3】ISO货币符号

djl和ljl_使用Spring Boot和DJL进行深度学习

djl和ljl总览 这是Spring Boot上的另一篇文章 &#xff0c;该文章将展示如何使用Deep Java Library &#xff08;DJL&#xff09;构建示例Web应用程序&#xff0c; Deep Java Library &#xff08;DJL&#xff09;是Java的开源深度学习库&#xff0c;用于诊断X射线图像上的COVI…

java BigDecimal八种舍入模式

一、BigDecimal介绍java.math.BigDecimal不可变的immutable、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成。标度(scale)如果为零或正数&#xff0c;则标度是小数点后的位数。如果为负数&#xff0c;则将该数的非标度值乘以10的…