Java總結(隨筆)——代碼總結JDBC以及事務,以銀行轉賬,查賬等為例
阿新 • • 發佈:2018-06-13
模擬銀行系統 數據庫 JDBC 事務 本片文章是對上一篇文章中的事務的例子的功能擴寫,用以加深理解,以及代碼的熟練度:
(1)數據庫表
數據:
(2)引入數據庫連接jar包
(3)工具類:
(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以及事務,以銀行轉賬,查賬等為例