案例10:JDBC事务机制:
package com.java.JDBC; import java.sql.*; /* JDBC事务机制: 1 JDBC中的事务是自动提交的,什么是自动提交? 只要执行任意一条DML语句,则自动提交一次。这是JDBC默认的事务行为。 但是在实际的业务当中,通常都是N条DML语句共同联合才能完成的,必须 保证他们这些DML语句在同一个事务中同时成功或者同时失败。 2 以下程序先来验证一下JDBC的事务是都是自动提交机制。 测试结果:JDBC中只要执行任意一条DML语句,就提交一次。 */ public class JDBCTest10 { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 1 注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2 获取连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase","root","333"); // 3 获取预编译数据库操作对象 String sql = "update dept set dname = ? where deptno = ?"; ps = conn.prepareStatement(sql); // 第一次给占位符传值 ps.setString(1,"x部门"); ps.setInt(2,30); int count = ps.executeUpdate(); System.out.println(count); // 重新给占位符传值 ps.setString(1,"y部门"); ps.setInt(2,20); count = ps.executeUpdate(); System.out.println(count); } catch (Exception e) { e.printStackTrace(); } finally { // 6 释放资源 if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
案例11:通过JDBC模拟银行转账系统
package com.java.JDBC; import java.sql.*; /** * sql脚本: * drop table if exists t_act; * create table t_act( * actno bigint, * balance double(7,2) // 注意:7表示有效数字的个数,2表示小数位的个数。 * ); * * insert into t_act(actno,balance) values(111,20000); * insert into t_act(actno,balance) values(222,0); * commit; * * select * from t_act; * * 重点三行代码? * conn.setAutoCommit(false); * conn.commit(); * conn.rollback(); */ public class JDBCTest11 { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 1 注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2 获取连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase","root","333"); // 将自动提交机制修改为手动提交 conn.setAutoCommit(false);// 开启事务 // 3 获取预编译数据库操作对象 String sql = "update t_act set balance = ? where actno = ?"; ps = conn.prepareStatement(sql); // 给?传值 ps.setDouble(1,10000); ps.setInt(2,111); int count = ps.executeUpdate(); /*String s = null; s.toString();*/ // 再给?传值 ps.setDouble(1,10000); ps.setInt(2,222); count += ps.executeUpdate(); System.out.println(count == 2 ? "转账成功" : "转账失败"); // 程序能够走到这里说明以上程序没有异常,事务结束,手动提交数据 conn.commit();// 提交事务 } catch (Exception e) { // 回滚事务 if (conn != null) { try { conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } e.printStackTrace(); } finally { // 6 释放资源 if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }