事务,JDBC,封装工具类,Druid-连接池技术,Dbutils

事务

什么是事务?

在实际的开发过程中,一个业务操作如:转账,往往是要多次访问数据库才能完成的。转
账是一个用户扣钱,另一个用户加钱。如果其中有一条 SQL 语句出现异常,这条 SQL 就可能执行失败;
事务执行是一个整体,所有的 SQL 语句都必须执行成功。如果其中有 1 SQL 语句出现异常,则所有的SQL 语句都要回滚,整个业务执行失败;

手动提交事务

MYSQL 中可以有两种方式进行事务的操作:
  1.  手动提交事务
  2.  自动提交事务

手动提交事务的sql语句

开启事务     start transaction;
提交事务     commit;

回滚事务     rollback;

手动提交事务使用过程: 

执行成功的情况: 开启事务 ---> 执行多条 SQL 语句 --->   成功提交事务
执行失败的情况: 开启事务 --->   执行多条 SQL 语句 --->   事务的回滚

自动提交事务

 MySQL 默认每一条 DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕 自动提交事务,MySQL 默认开始自动提交事务;

取消自动提交

查看 MySQL 是否开启自动提交事务
@@ 表示全局变量, 1 表示开启, 0 表示关闭
取消自动提交事务
执行更新语句,使用 SQLYog 查看数据库,发现数据并没有改变
在控制台执行 commit 提交任务

事务原理

事务开启之后 , 所有的操作都会临时保存到事务日志中 , 事务日志只有在得到 commit 命令才会同步到数据表中,其他任何情况都会清空事务日志(rollback ,断开连接 )

事务的步骤: 

  1. 客户端连接数据库服务器,创建连接时创建此用户临时日志文件
  2. 开启事务以后,所有的操作都会先写入到临时日志文件中
  3. 所有的查询操作从表中查询,但会经过日志文件加工后才返回
  4. 如果事务提交则将日志文件中的数据写到表中,否则清空日志文件。

回滚点  

在某些成功的操作完成之后,后续的操作有可能成功有可能失败,但是不管成功还是失败,前面操作都已经成 功,可以在当前成功的位置设置一个回滚点。可以供后续失败操作返回到该位置,而不是返回所有操作,这个点称之 为回滚点。

回滚点的操作语句 

设置回滚点         savepoint 名字
回到回滚点         rollback to 名字

 注意事项:设置回滚点可以让我们在失败的时候回到回滚点,而不是回到事务开启的时候。

事务的四大特性 ACID  

