序言
我们平常工作中用到的spring框架中的事务的管理是通过@Transcational注解来控制的声明式事务管理,其底层是通过关闭事务自动提交,手动提交事务来实现事务控制。
JdbcTranscational.java
import java.sql.*;
public class JdbcTranscational {
/**
* mysql连接url
*/
private static final String URL = "jdbc:mysql://127.0.0.1:3306/test";
/**
* 数据库连接账号名
*/
private static final String USER = "root";
/**
* 数据库连接密码
*/
private static final String PASSWORD = "123456";
/**
* mysql数据库驱动类名
*/
private static final String DRIVER_NAME = "com.mysql.jdbc.Driver";
/**
* @return java.sql.Connection
* @Author cuizx
* @Description 获取数据库连接
* @Date 2019/8/23 21:39
* @Param []
**/
private Connection getConnection() {
Connection conn = null;
try {
//加载mysql驱动类
Class.forName(DRIVER_NAME);
//获取数据库连接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* @return void
* @Author cuizx
* @Description 按照连接方式倒序关闭所有连接
* @Date 2019/8/23 21:42
* @Param [conn, stmt, resultSet]
**/
private void closeConnection(Connection conn, Statement stmt, ResultSet resultSet) {
try {
if (resultSet != null) {
resultSet.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @Author cuizx
* @Description 执行sql
* @Date 2020/11/21
* @Param [sql]
* @return void
**/
public void executeSql(String sql) {
Statement stmt = null;
int result = 0;
Connection connection = getConnection();
try {
//JDBC中默认是true,自动提交事务(这里手动成false)
connection.setAutoCommit(false);
//创建声明
stmt = connection.createStatement();
//执行sql
result = stmt.executeUpdate(sql);
System.out.println("执行结果:" + result);
//提交事务
connection.commit();
} catch (Exception e) {
try {
//抛错后回滚
connection.rollback();
} catch (SQLException e1) {
}
} finally {
closeConnection(connection, stmt, null);
}
}
public static void main(String[] args) {
String sql = "select * from user";
String insertSql = "insert into user (id,userName) values('123','cuizx')";
String updateSql = "update user set userName ='更新后' where id ='123'";
String deleteSql = "delete from user where id ='123'";
JdbcTranscational jdbcTranscational = new JdbcTranscational();
jdbcTranscational.executeSql(insertSql);
jdbcTranscational.executeSql(updateSql);
jdbcTranscational.executeSql(deleteSql);
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jdbctranscational</groupId>
<artifactId>jdbctranscational</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 导入Mysql数据库链接jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
</dependencies>
</project>
以上便是事务控制的手动实现代码,其中最核心的部分是关闭事务自动提交和异常后事务回滚
1:jdbc中autocommit默认为true,每次sql执行都会自动提交事务,而我们如果要自己来控制事务的话,就必须将autocommit设置为false
2:connection.rollback(),在catch块中进行事务的回滚,也就是我们平常所知的抛出异常进行事务回滚