(1) Java实现JDBC连接及事务的方式
许多数据库的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连接及事务的方式的更多相关文章
- JAVA使用jdbc连接MYSQL简单示例
以下展示的为JAVA使用jdbc连接MYSQL简单示例: import java.sql.DriverManager; import java.sql.ResultSet; import java.s ...
- 基于CDH5.x 下面使用eclipse 操作hive 。使用java通过jdbc连接HIVESERVICE 创建表
基于CDH5.x 下面使用eclipse 操作hive .使用java通过jdbc连接HIVESERVICE 创建表 import java.sql.Connection; import java.s ...
- java用JDBC连接MySQL数据库的详细知识点
想实现java用JDBC连接MySQL数据库.需要有几个准备工作: 1.下载Connector/J的库文件,下载Connector/J的官网地址:http://www.mysql.com/downlo ...
- JAVA通过JDBC连接Oracle数据库详解【转载】
JAVA通过JDBC连接Oracle数据库详解 (2011-03-15 00:10:03) 转载▼http://blog.sina.com.cn/s/blog_61da86dd0100q27w.htm ...
- Java使用JDBC连接SQL Server数据库|实现学生成绩信息系统
Java实验四 JDBC 使用SQL Server数据库或者MySQL数据库各自的客户端工具,完成如下任务: (1)创建数据库students: (2)在数据students中创建表scores,包括 ...
- Java使用JDBC连接SQL Server数据库
Java使用JDBC连接SQL Server数据库 1.下载驱动 1.下载Microsoft SQL Server JDBC 驱动程序 https://docs.microsoft.com/zh-cn ...
- ava基础MySQL存储过程 Java基础 JDBC连接MySQL数据库
1.MySQL存储过程 1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if while)等等 的sql语句 1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...
- Java数据库连接——JDBC调用存储过程,事务管理和高级应用
一.JDBC常用的API深入详解及存储过程的调用 相关链接:Jdbc调用存储过程 1.存储过程(Stored Procedure)的介绍 我们常用的操作数据库语言SQL语句在执行的时候需要先编译,然后 ...
- 【Java】JDBC连接MySQL
JDBC连接MySQL 虽然在项目中通常用ORM的框架实现持久化.但经常因测试某些技术的需要,要写一个完整的JDBC查询数据库.写一个在这儿备份. 首先引入驱动包: <dependencies& ...
随机推荐
- 阿里云上遇到: virtual memory exhausted: Cannot allocate memory
# dd if=/dev/zero of=/swap bs=1024 count=1M Format the swap file: # mkswap /swap Enable the swap fil ...
- 浅析 array_map array_walk
map 主要是为了得到你的回调函数处理后的新数组,要的是结果. walk 主要是对每个参数都使用一次你的回调函数,要的是处理的过程. walk 可以认为提供额外参数给回调函数,map不可 ...
- 神经网络(3)---如何表示hypothesis,如何表示我们的model
大脑中的神经元 我们的大脑都充满了上图所示的神经元,神经元有一个细胞体(cell body),还有一些input wires,专业词汇叫做树突(dendrite),它们从其它地方接收输入信息,神经元还 ...
- Django2-settings常用配置
1. MySQL 数据库连接 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'bms', # 要连接 ...
- CF436E Cardboard Box(贪心)
题意 有nnn个关卡,第iii关可以花费aia_iai的代价打一颗星,bib_ibi的代价打两颗星.保证1≤ai<bi≤1091\le a_i<b_i\le10^91≤ai<b ...
- CSP模拟赛 Lost My Music(二分,可回退化栈)
题面 题解 发现是斜率的形式,答案的相反数可以看做一条直线的斜率.那么我们要答案最小,斜率最大.维护下凸壳就行了. 考试时写了直接dfsdfsdfs+暴力弹栈拿了808080分(还以为自己是O(n)正 ...
- 59、servlet3.0-异步请求
59.servlet3.0-异步请求 59.1 开启servlet异步请求步骤 支持异步处理 asyncSupported=true 开启异步模式 req.startAsync(); 业务逻辑进行异步 ...
- Yarn 配置阿里源
1.查看一下当前源 yarn config get registry 2.切换为淘宝源 yarn config set registry https://registry.npm.taobao.org ...
- Ubuntu18.04开机动画(bootsplash)安装
一.搜索喜欢的主题 1.通过软件源搜索,这个比较简单但是没有太喜欢的.-----------------------------------------------------------pipci@ ...
- mysql5.7版本以上下载安装
1.mysql官网下载地址:https://downloads.mysql.com/archives/community/ 2.下载完成后解压,解压后如图: 3.放置位置,把解压好的文件夹放在自己喜欢 ...