天天看點

使用Java通過sql server做出的第一個訂單系統(+心路曆程)

先放截圖!

使用Java通過sql server做出的第一個訂單系統(+心路曆程)
使用Java通過sql server做出的第一個訂單系統(+心路曆程)
使用Java通過sql server做出的第一個訂單系統(+心路曆程)
使用Java通過sql server做出的第一個訂單系統(+心路曆程)
使用Java通過sql server做出的第一個訂單系統(+心路曆程)
使用Java通過sql server做出的第一個訂單系統(+心路曆程)

功能如下:在用戶端提供資訊,用戶端送出後,在資料庫裡面進行存儲過程的調用,改變訂單表Orders和SP表,最後解決問題,達到了統一。

大概耗費了接近一周吧,一直在做這個,每天起碼做了3~4個小時,很累!

第一次用java做這個東東,很菜雞,代碼接近300行,給出一些關鍵代碼吧。

首先說下思路

第一步是連接配接資料庫,要用到JDBC包,上篇文章提到了怎麼用。

第二步就是開始寫了。

具體步驟是這樣:

1.建構主界面

一般建構主界面的時候你就要想,布局,顯示的位置,我最愛采用的是BorderLayout也就是邊框布局,我感覺是非常強大的,也特别喜歡用。布局肯定有連接配接資料庫的地方吧,有你輸入資訊的地方吧(雖然我覺得我的界面也是爛的不行QAQ),還有顯示資料的地方吧(我覺得我的界面不太美觀!急需一個會美工的妹紙OvO),建構主界面的一個非常好用的東東就是JPanel了,我經常用JPanel去把界面做的盡可能大小合适(Jpanel裡面也可以進行布局設定,達到非常不錯的嵌套效果)。

public class Home {
    static String JDriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";
    static String url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=SPJ_mng";
    static String user="sa";
    static String password="1";
    JFrame frame=new JFrame("訂單界面");//設定主frame的名字
    JButton Connect_data=new JButton("連接配接資料庫");
    JButton Submit_data=new JButton("送出資料");
    static String[] selections={"無","供應商含量表","顯示訂單表"};
    static JComboBox function=new JComboBox(selections);
    JButton J_data=new JButton("供應商含量表");
    static JTextArea Text_show=new JTextArea("這裡顯示結果    ");

    JPanel panel =new JPanel();
    JPanel panel_left =new JPanel();

    JLabel Name_label=new JLabel("姓名");
    JLabel SNO_label=new JLabel("SNO");
    JLabel PNO_label=new JLabel("PNO");
    JLabel JNO_label=new JLabel("JNO");
    JLabel quantity_label=new JLabel("數量");
    static JTextField Name=new JTextField("(在此處輸入名字)");
    static JTextField SNO=new JTextField("(在此處輸入SNO)");
    static JTextField PNO=new JTextField("(在此處輸入PNO)");
    static JTextField JNO=new JTextField("(在此處輸入JNO)");
    static JTextField quantity=new JTextField("(在此處輸入數量)");

    public int GUI()
    {
        JFrame.setDefaultLookAndFeelDecorated(true);//設定視窗為提供一個關于新建立的 JFrame具有目前外觀為其提供的 Window裝飾
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設定關閉按鈕
        frame.setLayout(new BorderLayout(,));//設定布局為相對布局
        frame.pack();//frame.pack确定frame的最佳大小
        frame.setBounds(, , , );//設定frame的出現位置及大小

        Connect_data.addActionListener(new Connect_dataListener());
        Submit_data.addActionListener(new Submit_dataListener());
        function.addActionListener(new function_dataListener());

        Name.addMouseListener(new Name_dataListener());
        SNO.addMouseListener(new Sno_dataListener());
        PNO.addMouseListener(new Pno_dataListener());
        JNO.addMouseListener(new Jno_dataListener());
        quantity.addMouseListener(new Quantity_dataListener());

        frame.add(Connect_data,BorderLayout.NORTH);
        frame.add(Submit_data,BorderLayout.SOUTH);
        frame.add(Text_show,BorderLayout.EAST);
        frame.add(panel_left,BorderLayout.WEST);
        frame.add(panel,BorderLayout.CENTER);

        panel.setLayout(new GridLayout(, ));
        panel.add(Name_label);panel.add(Name);
        panel.add(SNO_label);panel.add(SNO);
        panel.add(PNO_label);panel.add(PNO);
        panel.add(JNO_label);panel.add(JNO);
        panel.add(quantity_label);panel.add(quantity);

        panel_left.setLayout(new BorderLayout(, ));
        panel_left.add(function,BorderLayout.NORTH);

        frame.setVisible(true);//設定圖形界面為可見
        return ;
    }

    public static void main(String[] args){
        Home home=new Home();
        home.GUI();
    }
}
           

2.監聽器設定

這個裡面基本上大多數控件我都設了監聽,按鈕和JComboBox下拉項以及Textfield部分都是設有監聽的。記得注意一下,不同種類的監聽是不一樣的。

比如按鈕肯定是ActionListener接口(這裡本渣渣一直對extends和implements總是不太了解,不能多重繼承,但是可以多個接口(間接地實作多重繼承,通常接口之定義方法名稱,并不實作,其實作可交給繼承他的子類中實作!),是以推薦一篇文章給小可愛們!http://bbs.csdn.net/topics/20458493),但是Textfield的接口就不一樣了,是MouseListener接口,而且這個很坑,我隻用到了mouseClick方法,我才發現以前我的部落格都是沒有代碼高亮的!

哇的一下就哭了

我邊貼代碼邊bb

class Submit_dataListener implements ActionListener{
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        String get_name=new String();
        String get_sno=new String();
        String get_pno=new String();
        String get_jno=new String();
        String get_quantity=new String();
        get_name=Home.Name.getText();
        get_sno=Home.SNO.getText();
        get_pno=Home.PNO.getText();
        get_jno=Home.JNO.getText();
        get_quantity=Home.quantity.getText();
        int num_quantity=Integer.parseInt(get_quantity);
        if(num_quantity<)
        {
            JOptionPane.showMessageDialog(null, "你輸入的訂單數量小于1", "你輸入的訂單數量小于1", JOptionPane.ERROR_MESSAGE); 
        }
        try
        {
            Connection con=DriverManager.getConnection(Home.url,Home.user,Home.password);
            String str="DECLARE @retstat int;EXECUTE @retstat = PTransfer '"+get_name+"','"+get_sno+"','"+get_pno+"','"+get_jno+"',"+get_quantity;
//          System.out.println(str);
            CallableStatement stmt=con.prepareCall(str);// 執行SQL語句
            ResultSet rs=stmt.executeQuery();
        }
        catch(SQLException e1)
        {
            Home.Text_show.setText("執行成功");
//          e1.printStackTrace();
//          System.out.println("查詢出錯");
//          Home.Text_show.setText("查詢出錯");
//          System.exit(0);
        }
    }
}
           

這一部分就是單擊送出按鈕,要注意到為什麼我在catch裡面反而寫的執行成功呢,因為ResultSet rs=stmt.executeQuery();這一句運作了str那個存儲過程,但是那個存儲過程是并沒有傳回值的,JDBC就會直接在控制台給你報個沒有傳回列還是啥的,但是那句是運作了的,catch部分我就把它改了,通過你點選顯示訂單表那個按鈕發現是沒有任何問題的!因為已經運作了stmt.executeQuery();這個語句,這是一句查詢,查詢語句裡面是可以直接寫運作存儲過程語句的,sql server裡面不會報錯,因為他的查詢就有寫代碼的過程。而JDBC會報錯是因為他單純認為你在寫查詢語句,但是沒有查詢結果。

那幾個輸入框,最開始有文字,按一下就沒了的監聽是這麼寫的,第一個是接口(因為mouseListener好像是一堆抽象方法,是以全部都得碼上?我也不知怎麼可以簡化這段),後面的繼承就行了。

class Name_dataListener implements MouseListener{
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub
        Home.Name.setText("");
    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

}
class Sno_dataListener extends Name_dataListener{
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub
        Home.SNO.setText("");
    }
}
class Pno_dataListener extends Name_dataListener{
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub
        Home.PNO.setText("");
    }
}
class Jno_dataListener extends Name_dataListener{
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub
        Home.JNO.setText("");
    }
}
class Quantity_dataListener extends Name_dataListener{
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub
        Home.quantity.setText("");
    }
}
           

另外兩個顯示資料庫的内容的監聽

class function_dataListener implements ActionListener{
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        int function_data=Home.function.getSelectedIndex();
        switch(function_data)
        {
        case :
            Home.Text_show.setText("沒有使用任何功能");
            break;
        case :
            try
            {
                Connection con=DriverManager.getConnection(Home.url,Home.user,Home.password);
                String str="SELECT * From SP";
                Statement stmt=con.createStatement();// 執行SQL語句
                ResultSet rs=stmt.executeQuery(str);
                String str_sum="結果如下:\n";
                while(rs.next()){
                    String str1=new String();
                    str1=rs.getString("Sno")+rs.getString("Pno")+rs.getString("balance")+"\n";
                    str_sum=str_sum.concat(str1);   
                }
                Home.Text_show.setText(str_sum);
            }
            catch(SQLException e1)
            {
                e1.printStackTrace();
                System.out.println("查詢出錯");
                Home.Text_show.setText("查詢出錯");
                System.exit();
            }
            break;
        case :
            try
            {
                Connection con=DriverManager.getConnection(Home.url,Home.user,Home.password);
                String str="SELECT * From Orders";
                Statement stmt=con.createStatement();// 執行SQL語句
                ResultSet rs=stmt.executeQuery(str);
                String str_sum="結果如下:\n";
                while(rs.next()){
                    String str1=new String();
                    str1=rs.getString("Ono")+rs.getString("Sno")+rs.getString("Pno")+rs.getString("Jno")+rs.getString("Otime")+rs.getString("quantity")+"\n";
                    str_sum=str_sum.concat(str1);   
                }
                Home.Text_show.setText(str_sum);
            }
            catch(SQLException e1)
            {
                e1.printStackTrace();
                System.out.println("查詢出錯");
                Home.Text_show.setText("查詢出錯");
                System.exit();
            }
            break;
        }
    }
}
           

(為神馬以前沒有寶寶留言我沒有高亮呀!!!才改完剛剛的)

最後一個連接配接資料庫類的監聽

class Connect_dataListener implements ActionListener{

    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        try
        {
            Class.forName(Home.JDriver);//加載資料庫引擎,傳回給定字元串名的類
        }catch(ClassNotFoundException e1)
        {
            System.out.println("加載資料庫引擎失敗");
            System.exit();
        } 
//      System.out.println("資料庫驅動成功");
        Home.Text_show.setText("資料庫驅動成功");


        try
        {
            Connection con=DriverManager.getConnection(Home.url,Home.user,Home.password);//連接配接資料庫對象
//          System.out.println("連接配接資料庫成功");
            Home.Text_show.setText("連接配接資料庫成功");
        }
        catch(SQLException e1)
        {
            e1.printStackTrace();
            System.out.println("資料庫連接配接錯誤");
            System.exit();
        }

    }
}
           

最後就是一堆import,我就不列出來了,用到的包最先提到過,然後說重點!

本系統是有部分缺陷的。如果你正确輸入資料是沒任何問題(當然包括了你輸入資料本寶寶來檢驗對不對QAQ,但是并沒有完全驗證你亂輸入啥的,我都沒處理)

未處理或者不完美的地方,最重要的一點,是我太懶了,直接讓自己進資料庫了,本來應該有一個驗證的使用者和密碼,懶得弄就直接嵌入在裡面了。(而且不僅嵌入在連接配接資料庫那個按鈕,你還可以直接查詢那兩個表,因為裡面直接通過了密碼啥的qwq)

第二點是,我太懶了,SNO的範圍是S1到S5,PNO的範圍是P1到P6,JNO的範圍是J1到J7,本來我應該檢驗一下輸入的是否在範圍内,寫完才想起有這事,畢竟正常人不會瞎填,懶得改了QAQ。

第三點是,插入的資料數量還是不要超過庫存量,我可沒做超出判定,隻錯了大于0的判定,是以輸入可以先看供應商含量表再來填。

嗯嗯!累死我啦,而且我沒咋寫注釋!希望以後自己能看懂自己的菜雞代碼哈哈哈哈~