首页 > 其他分享 >封装 JDBCUtils和事务

封装 JDBCUtils和事务

时间:2023-05-27 13:01:19浏览次数:43  
标签:事务 JDBCUtils 封装 connection preparedStatement sql set null

1. JDBC 的相关 API 小结  832

封装 JDBCUtils和事务_java

封装 JDBCUtils和事务_Test_02

2. 封装 JDBCUtils 【关闭连接, 得到连接】  833

2.1 说明

在jdbc操作中,获取连接和释放资源是经常使用到可以将其封装JDBC连接的具类JDBCUtils

2.2 代码实现

实际使用使用工具类 JDBCUtils

代码在com.stulzl.utils.

JDBCUtils      833
package com.stulzl.utils;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

//这是一个工具类,完成 mysql 的连接和关闭资源   833
public class JDBCUtils {
    //定义相关的属性(4 个), 因为只需要一份,因此,我们做出 static
    private static String user; //用户名
    private static String password; //密码
    private static String url; //url
    private static String driver; //驱动名

    //再static代码块中去初始化
    static{
        try {
            Properties properties = new Properties();
            properties.load(new FileInputStream("src\\mysql.properties"));
            //读取相关的属性数据
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            url = properties.getProperty("url");
            driver = properties.getProperty("driver");
        } catch (IOException e) {
            //在实际开发中,我们可以这样处理
            //1. 将编译异常转成 运行异常
            //2. 调用者,可以选择捕获该异常,也可以选择默认处理该异常,比较方便.
            throw new RuntimeException(e);
        }
    }

    //连接数据库,返回Connection
    public static Connection getConnection(){
        try {
            return DriverManager.getConnection(url,user,password);
        } catch (SQLException e) {
            //1. 将编译异常转成 运行异常
            //2. 调用者,可以选择捕获该异常,也可以选择默认处理该异常,比较方便.
            throw new RuntimeException(e);
        }
    }

    //关闭相关资源
    //分析可能要关闭的资源
    /*
        1. ResultSet 结果集
        2. Statement 或者 PreparedStatement
        3. Connection
        4. 如果需要关闭资源,就传入对象,否则传入 null
    */
    public static void close(ResultSet set, Statement statement,Connection connection){
        try {
            //判断是否为null
            if(set!=null){
                set.close();
            }
            if(statement!=null){
                statement.close();
            }
            if(connection!=null){
                connection.close();
            }
        } catch (SQLException e) {
            //1. 将编译异常转成 运行异常
            //2. 调用者,可以选择捕获该异常,也可以选择默认处理该异常,比较方便.
            throw new RuntimeException(e);
        }
    }

}
测试类JDBCUtils_Use           834
package com.stulzl.utils;

import org.junit.jupiter.api.Test;

import javax.annotation.processing.SupportedAnnotationTypes;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

//该类演示如何使用JDBCUtils工具类,完成dml和select  834
public class JDBCUtils_Use {
    public static void main(String[] args) {

    }
    @Test
    public void testDML(){
        //1.得到连接
        Connection connection = null;
        //2.组织一个sql语句
        String sql = "update actor set name=? where id = ?";
        PreparedStatement preparedStatement=null;
        try {
            connection = JDBCUtils.getConnection();
            //3.创建preparedStatement对象
            preparedStatement = connection.prepareStatement(sql);

            //4. 给占位符赋值
            preparedStatement.setString(1,"周星驰");
            preparedStatement.setInt(2,2);

            //执行
            preparedStatement.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            JDBCUtils.close(null,preparedStatement,connection);
        }
    }
}
配置文件再src下面   mysql.properties
user=root
password=lzl
url=jdbc:mysql://localhost:3306/hsp_db02
driver=com.mysql.jdbc.Driver

2.2.1  JDBCUtils的select使用  835

 testSelect()方法
