0. 数据库中表的创建
1. 配置文件
文件名:jdbc.properties
文件在src目录下,本程序用到了动态查询文件路径的方式读取文件的
url=jdbc:mysql:///db4
user=root
password=root
driver=com.mysql.cj.jdbc.Driver
2.自创JDBC工具类
文件名:JDBCutils.java
package com.otkur.util;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
public class JDBCutils {
private static String url;
private static String user;
private static String password;
public static String Driver;
static {
try {
//读取资源文件,获取值
Properties pro = new Properties();
//获取src路径下的文件的方式---->ClassLoader类加载器
ClassLoader classLoader = JDBCutils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
//加载文件
pro.load(new FileReader(path));
//3.获取数据,赋值
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
Driver = pro.getProperty("driver");
Class.forName(Driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取连接
* @return 连接对象
*/
public static Connection getConnection(){
try {
return DriverManager.getConnection(url,user,password);
} catch (SQLException throwables) {
throwables.printStackTrace();
return null;
}
}
/**
* 释放资源
* @param p1
* @param p2
* @param conn
*/
public static void close(PreparedStatement p1,PreparedStatement p2, Connection conn){
if(p1 != null){
try {
p1.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(p2 != null){
try {
p2.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
3. 主程序
package com.otkur.jdbc2;
import com.otkur.util.JDBCutils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 事务操作
*/
public class JDBCDemo12 {
public static void main(String[] args) {
Connection c = null;
PreparedStatement p1 = null;
PreparedStatement p2 = null;
try {
//1.获取连接
c = JDBCutils.getConnection();
//开启事务
c.setAutoCommit(false);
//2.定义sql
//2.1 张三-500
String sql1 = "update account set money = money - ? where id =?";
//2.2 李四+500
String sql2 = "update account set money = money + ? where id =?";
//3.获取执行对象
p1 = c.prepareStatement(sql1);
p2 = c.prepareStatement(sql2);
//4.设置参数
p1.setDouble(1, 500);
p1.setInt(2, 1);
p2.setDouble(1, 500);
p2.setInt(2, 2);
//5.执行SQL
p1.executeUpdate();
p2.executeUpdate();
//提交事务
c.commit();
} catch (Exception throwables) {
//事务的回滚
try {
if (c != null)
c.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
} finally {
JDBCutils.close(p1, p2, c);
}
}
}
4. 结果
结果1:
当两个语句执行中间出现了异常结果是:
数据库中的结果:
结果没有变,说明事务的操作用对了。
结果1:
去掉中间会抛出异常的代码,程序正常运行
数据库中的结果:
成功实现转账!!!