许多数据库的auto-commit默认是ON的,比如MySQL,PostgresSQL等。当然也有默认是OFF的,比如Oracle(Oracle里面执行DML语句是需要手动commit的)。

这里我们以MySQL为例,先写一个基本的JDBC连接的例子:

package com.mycloud.demo.connection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement; public class ConncetionTest1 { public static void main(String[] args) { String jdbcUrl = "jdbc:mysql://localhost:3306/test_db";
String username = "xxx";
String password = "xxx"; // Basic sample
// Connection -> Statement -> ResultSet: try with resource
try (Connection con = DriverManager.getConnection(jdbcUrl, username, password);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select id, account from test")) {
String result = getResultSetAsString(rs);
System.out.println(result);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("Error occurred!");
}
} private static String getResultSetAsString(ResultSet rs) throws SQLException { ResultSetMetaData rsmd = rs.getMetaData();
int numCols = rsmd.getColumnCount();
StringBuilder sb = new StringBuilder(); while (rs.next()) {
for (int i = 1; i <= numCols; i++) {
String elem = rs.getString(i);
if (rs.wasNull())
sb.append("NULL");
else
sb.append(elem); if (i != numCols)
sb.append("|");
}
sb.append(System.lineSeparator());
} return sb.toString();
}
}

在auto-commit默认是ON的情况下,每一条sql都是一个独立的事务,运行完直接commit。但是如果需要实现事务,比如我们执行一组DML,如果某一条失败,就全部rollback。这种方式就不行了:

        try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
Statement stmt = conn.createStatement()) {
stmt.execute("INSERT INTO test(id, account) VALUES (1, 100)");
stmt.execute("INSERT INTO test(id, account) VALUES (2, 200)");
stmt.execute("INSERT INTO test(id, account) VALUES (2, 201)"); // Exception: duplicate pk
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("Error occurred!");
}

我们查询数据库发现,成功插入了两条数据:

id account
1 100
2 200

在这种情况下,我们首先要通过设置connection.setAutoCommit为OFF来开启事务,再通过connection.commit/connection.rollback来提交/回滚事务。

        try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
Statement stmt = conn.createStatement()) { conn.setAutoCommit(false);
try {
stmt.execute("INSERT INTO test(id, account) VALUES (1, 100)");
stmt.execute("INSERT INTO test(id, account) VALUES (2, 200)");
stmt.execute("INSERT INTO test(id, account) VALUES (3, 300)");
} catch (SQLException e) {
e.printStackTrace();
conn.rollback(); // rollback
throw e;
}
conn.commit(); // commit } catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("Error occurred!");
}

我们查询数据库发现,成功插入了3条数据:

id account
1 100
2 200
3 300

当然,如果我们去掉conn.commit()这一句,数据就不会插入了。

如果这一组DML中某一条失败,则会被SQLException捕获,从而抛出异常并回滚。

        try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
Statement stmt = conn.createStatement()) { conn.setAutoCommit(false);
try {
stmt.execute("INSERT INTO test(id, account) VALUES (1, 100)");
stmt.execute("INSERT INTO test(id, account) VALUES (2, 200)");
stmt.execute("INSERT INTO test(id, account) VALUES (2, 201)"); // Exception: duplicate pk
stmt.execute("INSERT INTO test(id, account) VALUES (3, 300)");
} catch (SQLException e) {
e.printStackTrace();
conn.rollback(); // rollback
throw e;
}
conn.commit(); // commit } catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("Error occurred!");
}

我们再查询数据库发现,并没有数据插入。

