JDBC事务
Posted zs0322
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC事务相关的知识,希望对你有一定的参考价值。
summarize
事务开启后:只有两条路,要么回滚,要么提交。cmd里面显示的都是在内存里,并没有真正进入表,如果想写进表里,commit ; 就等于是写入表内。
一、事务概述
1.什么是事务
一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败
就是将n个组成单元放到一个事务中
2.mysql的事务
默认的事务:一条sql语句就是一个事务 默认就开启事务并提交事务
手动事务:
1)显示的开启一个事务:start transaction
2)事务提交:commit代表从开启事务到事务提交 中间的所有的sql都认为有效 真正的更新数据库
3)事务的回滚:rollback 代表事务的回滚 从开启事务到事务回滚 中间的所有的 sql操作都认为无效数据库没有被更新
开启事务后
查询的所有命令都只是写在内存里,只有 commit后 才会写入表内,rollback相当于 清屏
一、JDBC事务操作
默认是自动事务:
执行sql语句:executeUpdate() ---- 每执行一次executeUpdate方法 代表 事务自动提交
通过jdbc的API手动事务:
开启事务:conn.setAutoComnmit(false);(默认是true)
提交事务:conn.commit();
回滚事务:conn.rollback();
注意:控制事务的connnection必须是同一个
执行sql的connection与开启事务的connnection必须是同一个才能对事务进行控制
建个Java项目 导包
package com.oracle.demo01; //事务 import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import com.oracle.tools.JDBCUtils; public class Demo01 public static void main(String[] args) // 获取连接 Connection conn=JDBCUtils.getConn(); Statement sta=null; String sql="insert into account(aname,money) values(‘wangwu‘,1000)"; try sta=conn.createStatement();//用statement 直接可以传值,不用占位 // 执行SQL前 手动开启事务 conn.setAutoCommit(false);//手动开启设置 sta.executeUpdate(sql); catch (SQLException e) // 回滚 try conn.rollback(); catch (SQLException e1) // TODO Auto-generated catch block e1.printStackTrace(); // TODO Auto-generated catch block e.printStackTrace(); finally // 提交 try conn.commit(); catch (SQLException e) // TODO Auto-generated catch block e.printStackTrace();
一、DBUtils事务操作
1.QueryRunner
有参构造:QueryRunner runner = new QueryRunner(DataSource dataSource);
有参构造将数据源(连接池)作为参数传入QueryRunner,QueryRunner会从连 接池中获得一个数据库连接资源操作数据库,所以直接使用无Connection参数 的update方法即可操作数据库
无参构造:QueryRunner runner = new QueryRunner();
无参的构造没有将数据源(连接池)作为参数传入QueryRunner,那么我们在使 用QueryRunner对象操作数据库时要使用有Connection参数的方法
代码 展示
新建个tool
package com.oracle.tools; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; public class MyDBUtils public static final String DRIVER = "com.mysql.jdbc.Driver"; public static final String URL = "jdbc:mysql://localhost:3306/java0603?useUnicode=true&characterEncoding=UTF-8"; public static final String USERNAME = "root"; public static final String PASSWORD = "123456"; /* * 创建连接池BasicDataSource */ public static BasicDataSource dataSource = new BasicDataSource(); //静态代码块 static //对连接池对象 进行基本的配置 dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动 dataSource.setUrl(URL); //指定要连接的数据库地址 dataSource.setUsername(USERNAME); //指定要连接数据的用户名 dataSource.setPassword(PASSWORD); //指定要连接数据的密码 /* * 返回连接池对象 */ public static DataSource getDataSource() return dataSource; // 返回一个连接对象 public static Connection getConn() Connection conn=null; try conn=dataSource.getConnection(); catch (SQLException e) // TODO Auto-generated catch block e.printStackTrace(); return conn; -------------------------------------------------- package com.oracle.demo01; //无参构造QueryRunner 事务 import java.sql.Connection; import java.sql.SQLException; import org.apache.commons.dbutils.QueryRunner; import com.oracle.tools.MyDBUtils; public class Demo02 public static void main(String[] args) // 创建queryrunner对象 QueryRunner qr=new QueryRunner(); // 获取连接对象 Connection conn=MyDBUtils.getConn(); String sql="update account set money=money-? where aname=?"; try // 开启事务 conn.setAutoCommit(false);//手动开启 qr.update(conn,sql,100,"zhangsan");//更改-100 catch (SQLException e) // 回滚事务 try conn.rollback();//把回滚写到try里面,上面代码已有错误就会自动回到开启事务 catch (SQLException e1) // TODO Auto-generated catch block e1.printStackTrace(); // TODO Auto-generated catch block e.printStackTrace(); finally //不管对错,上面代码只要是对的,在这里就会执行 // 提交事务 try conn.commit(); catch (SQLException e) // TODO Auto-generated catch block e.printStackTrace();
做个转账项目
建个dynamic
导包
以上是关于JDBC事务的主要内容,如果未能解决你的问题,请参考以下文章