1. 程式人生 > >Java總結(隨筆)——代碼總結JDBC以及事務,以銀行轉賬,查賬等為例

Java總結(隨筆)——代碼總結JDBC以及事務,以銀行轉賬,查賬等為例

模擬銀行系統 數據庫 JDBC 事務

本片文章是對上一篇文章中的事務的例子的功能擴寫,用以加深理解,以及代碼的熟練度:
(1)數據庫表
技術分享圖片
數據:
技術分享圖片
(2)引入數據庫連接jar包
(3)工具類:

package org.jdbc.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

//操作數據庫的工具類
public class DBUtil {

    // 私有化構造方法
    private DBUtil() {
    }

    private static String url = null;
    private static String user = null;
    private static String password = null;

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Properties pro = new Properties();
            pro.load(new FileInputStream("src/jdbc.properties"));
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 讀取外部屬性文件獲取連接對象,需手動輸入url
    public static Connection getConnection1(String url) {
        Properties pro = new Properties();
        Connection conn = null;
        InputStream input = null;
        try {
            input = new FileInputStream("E:" + File.separator
                    + "JDBC.properties");
            pro.load(input);
            conn = DriverManager.getConnection(url, pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;

    }

    // 讀取工程下的配置文件,獲取連接對象參數,不需手動輸入url
    public static Connection getConnection2() throws SQLException {
        Connection conn = DriverManager.getConnection(url, user, password);
        return conn;
    }

    // 釋放全部資源
    public static void closeAll(Connection conn, Statement stat, ResultSet rs)
            throws SQLException {
        if (conn != null) {
            conn.close();
        }
        if (stat != null) {
            stat.close();
        }
        if (rs != null) {
            rs.close();
        }
    }

    // 釋放所用資源
    public static void closePart(Connection conn, Statement stat)
            throws SQLException {
        if (conn != null) {
            conn.close();
        }
        if (stat != null) {
            stat.close();
        }
    }
}

(4)編寫代碼:

package org.jdbc.transcation;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

import org.jdbc.util.DBUtil;

public class AccountDemo {
    // 主方法控制運行方向
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Scanner scan = new Scanner(System.in);
        System.out.println("歡迎來到模擬銀行界面");
        while (true) {
            System.out.print("請輸入你的選擇(1 轉賬  2 查詢    3存款 4取款 5開戶 8退出):");
            int chioce;
            try {
                chioce = scan.nextInt();
                if (chioce == 1 | chioce == 2 | chioce == 3 | chioce==4 | chioce==5 |chioce == 8) {
                    switch (chioce) {
                    case 1: // 轉賬
                        System.out.print("請輸入轉出賬戶姓名:");
                        String fromName = br.readLine();
                        System.out.print("請輸入轉入賬戶姓名:");
                        String toName = br.readLine();
                        System.out.print("請輸入轉賬金額:");
                        int money = scan.nextInt();
                        boolean flag = transFerMoney(fromName, toName, money);
                        if (flag) {
                            System.out.println("轉賬成功");
                            showBalance(toName);
                            showBalance(fromName);
                        } else {
                            System.out.println("請檢查你輸入的信息是否正確,請輸入正確的信息,重新辦理此業務,謝謝!");
                        }
                        break;
                    case 2: // 查詢
                        System.out.print("請選擇 (1:查詢全部賬戶信息\t2:個人賬戶信息):");
                        int chioce1 = scan.nextInt();
                        if (chioce1 == 1 | chioce1 == 2) {
                            switch (chioce1) {
                            case 1: // 查詢全部賬戶
                                selectAll();
                                break;
                            case 2: // 查詢個人賬戶
                                System.out.print("請輸入查詢賬戶姓名:");
                                String balName = br.readLine();
                                selectPart(balName);
                                break;
                            }
                        } else {
                            System.out.println("你的選項錯誤,請重新輸入");
                        }
                        break;
                    case 3: // 存款
                        System.out.print("請輸入存款賬戶名:");
                        String savName = br.readLine();
                        System.out.print("請輸入存款金額:");
                        int savMoney = scan.nextInt();
                        boolean isSave = saveMoney(savName, savMoney);
                        if (isSave) {
                            System.out.println("存款成功");
                            showBalance(savName);
                        } else {
                            System.out.println("你輸入的賬戶信息有誤,存款失敗..");
                        }
                        break;
                    case 4: // 取款 
                        System.out.print("請輸入取款賬戶名:");
                        String draName = br.readLine();
                        System.out.print("請輸入取款金額:");
                        int draMoney = scan.nextInt();
                        boolean isDraw = drawMoney(draName, draMoney);
                        if (isDraw) {
                            System.out.println("取款成功");
                            showBalance(draName);
                        } else {
                            System.out.println("你輸入的賬戶信息有誤,取款失敗..");
                        }
                        break;
                    case 5: // 取款 
                        System.out.print("請輸入開戶賬戶名:");
                        String opName = br.readLine();
                        System.out.print("請輸入開戶存款金額:");
                        int opBalance = scan.nextInt();
                        boolean isOpen = openAccount(opName, opBalance);
                        if (isOpen) {
                            System.out.println("恭喜你,開戶成功");
                            System.out.println("當前賬戶信息:");
                            selectPart(opName);
                        } else {
                            System.out.println("Sorry,發生異常,你開戶失敗..");
                        }
                        break;
                    case 8: // 退出本系統
                        System.out.println("謝謝你的光臨,再見!!");
                        System.exit(0);
                    }
                } else {
                    System.out.println("你的選項錯誤,請重新輸入");
                }
            } catch (IOException e) {
                System.out.println("你有非法操作,產生異常現象:"+e.getMessage());
            }
        }

    }

    // 轉錢方法
    @SuppressWarnings("resource")
    public static boolean transFerMoney(String fromName, String toName,
            int money) {
        boolean flag = false;
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs=null;
        try {
            conn = DBUtil.getConnection2();
            String sql="select * from account where name=?";
            ps=conn.prepareStatement(sql);
            ps.setString(1, fromName);
            rs=ps.executeQuery();
            boolean flag1=false;
            flag1= rs.next();
            ps.close();

            ps=conn.prepareStatement(sql);
            ps.setString(1, fromName);
            rs=ps.executeQuery();
            boolean flag2=false;
            flag2= rs.next();
            ps.close();
            if((flag1 && flag2)!=false){
                conn.setAutoCommit(false);// 取消自動提交
                String sql1 = "update account set balance=balance-? where name=?";
                String sql2 = "update account set balance=balance+? where name=?";
                ps = conn.prepareStatement(sql1);
                ps.setInt(1, money);
                ps.setString(2, fromName);// 轉出
                ps.executeUpdate();
                ps.close();

                ps = conn.prepareStatement(sql2);
                ps.setInt(1, money);
                ps.setString(2, toName);// 轉入
                ps.executeUpdate();
                conn.commit();// 提交事務
                flag = true;
            }else{
                System.out.println("Sorry,你輸入的賬戶有誤,不能進行轉賬處理");
            }   
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closeAll(conn, ps,rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return flag;

    }

    // 全部賬戶查詢方法信息
    public static void selectAll() {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        try {
            conn = DBUtil.getConnection2();// 建立連接
            String sql = "select * from account";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            System.out.println("全部賬戶信息查詢結果為:");
            System.out.println("編號\t姓名\t賬戶余額");
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int balance = rs.getInt("balance");
                System.out.println(id + "\t" + name + "\t" + balance);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closeAll(conn, ps, rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    // 查詢單人賬戶信息
    @SuppressWarnings("resource")
    public static void selectPart(String balName) {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        try {
            conn = DBUtil.getConnection2();// 建立連接
            String sql3 = "select * from account where name=?";
            ps = conn.prepareStatement(sql3);
            ps.setString(1, balName);
            rs = ps.executeQuery();
            boolean flag = rs.next();
            if (flag == true) {
                System.out.println(balName + "賬戶信息查詢結果為:");
                System.out.println("編號\t姓名\t賬戶余額");
                rs = ps.executeQuery();
                while (rs.next()) {
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    int balance = rs.getInt("balance");
                    System.out.println(id + "\t" + name + "\t" + balance);
                }
            } else {
                System.out.println("你輸入的 賬戶信息不存在,請重新輸入..");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closeAll(conn, ps, rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    // 存錢方法
    public static boolean saveMoney(String saveName, int savMoney) {
        boolean flag = false;
        Connection conn = null;
        PreparedStatement ps = null;
        String sql6 = "update account set balance=balance+? where name=?";
        int count = 0;
        try {
            conn = DBUtil.getConnection2();
            ps = conn.prepareStatement(sql6);
            ps.setInt(1, savMoney);
            ps.setString(2, saveName);
            count = ps.executeUpdate();
            if (count != 0) {
                flag = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closePart(conn, ps);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return flag;

    }

    // 取錢方法
    public static boolean drawMoney(String drawName, int draMoney) {
        boolean flag = false;
        Connection conn = null;
        PreparedStatement ps = null;
        String sql7 = "update account set balance=balance-? where name=?";
        int count = 0;
        try {
            conn = DBUtil.getConnection2();
            ps = conn.prepareStatement(sql7);
            ps.setInt(1, draMoney);
            ps.setString(2, drawName);
            count = ps.executeUpdate();
            if (count != 0) {
                flag = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closePart(conn, ps);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return flag;

    }

    // 建立新的賬戶
    public static boolean openAccount(String opName, int opBalance) {
        boolean flag = false;
        Connection conn = null;
        PreparedStatement ps = null;
        String sql9 = "insert into account(name,balance) values(?,?)";
        int count = 0;
        try {
            conn = DBUtil.getConnection2();
            ps = conn.prepareStatement(sql9);
            ps.setString(1, opName);
            ps.setInt(2, opBalance);
            count = ps.executeUpdate();
            if (count != 0) {
                flag = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closePart(conn, ps);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return flag;

    }

    //顯示余額方法
    @SuppressWarnings("resource")
    public static void showBalance(String showName) {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        try {
            conn = DBUtil.getConnection2();// 建立連接
            String sql10 = "select balance from account where name=?";
            ps = conn.prepareStatement(sql10);
            ps.setString(1, showName);
            rs = ps.executeQuery();
                rs = ps.executeQuery();
                while (rs.next()) {
                    int shBalance = rs.getInt("balance");
                    System.out.println(showName + "賬戶當前 余額為:"+shBalance);
                }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                DBUtil.closeAll(conn, ps, rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

運行結果:

歡迎來到模擬銀行界面
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):2
請選擇 (1:查詢全部賬戶信息 2:個人賬戶信息):1
全部賬戶信息查詢結果為:
編號  姓名  賬戶余額
1   項羽  35013020
2   劉邦  20002980
3   李世民 47618000
4   趙匡胤 23990000
5   朱元璋 12356000
6   嬴政  32200000
7   曹操  200000000
8   孫權  14500000
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):1
請輸入轉出賬戶姓名:李世民
請輸入轉入賬戶姓名:曹操
請輸入轉賬金額:3000
轉賬成功
曹操賬戶當前 余額為:200003000
李世民賬戶當前 余額為:47615000
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):1
請輸入轉出賬戶姓名:呵呵
請輸入轉入賬戶姓名:哈哈
請輸入轉賬金額:20000
Sorry,你輸入的賬戶有誤,不能進行轉賬處理
請檢查你輸入的信息是否正確,請輸入正確的信息,重新辦理此業務,謝謝!
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):2
請選擇 (1:查詢全部賬戶信息 2:個人賬戶信息):2
請輸入查詢賬戶姓名:劉邦
劉邦賬戶信息查詢結果為:
編號  姓名  賬戶余額
2   劉邦  20002980
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):2
請選擇 (1:查詢全部賬戶信息 2:個人賬戶信息):3
你的選項錯誤,請重新輸入
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):2
請選擇 (1:查詢全部賬戶信息 2:個人賬戶信息):2
請輸入查詢賬戶姓名:哈哈
你輸入的 賬戶信息不存在,請重新輸入..
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):3
請輸入存款賬戶名:朱元璋
請輸入存款金額:300000
存款成功
朱元璋賬戶當前 余額為:12656000
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):3
請輸入存款賬戶名:呵呵
請輸入存款金額:3300
你輸入的賬戶信息有誤,存款失敗..
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):4
請輸入取款賬戶名:曹操
請輸入取款金額:250
取款成功
曹操賬戶當前 余額為:200002750
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):
4
請輸入取款賬戶名:哈哈
請輸入取款金額:200
你輸入的賬戶信息有誤,取款失敗..
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):5
請輸入開戶賬戶名:李淵
請輸入開戶存款金額:300000000
恭喜你,開戶成功
當前賬戶信息:
李淵賬戶信息查詢結果為:
編號  姓名  賬戶余額
9   李淵  300000000
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):2
請選擇 (1:查詢全部賬戶信息 2:個人賬戶信息):1
全部賬戶信息查詢結果為:
編號  姓名  賬戶余額
1   項羽  35013020
2   劉邦  20002980
3   李世民 47615000
4   趙匡胤 23990000
5   朱元璋 12656000
6   嬴政  32200000
7   曹操  200002750
8   孫權  14500000
9   李淵  300000000
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):6
你的選項錯誤,請重新輸入
請輸入你的選擇(1 轉賬    2 查詢    3存款 4取款 5開戶 8退出):8
謝謝你的光臨,再見!!

Java總結(隨筆)——代碼總結JDBC以及事務,以銀行轉賬,查賬等為例