先放截圖!
功能如下:在用戶端提供資訊,用戶端送出後,在資料庫裡面進行存儲過程的調用,改變訂單表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的判定,是以輸入可以先看供應商含量表再來填。
嗯嗯!累死我啦,而且我沒咋寫注釋!希望以後自己能看懂自己的菜雞代碼哈哈哈哈~