怀旧网,博客详情:JDBC 事务的使用

1、Java Web 的基本概念

2、IDEA 中配置启动Tomcat

3、如何运行第一个Tomcat HttpServlet 程序

4、Servlet 详解

5、Response 和 Request 介绍

6、Cookie Session 介绍

7、JSP 详细讲解

8、Java Bean 介绍

9、MVC 架构介绍

10、Filter过滤器、监听器 介绍

11、JDBC 事务的使用

12、Java Web 文件上传

原创

JDBC 事务的使用

JDBC介绍及使用

JDBC 就是使用Java语言操作关系型数据库的一套API 全称:( Java DataBase Connectivity ) Java 数据库连接

image-20240401095411124

JDBC的本质:

  • 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

JDBC的好处:

  • 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
  • 可随时替换底层数据库,访问数据库的Java代码基本不变

以后编写操作数据库的代码只需要面向JDBC(接口),操作哪儿个关系型数据库就需要导入该数据库的驱动包,如需要操作MySQL数据库,就需要再项目中导入MySQL数据库的驱动包。

使用JDBC操作mysql步骤

  1. 在本地mysql中创建一个数据库和表
CREATE DATABASE /*!32312 IF NOT EXISTS*/`jdbc` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;

USE `jdbc`;

DROP TABLE IF EXISTS `account`;

CREATE TABLE `account` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `money` float DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

insert  into `account`(`id`,`name`,`money`) values (1,'A',1000),(2,'B',1000),(3,'C',1000);

image-20240401101155957

  1. 在maven项目中导入JDBC所需要的jar包
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
</dependency>
  1. 编写java代码测试(固定连接5个步骤)
import java.sql.*;

public class AccountDao {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 1. 加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        // 创建数据库连接url  useUnicode=true&characterEncoding=UTF-8 用来设置连接的字符编码(防止乱码出现)
        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF-8";
        String user = "root";
        String password = "123456";
        // 2. 获取数据库的连接对象
        Connection conn = DriverManager.getConnection(url, user, password);

        // 创建查询的sql语句
        String sql = "select * from account";

        // 3. 获取sql执行对象
        PreparedStatement ps = conn.prepareStatement(sql);

        // 4. 执行查询
        ResultSet rs = ps.executeQuery();

        // 获取查询数据
        while (rs.next()) {
            System.out.println("id: " + rs.getObject("id"));
            System.out.println("name: " + rs.getObject("name"));
            System.out.println("money: " + rs.getObject("money"));
            System.out.println();
        }

        // 5. 关闭数据库连接对象
        rs.close();
        ps.close();
        conn.close();
    }
}

image-20240401101209075

成功获取到数据库的数据;

事务的介绍及使用

详细介绍可以查看博客请点击:网页链接

要么都成功,要么都失败

ACID原则

事务在数据库中大致分为一下几个步骤

-- 事务开启

-- 事务执行

-- 事务回滚

-- 事务提交

编写java代码测试事务:

模拟A用户给B转账100元

import java.sql.*;

public class AccountDao {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 1. 加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        // 创建数据库连接url  useUnicode=true&characterEncoding=UTF-8 用来设置连接的字符编码(防止乱码出现)
        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF-8";
        String user = "root";
        String password = "123456";
        // 2. 获取数据库的连接对象
        Connection conn = DriverManager.getConnection(url, user, password);

        // 模拟转账
        String sql = "update account set money = money - 100 where name = 'A'";
        // 执行转账sql
        conn.prepareStatement(sql).executeUpdate();

        sql = "update account set money = money + 100 where name = 'B'";
        // 执行收款sql
        conn.prepareStatement(sql).executeUpdate();

        conn.close();
    }
}

正常情况下,直接转账成功

查看数据库结果:

image-20240401102830025

现在模拟发生异常

import java.sql.*;

public class AccountDao {
    public static void main(String[] args){
        Connection conn = null;
        String sql;
        try {
            // 加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 创建数据库连接url  useUnicode=true&characterEncoding=UTF-8 用来设置连接的字符编码(防止乱码出现)
            String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF-8";
            String user = "root";
            String password = "123456";

            // 获取数据库的连接对象
            conn = DriverManager.getConnection(url, user, password);

            // 模拟转账
            sql = "update account set money = money - 100 where name = 'A'";
            // 执行转账sql
            conn.prepareStatement(sql).executeUpdate();

            // 异常
            int a = 1 / 0;

            sql = "update account set money = money + 100 where name = 'B'";
            // 执行收款sql
            conn.prepareStatement(sql).executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            // 关闭数据库连接对象
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

image-20240401102659279

运行报错,重新查看数据库中的数据

image-20240401102652832

A用户数据减少,但是B用户数据没有增加

开启事务:

执行前恢复数据库数据:

image-20240401102918621

重新编写代码

import java.sql.*;

public class AccountDao {
    public static void main(String[] args){
        Connection conn = null;
        String sql;
        try {
            // 加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 创建数据库连接url  useUnicode=true&characterEncoding=UTF-8 用来设置连接的字符编码(防止乱码出现)
            String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF-8";
            String user = "root";
            String password = "123456";

            // 获取数据库的连接对象
            conn = DriverManager.getConnection(url, user, password);

            // 开启事务
            conn.setAutoCommit(false);

            // 模拟转账
            sql = "update account set money = money - 100 where name = 'A'";
            // 执行转账sql
            conn.prepareStatement(sql).executeUpdate();

            // 异常
            int a = 1 / 0;

            sql = "update account set money = money + 100 where name = 'B'";
            // 执行收款sql
            conn.prepareStatement(sql).executeUpdate();

            // 没有发生异常提交事务
            conn.commit();
            
            System.out.println("转账成功!");
        } catch (Exception e) {
            // 发生异常让数据回滚
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            // 打印数据回滚提示
            System.out.println("发生异常转账失败,数据回滚!");
        }finally {
            // 关闭数据库连接对象
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

image-20240401103117729

查看数据库数据

image-20240401103150200

没有发生异常情况,数据成功回滚

当没有异常情况

import java.sql.*;

public class AccountDao {
    public static void main(String[] args){
        Connection conn = null;
        String sql;
        try {
            // 加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 创建数据库连接url  useUnicode=true&characterEncoding=UTF-8 用来设置连接的字符编码(防止乱码出现)
            String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF-8";
            String user = "root";
            String password = "123456";

            // 获取数据库的连接对象
            conn = DriverManager.getConnection(url, user, password);

            // 开启事务
            conn.setAutoCommit(false);

            // 模拟转账
            sql = "update account set money = money - 100 where name = 'A'";
            // 执行转账sql
            conn.prepareStatement(sql).executeUpdate();
            
            sql = "update account set money = money + 100 where name = 'B'";
            // 执行收款sql
            conn.prepareStatement(sql).executeUpdate();

            // 没有发生异常提交事务
            conn.commit();

            System.out.println("转账成功!");
        } catch (Exception e) {
            // 发生异常让数据回滚
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            // 打印数据回滚提示
            System.out.println("发生异常转账失败,数据回滚!");
        }finally {
            // 关闭数据库连接对象
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

image-20240401103226878

image-20240401103233806

转账成功!

  • 平台作者:怀旧(联系作者)
  • QQ:444915368
  • 邮箱:444915368@qq.com
  • 电话:17623747368
  • 评论

    登录后才可以进行评论哦!

    回到顶部 留言