zoukankan      html  css  js  c++  java
  • JDBC事务机制

    案例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();
                    }
                }
            }
        }
    }
  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/xlwu/p/13654082.html
Copyright © 2011-2022 走看看