数据库事务(1)

相关的一些概念我就不赘述了,百度一大堆。

1.前提条件

安装了mysql数据库;建库和建表。

2.mysql事务操作

(1).连接数据库。win+R输入cmd,打开dos窗口输入mysql -hlocalhost -u(用户) -p(密码)。附上mysql常用的dos命令https://www.cnblogs.com/GaoNa/p/9495413.html

(2) 我在数据库里建了名为webtest的库和一张account表,插入了3条数据。

(3) 

插入数据的时候注意name是varchar类型,需要加上引号。

(4)mysql事务提交有两种手动和自动。

先看手动:

此时虽然tom变成了zhangsan,但是还没提交,磁盘存储的数据还没改变。rollback还是会还原的。

只有commit后数据才会变。

自动提交:

show variables;可查看相关信息,

3.jdbc事务操作

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

//演示mysql的事务
public class JDBCDemo1 {
    public static void main(String [] args) throws SQLException {
        
        Connection connection = null;
        Statement stmt = null;
        try {
            //1.注册数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接
            connection = DriverManager.getConnection("jdbc:mysql:///webtest", "root", "root");
            //3.向数据库拿到一个statement对象
             stmt = connection.createStatement();
            //开启事务
            connection.setAutoCommit(false);
            String sql = "update account set account = 10 where id = 1";
            stmt.executeUpdate(sql);
            //提交事务
            connection.commit();
        } catch (Exception e) {
            //回滚事务
            connection.rollback();
            e.printStackTrace();
        }finally {
            if(stmt!=null) {
                stmt.close();
            }
            if(connection!=null) {
                connection.close();
            }
        }
        
    }
}
 

4.DBUntil事务操作

使用c3p0连接池。手写一个DBUtil类操作数据库。注意在c3p0-config.xml配置数据库信息。

package com.itheima.utils;

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

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;


public class DBUtil {
    private static DataSource ds = new ComboPooledDataSource("a");
    //获取一个连接池
    public static DataSource getDataSource() {
        return ds;
        
    } 
    //获取一个connection对象
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
        
    }
}
 

 

进行事务的演示

 package com.itheima.dbutils;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import com.itheima.utils.DBUtil;
public class DBUntilDemo1 {
    public static void main(String[] args) {
        Connection con = null;
        try {
            QueryRunner runner = new QueryRunner();
            con = DBUtil.getConnection();
            con.setAutoCommit(false);
            String sql = "update account set name = 'lisi' where id =1";
            runner.update(con, sql);
            System.out.println("123");
            con.commit();
        } catch (SQLException e) {
            // TODO 自动生成的 catch 块
            try {
                con.rollback();
            } catch (SQLException e1) {
                // TODO 自动生成的 catch 块
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            if(con!=null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
            
        }
    }
}

QueryRunner

有参构造:QueryRunner runner = new QueryRunner(DataSource dataSource);一般在查询时使用,因为不需要开启事务。

有参构造将数据源(连接池)作为参数传入QueryRunner,QueryRunner会从连接池中获得一个数据库连接资源操作数据库,所以直接使用无Connection参数  的update方法即可操作数据库

无参构造:QueryRunner runner = new QueryRunner();

无参的构造没有将数据源(连接池)作为参数传入QueryRunner,那么我们在使   用QueryRunner对象操作数据库时要使用有Connection参数的方法 。

发布了11 篇原创文章 · 获赞 6 · 访问量 5727

猜你喜欢

转载自blog.csdn.net/Ruipower/article/details/94853900
今日推荐