(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!");        }

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

(0)

相关推荐

  • 在处理jsp读取mysql中遇到的问题记录

    在我第一次使用jdbc,来通过jsp读取mysql中遇到一些问题记录一下. 首先都是一个DBHelper.java的工具类, package util; import java.sql.Connect ...

  • 大数据量查询容易OOM?试试MySQL流式查询

    一.前言 程序访问 MySQL 数据库时,当查询出来的数据量特别大时,数据库驱动把加载到的数据全部加载到内存里,就有可能会导致内存溢出(OOM). 其实在 MySQL 数据库中提供了流式查询,允许把符 ...

  • 【JDBC】CRUD操作

    JDBC的CRUD操作 向数据库中保存记录 修改数据库中的记录 删除数据库中的记录 查询数据库中的记录 保存代码的实现 package demo1;import java.sql.Connection ...

  • JDBC连接Oracle的简单例子 (再编)

    开始学习JDBC(抱怨下老师留的大作业,哭),在网上看到份简单JDBC连接oracle的实例以及别人的操作心得,我又补充了点我自己的,还有实际操作时出现的错误. 代码编写的时候,有很多大小写都没有规范 ...

  • JDBC连接时出现的两个错误

    这两个错误都是因为版本的更新导致的: 错误代码: package FirstTest;import java.sql.*;public class FirstJDBC { public static ...

  • Java中JDBC操作数据库的步骤

    Java中JDBC操作数据库的步骤,今天给喜欢Java开发或者是想要参加Java培训学习的小伙伴们分享一些Java技能干货,那就是Java阐述jdba操作数据库的步骤,废话不多说了,随小编一起来看一下 ...

  • 文本连接的几种方式

    前言 要把多个字符连接起来,方法有很多,今天就给大家介绍一下常用的方法,大家各取所需. 使用&连接 第一种方法,使用&连字符,&字符可以将两个文本链接起来,直接引用文本时,文本 ...

  • 钢筋连接的三种方式:绑扎、焊接、机械,如何选择?

    钢筋连接方式选择的正确是否直接关系到工程质量的优劣,现结合规范.标准对三种常见的钢筋连接方式进行分析对比:①绑扎搭接.②焊接连接.③机械连接,以方便工程设计和施工人员正确选用. 一 绑扎搭接 钢筋绑扎 ...

  • 【Power BI X SSAS]——再看Power BI数据连接的三种方式

    第一篇是关于Power BI连接数据方式的对比.这是个老生常谈的话题.微软官方考试Exam70-778教材的第一章,就是重点介绍这个方面.这种基础性的知识点繁琐而且枯燥,就像一本字典,只有用到的时候才 ...

  • 一文看懂变压器连接组别及绕组方式

    描述 变压器连接组别概述 变压器的同一相高.低压绕组都是绕在同一铁芯柱上,并被同一主磁通链绕,当主磁通交变时,在高.低压绕组中感应的电势之间存在一定的极性关系. 在任一瞬间,高压绕组的某一端的电位为正 ...

  • 绑扎/焊接/机械:钢筋连接的三种方式该如何选择?

    钢筋连接方式选择的正确是否直接关系到工程质量的优劣,现结合规范.标准对三种常见的钢筋连接方式进行分析对比:①绑扎搭接.②焊接连接.③机械连接,以方便工程设计和施工人员正确选用. 一 绑扎搭接 钢筋绑扎 ...

  • Java数组转List的三种方式及对比

    前言: 本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析. 一.最常见方式(未必最佳) 通过 Arrays.asList(strArray ...