(1) Java实现JDBC连接及事务的方式的更多相关文章

  1. JAVA使用jdbc连接MYSQL简单示例

    以下展示的为JAVA使用jdbc连接MYSQL简单示例: import java.sql.DriverManager; import java.sql.ResultSet; import java.s ...

  2. 基于CDH5.x 下面使用eclipse 操作hive 。使用java通过jdbc连接HIVESERVICE 创建表

    基于CDH5.x 下面使用eclipse 操作hive .使用java通过jdbc连接HIVESERVICE 创建表 import java.sql.Connection; import java.s ...

  3. java用JDBC连接MySQL数据库的详细知识点

    想实现java用JDBC连接MySQL数据库.需要有几个准备工作: 1.下载Connector/J的库文件,下载Connector/J的官网地址:http://www.mysql.com/downlo ...

  4. JAVA通过JDBC连接Oracle数据库详解【转载】

    JAVA通过JDBC连接Oracle数据库详解 (2011-03-15 00:10:03) 转载▼http://blog.sina.com.cn/s/blog_61da86dd0100q27w.htm ...

  5. Java使用JDBC连接SQL Server数据库|实现学生成绩信息系统

    Java实验四 JDBC 使用SQL Server数据库或者MySQL数据库各自的客户端工具,完成如下任务: (1)创建数据库students: (2)在数据students中创建表scores,包括 ...

  6. Java使用JDBC连接SQL Server数据库

    Java使用JDBC连接SQL Server数据库 1.下载驱动 1.下载Microsoft SQL Server JDBC 驱动程序 https://docs.microsoft.com/zh-cn ...

  7. ava基础MySQL存储过程 Java基础 JDBC连接MySQL数据库

    1.MySQL存储过程   1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if  while)等等 的sql语句   1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...

  8. Java数据库连接——JDBC调用存储过程,事务管理和高级应用

    一.JDBC常用的API深入详解及存储过程的调用 相关链接:Jdbc调用存储过程 1.存储过程(Stored Procedure)的介绍 我们常用的操作数据库语言SQL语句在执行的时候需要先编译,然后 ...

  9. 【Java】JDBC连接MySQL

    JDBC连接MySQL 虽然在项目中通常用ORM的框架实现持久化.但经常因测试某些技术的需要,要写一个完整的JDBC查询数据库.写一个在这儿备份. 首先引入驱动包: <dependencies& ...

随机推荐

  1. Hibernate初探之单表映射——Hibernate概念及插件的安装

    什么是ORM ORM(Object/Relationship Mapping):对象/关系映射 为什么要有ORM? 利用面向对象思想编写的数据库应用程序最终都是把对象信息保存在关系型数据库中,于是要编 ...

  2. LightOJ - 1078-Integer Divisibility(同余)

    链接: https://vjudge.net/problem/LightOJ-1078 题意: If an integer is not divisible by 2 or 5, some multi ...

  3. LeetCode 308. Range Sum Query 2D - Mutable

    原题链接在这里:https://leetcode.com/problems/range-sum-query-2d-mutable/ 题目: Given a 2D matrix matrix, find ...

  4. SpringBoot项目中,Redis的初次使用

    1.引入Redis依赖包,在application.yml中配置redis <dependency> <groupId>org.springframework.boot< ...

  5. 「学习笔记」FFT及NTT入门知识

    前言 快速傅里叶变换(\(\text{Fast Fourier Transform,FFT}\) )是一种能在\(O(n \log n)\)的时间内完成多项式乘法的算法,在\(OI\)中的应用很多,是 ...

  6. NetworkX系列教程(10)-算法之二:最小/大生成树问题

    小书匠 Graph 图论  重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定 ...

  7. Other-Website-Contents.md

    title: 本站目录 categories: Other sticky: 10 toc: true keywords: 机器学习基础 深度学习基础 人工智能数学知识 机器学习入门 date: 999 ...

  8. 在application-context.xml中配置多个property-placeholder

    如下所示,直接写多个<context:property-placeholder>标签是会报错的. <context:property-placeholder location=&qu ...

  9. ibm 汇编

    https://www.ibm.com/developerworks/cn/linux/l-assembly/index.html https://72k.us/file/4031001-328073 ...

  10. ICEM-圆柱与长方体相切

    原视频下载地址:https://yunpan.cn/cqvgLe39ZU4Ke  访问密码 c1c9