原子性( Atomicity
每个事务都是一个整体,不可再拆分,事务中所有的 SQL 语句要么都执行成功, 要么都失败。
一致性( Consistency
事务在执行前数据库的状态与执行后数据库的状态保持一致。如:转账前 2 个人的 总金额是 2000 ,转账后 2 个人总金额也是 2000
隔离性( Isolation
事务与事务之间不应该相互影响,执行时保持隔离的状态。
持久性( Durability
一旦事务执行成功,对数据库的修改是持久的。就算关机,也是保存下来的。

事务的隔离级别

事务在操作时的理想状态: 所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个 数据。可能引发并发访问的问题:

脏读               
一个事务读取到了另一个事务中尚未提交的数据
不可重复读       
         
一个事务中两次读取的数据 内容 不一致,要求的是一个事务中多次读取时数据是一致的,这 是事务 update 时引发的问题
幻读
一个事务中两次读取的数据的 数量 不一致,要求在一个事务多次读取的数据的数量是一致
的,这是 insert delete 时引发的问题

MySQL 数据库有四种隔离级别

上面的级别最低,下面的级别最高。表示会出现这种问题,表示不会出现这种问题。

注意: 隔离级别越高,性能越差,安全性越高

MySQL 事务隔离级别相关的命令

查询全局事务隔离级别
select @@tx_isolation;
设置事务隔离级别,需要退出 MySQL 再重新登录才能看到隔离级别的变化
set global transaction isolation level  级别字符串

JDBC:Java database  connectivity(Java数据库连接)

 JDBC的本质

   Java连接数据库
  由数据库厂商提供的数据库jar包,实现了sun提供的接口的实现类
  Java.sql.Driver 驱动接口------------>com.mysql.jdbc.Driver
  java.sql.Connection 数据库连接接口--------->com.mysql.jdbc.ConnectionImpl
  只需要导入数据库厂商提供的jar包
  jar包的名字: mysql-connection-Java.版本号.jar

JDBC的操作步骤

 1 导包
 2 注册驱动   ------>Class.forName("com.mysql.jdbc.Driver");
 3 获取数据库连接对象--------->(三个参数:协议,(jdbc:mysql://localhost:3306/库名)用户名,密码)
 4 写sql语句------------>(DDL 创建表/ insert into/ update /delete  from)
 5 连接对象获取执行对象  ------->(Statement stmt=conn.createStatement();)
 6 执行sql语句,---------->  resultSet=stmt.excuteQuery(sql);
 7 释放资源------>(conn.close();   stmt.close(); )

代码提现:

package com.qf.jdbc_01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

/**
 *
 * jdbc原生操作步骤:7大步骤
 *  1)导入驱动mysql的jar包
 *  2)注册驱动
 *  3)创建数据库的连接对象Connection
 *  4)准备好sql
 *  5)通过连接对象获取执行对象Statment
 *  6)执行sql语句   (插入操作)
 *  7)释放资源 (系统资源需要被释放的)
 */
public class JDBCDemo {
    public static void main(String[] args) throws Exception {

        //1)导入驱动mysql的jar包
        //2)注册驱动
        Class.forName("com.mysql.jdbc.Driver") ;

       // DriverManager.registerDriver(new com.mysql.jdbc.Driver());

        //3)创建数据库的连接对象Connection
        //jdk提供的DriverManager:驱动管理类(管理jdbc的驱动的)
        //public static Connection getConnection(String url,String user,String password)throws SQLException
        //参数url: 统一资源定义符号  组成  协议:端口号:库名   --->jdbc:mysql://localhost:3306
        //参数user: 登录msyql的用户名 root用户
        //参数password:登录mysql的密码
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/ee_2208_02",
                "root",
                "123456"
        );


        //4)准备好sql
        String sql = "insert into account(name,balance) values('赵又廷2',2000)  " ;

        //5)通过连接对象获取执行对象Statment
        //Statement createStatement()throws SQLException创建一个Statement对象,用于将SQL语句发送到数据库
        Statement stmt = conn.createStatement();

        //6)执行sql语句   (插入操作)
        //Statement执行器里面---->
        //int executeUpdate(String sql)throws SQLException 通用的执行通用添加,删除,修改
        int count = stmt.executeUpdate(sql);
        System.out.println("影响了"+count+"行") ;

        //7)释放资源 (系统资源需要被释放的)
        stmt.close();
        conn.close();
    }
}
package com.qf.jdbc_02;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

/**
 * JDBC来操作DDL语句:创建表
 * 使用JDBC来创建一个学生表,编号id,name姓名,age年龄,gender性别,address住址
 *
 */
public class JdbcDemo2 {
    public static void main(String[] args)  throws Exception{
        //7大步骤
        //1)导包
        //2)注册驱动
        Class.forName("com.mysql.jdbc.Driver") ;

        //3)获取数据库连接对象
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/ee_2208_02",
                "root",
                "123456");

        //4)准备sql
        String sql = "create table student(" +
                " id int primary key auto_increment," +
                " name varchar(10)," +
                " age int," +
                " gender varchar(3)," +
                " address varchar(20)" +
                ");" ;
        //5)通过连接对象获取执行器
        Statement stmt = conn.createStatement();

        //6)执行sql语句  ----通用的更新操作:添加删除/修改, 或者ddl语句 "建表"  ---int executeUpdate(String sql)
        int count = stmt.executeUpdate(sql);
        System.out.println(count);

        //7)释放资源
        stmt.close();
        conn.close();
    }
}
package com.qf.jdbc_02;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * Jdbc操作DML语句
 *      插入,insert
 *      修改,update
 *      删除,delete
 *
 *      加入异常处理----try...catch..finally...捕获异常
 */
public class JDBCDemo3 {
    public static void main(String[] args) {

        Connection conn = null ;
        Statement stmt = null ;
        try {
            //1)导包
            //2)注册驱动
            Class.forName("com.mysql.jdbc.Driver") ;
            //3)获取数据库连接对象
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/ee_2208_02",
                    "root",
                    "123456"
            );
            //4)sql语句
            //插入insert
           /* String sql = "insert into student(name,age,gender,address) values('李帅',25,'男','西安市')," +
                    " ('高圆圆',28,'女','渭南市')," +
                    " ('赵又廷',30,'男','宝鸡市')," +
                    " ('王瑄',23,'男','南窑国际')" ;*/

            //修改操作update
            //String sql = "update student set name = '马蓉',age = 25,address='渭南市富平县' where id = 2" ;

            //删除
            String sql = "delete from student where id = 2 ;" ;

            //5)通过连接对象获取执行器
            stmt = conn.createStatement();

     
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SUPERMarsR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值