//JDBCUtils的select使用  835
    @Test
    public void testSelect(){
        //1.得到连接
        Connection connection = null;
        //2.组织一个sql语句
        String sql = "select * from actor where id=?";
        PreparedStatement preparedStatement=null;
        ResultSet set = null;
        try {
            connection = JDBCUtils.getConnection();
            //3.创建preparedStatement对象
            preparedStatement = connection.prepareStatement(sql);

            //4. 给占位符赋值
            preparedStatement.setInt(1,2);

            //执行,得到结果集
            set = preparedStatement.executeQuery();

            //遍历该结果集
            while(set.next()){
                int id = set.getInt("id");//这里提示("id")可以直接写,也可以写数字(按对应顺序)
                String name = set.getString("name");
                String sex = set.getString("sex");
                Date borndate = set.getDate("borndate");
                String phone = set.getString("phone");
                System.out.println(id + "\t" + name + "\t" + sex
                        + "\t" + borndate + "\t" + phone);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            JDBCUtils.close(set,preparedStatement,connection);
        }
    }
}

3. 事务  836

3.1 基本介绍   836

1. JDBC程序中当一 个Connection对象创建时,默认情况下是自动提交事务:每次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,而不能回滚。

2. JDBC程序中为了让多个 SQL语句作为一个整体执行,需要使用事务

3.调用Connection的setAutoCommit(false)可以取消自动提交事务

4.在所有的SQL语询都成功执行后,调用Connection的commit();方法提交事务

5.在其中某个操作失败或出现异常时, 调用Connection的rollback();方法回滚事务

3.2 应用实例   837

模拟经典的转账业务

封装 JDBCUtils和事务_java_03

3.3 不使用事务可能出现的问题模拟-模拟经典的转账业务   837

3.4 使用事务解决上述问题-模拟经典的转账业务  837

3.3和3.4代码在 com.stulzl.transaction_

Transaction_

package com.stulzl.transaction_;

import com.stulzl.utils.JDBCUtils;
import org.junit.jupiter.api.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

//演示JDBC中如何使用事务   837
public class Transaction_ {

    //不使用事务
    @Test
    public void noTransaction(){
        //1.得到连接
        Connection connection = null;
        //2.组织一个sql语句
        String sql = "update account1 set balance=balance-100 where id = 1";
        String sql2 = "update account1 set balance=balance+100 where id = 2";
        PreparedStatement preparedStatement=null;
        try {
            connection = JDBCUtils.getConnection();// 在默认情况下,connection 是默认自动提交
            //3.创建preparedStatement对象
            //这里就是给马云扣100
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.executeUpdate();//执行第一条sql

            //这里抛出异常,我们的目的是为了让马云转账出去,但是马化腾接收不到(因为执行遇到异常后
            // 面的代码将不再运行) 让我们更加直观的感受接下来事务操作
            int i = 1/0;

            //这里就是给马化腾加100
            preparedStatement = connection.prepareStatement(sql2);
            preparedStatement.executeUpdate();//执行第二条sql2

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            JDBCUtils.close(null,preparedStatement,connection);
        }
    }


    //使用事务来解决
    @Test
    public void useTransaction(){
        //1.得到连接
        Connection connection = null;
        //2.组织一个sql语句
        String sql = "update account1 set balance=balance-100 where id = 1";
        String sql2 = "update account1 set balance=balance+100 where id = 2";
        PreparedStatement preparedStatement=null;
        try {
            connection = JDBCUtils.getConnection();// 在默认情况下,connection 是默认自动提交
            //将connection设置为不自动提交
            connection.setAutoCommit(false);//相当于开启了事务
            //3.创建preparedStatement对象
            //这里就是给马云扣100
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.executeUpdate();//执行第一条sql

            //int i = 1/0;//这里抛出异常

            //这里就是给马化腾加100
            preparedStatement = connection.prepareStatement(sql2);
            preparedStatement.executeUpdate();//执行第二条sql2

            //这里提交事务
            connection.commit();

        } catch (SQLException e) {
            //这里我们可以进行回滚,即撤销执行的 SQL
            //默认回滚到事务开始的状态
            System.out.println("执行发生了异常,撤销执行的 sql");
            try {
                connection.rollback();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            //关闭资源
            JDBCUtils.close(null,preparedStatement,connection);
        }
    }
}

代码在E:\java学习\初级\course170\db_

java_transaction

-- 创建表   837
CREATE TABLE account1(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(32) NOT NULL DEFAULT'',
	balance DOUBLE NOT NULL DEFAULT 0) CHARACTER SET utf8;
-- 添加数据
INSERT INTO account1 VALUES(NULL, '马云',3000);

INSERT INTO account1 VALUES(NULL, '马化腾',10000);

SELECT * FROM account1

标签:事务,JDBCUtils,封装,connection,preparedStatement,sql,set,null
From: https://blog.51cto.com/u_15784725/6362047

相关文章

