相关的一些概念我就不赘述了,百度一大堆。
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参数的方法 。