一、JDBC事务的概述
1、事务定义:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2、使用Connection对象管理事务:
开启事务:void setAutoCommit(boolean autoCommit)
提交事务:void commit()
回滚事务: void rollback();
二、JDBC事务操作
1、数据库配置文件db.properties
# db connection parameters
driver=com.mysql.jdbc.Driver
#driver=oracle.jdbc.driver.OracleDriver
#driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:mysql://localhost:3306/test
#url=jdbc:oracle:thin:@localhost:1521:xe
#url=jdbc:sqlserver://localhost:1433;DatabaseName=demo
username=root
#username=demo
#username=sa
password=123456
2、数据库连接工具类
package com.wedu.demo;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
public class JdbcUtils {
private static String url;
private static String username;
private static String password;
private static String driver;
static {
Properties prop = new Properties();
try {
//1、加载配置文件
String path = JdbcUtils.class.getClassLoader().getResource("db.properties").getPath();
prop.load(new FileReader(path));
//2、获取加载的数据
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password");
driver = prop.getProperty("driver");
//3、注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接对象Connection
* @return 连接对象Connection
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
/**
* 释放资源
* @param st 执行sql语句对象
* @param conn 数据库连接对象
*/
public static void close(Statement st, Connection conn) {
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 释放资源
* @param rs 结果集对象
* @param st 执行sql语句对象
* @param conn 数据库连接对象
*/
public static void close(ResultSet rs, Statement st, Connection conn) {
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st != null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3、jdbc事务事务操作
package com.wedu.demo;
import java.sql.*;
public class Demo {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1、获取数据库连接
conn = JdbcUtils.getConnection();
//2、开启事务
conn.setAutoCommit(false);
//3、定义Sql语句
String sql = "select * from userinfo where id = ?";
//4、获取执行sql的对象prepareStatement
ps = conn.prepareStatement(sql);
//5、为SQL语句中的参数赋值,注意,索引是从1开始的
ps.setInt(1, 4);
//6、执行操作
rs = ps.executeQuery();
//7、处理结果
while (rs.next()) {
String sitename = rs.getString("sitename");
String siteadress = rs.getString("siteadress");
System.out.println("网站名称:" + sitename + ",网站地址:" + siteadress);
}
//8、数据库操作完成后,提交事务
conn.commit();
} catch (SQLException e) {
try {
//9、如果操作数据库出现异常,回滚事务
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
//10、释放资源
JdbcUtils.close(rs, ps, conn);
}
}
}