Java 程式設計()  第十 一章 Java+MySQL 專題:銀行存款系統   上一頁    下一頁

 

11-6 專題 研討建立存款帳戶

內容:

  • 11-6-1 範例研討:步驟(1) 建立存款帳戶規格

  • 11-6-2 範例研討:步驟(2) 建立帳戶與異動管理

『藝術銀行』期望製作一套『活期儲蓄存款系統』,程式設計師很難了解系統需求,因此依照可能狀態分段製作,每一階段完成並得到上級同意後,再往下一階段實現,吾人將各步驟分批實施如下。

11-6-1 範例研討:步驟(1) 建立存款帳戶規格

(A) 系統功能:Ex11_2.javaaccount.java

系統需要建立客戶帳戶。每一存款帳戶包含:姓名(String name帳戶(String No存款餘額(int balance,各項資料限制如下:

(1) 帳戶:由 12 個數字與 1 個檢查碼所構成(合計 13 碼),檢查碼計算方式是利用一個加權系列: 1 2 1 2 1 2... 交替變換,帳號第一個數字乘以 1、第二位乘以 3、第三位乘以 1...等依此類推,再將所乘的結果相加(= total),再取 10 的餘數(value = total % 10),檢查碼即是 10 減該餘數(= 10 - value)。

(2) 存款餘額:如果取款後,餘額會少於 0,則會拒絕提款。

請製作一個帳戶類別(Account.class)是其具有上述功能,再至作主程式引用該類別,驗證是否正常。當建立帳戶時,只要輸入 12 個帳號,系統自動產生檢查碼;處理帳戶而輸入帳號,系統也會檢查檢查碼是否正確。期望驗證帳戶類別功能的結果如下:

D:\Java2_book\chap11>java Ex11_2

***建立新帳戶***

請輸入姓名=>粘添壽

請輸入帳號(12 位數字) =>456789130123

****建立完成****

完整的新帳戶(13)=>45678913012310

請輸入存款金額 =>50000

餘額 = 50000

列印帳戶資料

帳戶姓名: 粘添壽

帳戶號碼(13 )45678913012310

餘額= 50000

(A) 帳戶類別(Account.class)

首先必須建立帳戶類別,但它必須與  Bank_db 資料庫內 Account 資料表相配合,Account 表格的結構如下圖:

各欄位功能如下:

(1) 欄位 ID:帳號,資料型態是 CHAR(20),但程式內必須經過運算,Java 程式採用 int[13] 格式。

(2) 欄位 name:帳戶姓名,資料型態是 CHAR(20)Java 程式採用 String 格式。

(3) 欄位 balance:餘額,資料型態是 intJava 程式採用 int 格式。

另外 ID 12 個整數再加入 1 個檢查碼,皆必須符合檢查碼計算方法。 餘額 balance 不可以小於 0,否則拒絕存取,因此須將 ID balance 設定為私有變數,必須透過物件方法存取。Account 類別結構如下圖所示。

11-2 Account.java 程式架構

Account 程式範例如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

//Account.java

/* 設定客戶姓名、帳號(ID) 與存款餘額 */

import java.io.*;

import java.util.Scanner;

 

class Account{

    String name;

    private int[]ID = new int[13];

    private int balance;

// 設定帳號

    int setID(String ID_Str) {

        if(ID_Str.length() !=12){

            System.out.printf("12個字元,請重新輸入!!\n");

            return 0;

        }

        else{

            Scanner s = new Scanner(ID_Str).useDelimiter("");

            int total = 0;

            for(int i=0;i<12;i++){

               ID[i]=s.nextInt();

               if((i+1)%2==0)

                   total+=ID[i];

               else

                   total+=ID[i]*2;

            }

            ID[12] = (10-(total%10));

            System.out.print("****建立完成****\n完整的新帳戶(13)=>");

            for(int i=0;i<13;i++)

                  System.out.print(ID[i]);

             System.out.println();

             return 1;            

       }

     }

 

// 取得帳號

    int[] getID(){

        return ID;

    }

// 寫入帳號

    int writeID(String ID_STR1) {

        if(ID_STR1.length() !=13){

            System.out.printf("長度不對\n");

            return 0;

        }

        else{

            Scanner s = new Scanner(ID_STR1).useDelimiter("");

            int total = 0, check, check_R;

            for(int i=0;i<12;i++){

               ID[i]=s.nextInt();

               if((i+1)%2==0)

                   total+=ID[i];

               else

                   total+=ID[i]*2;

            }

            check_R = s.nextInt();

            check = 10-(total%10);

            if (check == check_R) {

                ID[12] = check;

                return 1;

            } else {

                 System.out.printf("檢查碼不對\n");

                 return 0;

            }   

           }

    }    

 

// 存款

    int saveM(int money){

        balance = balance + money;

        return balance;

    }

// 取款

    int recM(int money) {

        int m = balance - money;

        if (m >=0) {

           balance = m;

           return balance;

        }

        else {

           return -1;

        }

    }

// 查詢餘額

    int checkM(){

        return balance;

    }   

}

經編譯後,產生一只 Account.class,如下:

D:\Java2_book\chap11>javac -encoding utf-8 Account.java

 

D:\Java2_book\chap11>dir/b Acc*

Account.class

Account.java

 (C) 主類別(Ex11_2.class)

我們寫一個簡單程式來驗證 Account 類別是否能滿足所需,程式範例如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

//Ex11_2.java

import java.util.*;

public class Ex11_2{

    public static void main(String[] args) {

        Scanner keyin = new Scanner(System.in);

        String ID_Str;

        Account customer = new Account();

        System.out.printf("***建立新帳戶***\n請輸入姓名=>");

        customer.name = keyin.nextLine();

        System.out.printf("請輸入帳號(12 位數字) =>");

        ID_Str = keyin.nextLine();

        int flag = customer.setID(ID_Str);

        if (flag == 0)

              return;

        System.out.printf("請輸入存款金額 =>");

        int money = keyin.nextInt();

        int balance = customer.saveM(money);

        System.out.printf("餘額 = %d\n", balance);

/* 列印帳戶清單 */

        System.out.printf("\n列印帳戶資料\n");

        System.out.printf("帳戶姓名: %s \n", customer.name);

        int[] ID = customer.getID();

              String ID_S = "";

        for (int i=0; i<13; i++)

                     ID_S = ID_S + ID[i];

              System.out.printf("帳戶號碼(13 ) %s", ID_S);

        System.out.printf("\n");

        System.out.printf("餘額= %d\n", customer.checkM());

    }

}

11-6-2 範例研討:步驟(2) 建立帳戶與異動管理

(A) 系統功能:Ex11_3.javaTransaction.java

無論建立新帳戶、帳戶存款或帳戶提款,都有可能變更到帳戶內的餘額(balance),除了需登錄於帳戶資料表內(Account),也必須將交易過程登錄於交易檔( transaction)內,因此,在 Bank_db 資料庫內有 Account transaction 兩資料表,前者已介紹過,接下來介紹 transaction,其結構如下圖:

銀行內所有帳戶的交易狀況皆登錄於此資料表內,每一筆紀錄說明每一帳戶的交易過程,個欄位說明如下:

(a) trans_no交易編碼,每一筆交易都有一個唯一識別值,是此表格的主鍵。

(b) ID帳戶編碼,此交易資料的帳戶。

(c) trans_type交易型態,1 表存款;0 表提款

(d) trade交易金額

(e) trans_date交易時間日期

依照上述規格,吾人將 transaction 類別宣告如下:(Transaction.java)

01

02

03

04

05

06

07

08

09

10

//Transaction.java

/* 設定交易檔規格:trans_no, ID, trans_type, trade date*/

 

class Transcation{

    int trans_NO;

    String ID;

       int trans_type;

       int trade;

       String trans_date;

}

經編譯後,產生一只 Transaction.class,如下:

如下:

D:\Java2_book\chap11>javac -encoding utf-8 Transaction.java

 

D:\Java2_book\chap11>dir/b Tr*

Transaction.class

Transaction.java

 (B) 主類別(Ex11_3.class)

我們編寫一只程式可以建立一個新帳戶,並存入開戶金額,接著,再由 Account 表格內讀出該帳戶資料,並由 Transaction 表內讀取該帳戶的異動資料。其中將資料插入資料表語法如下:

Insert Into account

Value(“ID”, “name”, balance);

Insert Into transaction

Value(“trans_ID”, “ID”, “trans_type”, “trade”, “trans_date”);

查詢資料表語法如下:

Select *

From account

Where ID = “帳戶編碼”;

Select *

From transaction

Where ID = “帳戶編碼”;

期望操作結果如下:

D:\Java2_book\chap11>javac -encoding utf-8 Ex11_3.java

 

D:\Java2_book\chap11>java Ex11_3

***建立新帳戶***

請輸入姓名=>柯大仙

請輸入帳號(12 位數字) =>341234871912

****建立完成****

完整的新帳戶(13)=>3412348719128

請輸入存款金額 =>892102

餘額 = 892102

 

列印帳戶資料                     [直接列印新增帳戶資料]

帳戶姓名: 柯大仙

帳戶號碼(13 )3412348719128

餘額= 892102

Sat Dec 09 09:16:50 CST 2017 WARN: Establishing SSL connection without server's

……..

成功連結 Bank_db 資料庫          [顯示資料庫連結成功]

帳戶 account 新增正常             [顯示資料庫 account 帳戶新增成功]

交易檔 transaction 新增正常        [顯示資料庫 transaction 交易新增成功]

 

顯示新增帳戶 account 資料:          [由資料庫讀出新增帳戶資料]

3412348719128   柯大仙  892102

 

顯示新增交易 transaction 資料:      [由資料庫讀出新增交易資料]

交易編碼: 26

帳戶編碼: 3412348719128

交易種類: 存款

交易金額: 892102

交易日期:2017-12-09 09:16:50.0

程式範例如下:(Ex11_3.java)

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

//Ex11_3.java

 

import java.util.*;

import java.sql.*;

import java.text.*;

public class Ex11_3{

/* 宣告資料庫連結訊息 */

       static String driver = "com.mysql.jdbc.Driver";

       static Connection conn = null;

       static Statement st = null;

       static ResultSet rs = null;

       static ResultSetMetaData rsmeta = null;

       static String url = "jdbc:mysql://localhost:3306/bank_db";

       static String user = "root";

       static String password = "12345678";

      

    public static void main(String[] args) throws SQLException {

        Scanner keyin = new Scanner(System.in);

             

       /* 建立新帳戶 */

        String ID_Str;

        Account customer = new Account();

        System.out.printf("***建立新帳戶***\n請輸入姓名=>");

        customer.name = keyin.nextLine();

        System.out.printf("請輸入帳號(12 位數字) =>");

        ID_Str = keyin.nextLine();

        int flag = customer.setID(ID_Str);

        if (flag == 0)

              return;

        System.out.printf("請輸入存款金額 =>");

        int money = keyin.nextInt();

        int balance = customer.saveM(money);

        System.out.printf("餘額 = %d\n", balance);

 

       /* 列印帳戶清單 */

              String name = customer.name;  // 新增帳戶名稱

              balance = customer.checkM();  // 新增帳戶餘額

        int[] ID = customer.getID();

              String ID_S = "";

        for (int i=0; i<13; i++)

            ID_S = ID_S + ID[i];       // 新增帳戶號碼

              System.out.printf("\n列印帳戶資料\n");

              System.out.printf("帳戶姓名: %s \n", name);

              System.out.printf("帳戶號碼(13 )%s\n", ID_S);

        System.out.printf("餘額= %d\n", balance);

       /* 連結 bank_db 資料庫 */

              try {

            Class.forName(driver);

                     conn = DriverManager.getConnection(url, user, password);

            System.out.println("成功連結 Bank_db 資料庫");

            st = conn.createStatement();

                     String SQL;

       /* 將帳戶寫入 account 資料表 */

                     SQL = String.format("INSERT INTO account VALUES('%s', '%s', '%d')",

                                                ID_S, name, balance);

                     if (st.executeUpdate(SQL) == 1)

                         System.out.println("帳戶 account 新增正常");

       /* 由異動訊息寫入 transaction 資料表*/

                     Transaction trans = new Transaction();

                     java.util.Date now = new java.util.Date();

                     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

                     trans.trans_date = sdf.format(now);

                     trans.trans_type = 1;

                     trans.trade = balance;

                     trans.ID = ID_S;

                     SQL = String.format("INSERT INTO transaction(ID, trans_type, trade, trans_date)" +

       "VALUES('%s', '%d', '%d','%s')", trans.ID, trans.trans_type, trans.trade, trans.trans_date);

                     if (st.executeUpdate(SQL) == 1)

                         System.out.println("交易檔 transaction 新增正常");

       /* account 讀出新增帳戶的資料 */

                     SQL = String.format("Select * From account where ID = %s", ID_S);

                     rs = st.executeQuery(SQL);

                     System.out.printf("\n顯示新增帳戶 account 資料:\n");

                     while (rs.next()) {

                         System.out.printf("%s\t", rs.getString("ID"));

                           System.out.printf("%s\t", rs.getString("name"));

                           System.out.printf("%s\t", rs.getInt("balance"));

                           System.out.printf("\n");

            }

       /* transaction  讀出新增交易資料 */

                     SQL = String.format("Select * From transaction where ID = %s", ID_S);

                     rs = st.executeQuery(SQL);

                     System.out.printf("\n顯示新增交易 transaction 資料:\n");

                     while (rs.next()) {

                           System.out.printf("交易編碼: %d\n", rs.getInt("trans_no"));

                         System.out.printf("帳戶編碼: %s\n", rs.getString("ID"));

                           System.out.printf("交易種類: ");

                           if (rs.getInt("trans_type") == 1)

                                   System.out.printf("存款 \n");

                           else

                                  System.out.printf("提款 \n");

                           System.out.printf("交易金額: %d\n", rs.getInt("trade"));

                           System.out.printf("交易日期:%s\n", rs.getString("trans_date"));  

            }   

                     conn.close();

        }

              catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

              catch (SQLException e) {

            e.printStackTrace();

        }

    }

}

 

翻轉工作室:粘添壽

 

Java 程式設計(二) 含物件導向

 

 

翻轉電子書系列: