注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天和大家分享一下Java之JDBC事务代码案例
#博学谷IT学习技术支持#
前言
在我们今天要讲的数据库中的事务,就可以理解为一条或一组SQL语句,这个事务成功的执行的必要条件就是其中的SQL全部执行成功,如果其中的任一SQL执行失败(没有达到预期效果),则此次事务执行失败,所有的SQL都不会对数据库中的数据产生变更。
简单的说就是要么一起成功,要么一起失败。
一、使用步骤 1.创建一个简单的sql表,插入数据
create table aaa.account( aid int primary key , aname varchar(20), money double ); insert into aaa.account (aid,aname,money) VALUES (1001,'zhangsan',1000); insert into aaa.account (aid,aname,money) VALUES (1002,'lisi',1000);2.定义jdbc.properties文件
DriverClass=com.mysql.cj.jdbc.Driver Url=jdbc:mysql://localhost:3306/aaa Username=root Password=123456783.定义JDBCUtils类
import java.io.InputStream; import java.sql.*; import java.util.Properties; public class JDBCUtils { private static Properties map; private static String driverClass; private static String url; private static String username; private static String password; private static String sql; private JDBCUtils(){} //封装注册驱动.这里是mysql 8.0的版本 static { try { InputStream inputStream = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"); map = new Properties(); map.load(inputStream); driverClass = map.getProperty("DriverClass"); url = map.getProperty("Url"); username = map.getProperty("Username"); password = map.getProperty("Password"); sql = map.getProperty("Sql"); Class.forName(driverClass); } catch (Exception e) { throw new RuntimeException(e); } } //封装获得连接 public static Connection getConnection(){ try { return DriverManager.getConnection(url, username, password); } catch (SQLException e) { throw new RuntimeException(e); } } }4.定义一个事务的测试类
//事务案例 //1开启事务 //2提交事务 //3回滚事务 import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class demo1 { public static void main(String[] args) { Connection connection = JDBCUtils.getConnection(); try { //关闭事务的自动提交 //默认情况下一条sql单独开启事务 connection.setAutoCommit(false); PreparedStatement pst1 = connection.prepareStatement("update account set money = money -1000 where aname = 'zhangsan'"); int rows1 = pst1.executeUpdate(); //这里故意报个错,如果发生错误就整体运行失败,之前代码也不会执行,要么一起成功,要么一起失败。 System.out.println(1 / 0); PreparedStatement pst2 = connection.prepareStatement("update account set money = money +1000 where aname = 'lisi'"); int rows2 = pst2.executeUpdate(); //提交事务 if (rows1 == 1 && rows2 == 1) { connection.commit(); } } catch (Exception e) { e.printStackTrace(); //回滚事务 try { connection.rollback(); } catch (SQLException ex) { throw new RuntimeException(ex); } } } }
总结
connection.setAutoCommit(false);
connection.commit();
connection.rollback();
事务其实非常简单,如果事务中发生错误就整体运行失败,之前sql代码也不会执行,要么一起成功,要么一起失败。一般就用这个。