  • 十二、集成分布式事务组件Seata
    什么是Seata网址:seata.ioSeata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。 seata术语TC(TransactionCoordinator)-事务协调者维护全局和分支......
  • ASEMI代理韩景元可控硅C106M参数,C106M封装,C106M尺寸
    编辑-Z韩景元可控硅C106M参数:型号:C106M断态重复峰值电压VDRM:600V通态电流IT(RMS):4A通态浪涌电流ITSM:30A平均栅极功耗PG(AV):0.2W峰值门功率耗散PGM:1W工作接点温度Tj:-40~125℃储存温度TSTG:-40~150℃断态重复峰值电流IDRM:≤5uA重复峰值反向电流IRRM:≤5uA栅极非触发电压VGD:≥0.2V C106......
  • 这段代码会抛出NPE,你造吗?----封装AssertUtil来友好地利用断言
    运行下面代码,会抛出NPE。你知道为什么吗?importcn.hutool.core.lang.Assert;publicclassTestMain{publicstaticvoidmain(String[]args){MyClassmyClass=newMyClass();Assert.isTrue(myClass.myProperty==0);}privatestati......
  • 下滑虚线组件封装
    <template><divclass="comment-wrapper"><spanclass="comment-text">{{props.text}}</span></div></template><scriptlang="ts"setup>constprops=defineProps({text:St......
  • PHP Amqp 封装类
    1<?php23/**4*使用示例5#定义名称6define('ExchangeName','exchange_name_15');7define('QueueName','queue_name_15');8define('RoutingKey','routing_key_15');91......
  • 超低功耗段码LCD液晶显示屏驱动IC-VKL144A/B QFN48 超小体积封装,可完全替代PCF8551适
    VKL144A/B概述:VKL144A/B是一个点阵式存储映射的LCD驱动器,可支持最大144点(36SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。QT921功能特点......
  • elementplus vue3 ts 单图预览封装
    <divclass="demo-image__preview"><el-imagestyle="width:50px":src="props.image":zoom-rate="1.2":preview-src-list="[props.image]":initial-index="4&quo......
  • mysql事务
    1. mysql 事务1.1 什么是事务事务用于保证数据的一致性,它由一组相关的dml语句组成该组的dml语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。2. 事务和锁  796-797当执行事务操作时(dml语句) ,mysql会在表 上加锁,防止其它用户改表的数据.这对......
  • Spring 事务常见错误。
    案例1:嵌套事务回滚错误假设我们需要对这个功能继续进行扩展,当学生注册完成后,需要给这个学生登记一门英语必修课,并更新这门课的登记学生数。为此,我添加了两个表。(https://www.java567.com,搜"spring")课程表course,记录课程名称和注册的学生数。 CREATETABLE`course`( ......
  • Spring 事务常见错误
    案例1:unchecked异常与事务回滚在系统中,我们需要增加一个学生管理的功能,每一位新生入学后,都会往数据库里存入学生的信息。我们引入了一个学生类Student和与之相关的Mapper。其中,Student定义如下:(https://www.java567.com,搜"spring") publicclassStudentimplementsSeria......