使用Java通过sql server做出的第一个订单系统(+心路历程)

来源:互联网 发布:vasp 5.3.5 软件下载 编辑:程序博客网 时间:2024/05/20 06:31

先放截图!
主界面

点击连接数据库后

选择供应商含量表

选择显示订单表

写入数据提交后

再次查阅订单

功能如下:在客户端提供信息,客户端提交后,在数据库里面进行存储过程的调用,改变订单表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(5,5));//设置布局为相对布局        frame.pack();//frame.pack确定frame的最佳大小        frame.setBounds(450, 200, 420, 300);//设置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(5, 2));        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(3, 3));        panel_left.add(function,BorderLayout.NORTH);        frame.setVisible(true);//设置图形界面为可见        return 0;    }    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<0)        {            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 0:            Home.Text_show.setText("没有使用任何功能");            break;        case 1:            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(0);            }            break;        case 2:            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(0);            }            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(0);        } //      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(0);        }    }}

最后就是一堆import,我就不列出来了,用到的包最先提到过,然后说重点!
本系统是有部分缺陷的。如果你正确输入数据是没任何问题(当然包括了你输入数据本宝宝来检验对不对QAQ,但是并没有完全验证你乱输入啥的,我都没处理)
未处理或者不完美的地方,最重要的一点,是我太懒了,直接让自己进数据库了,本来应该有一个验证的用户和密码,懒得弄就直接嵌入在里面了。(而且不仅嵌入在连接数据库那个按钮,你还可以直接查询那两个表,因为里面直接通过了密码啥的qwq)
第二点是,我太懒了,SNO的范围是S1到S5,PNO的范围是P1到P6,JNO的范围是J1到J7,本来我应该检验一下输入的是否在范围内,写完才想起有这事,毕竟正常人不会瞎填,懒得改了QAQ。
第三点是,插入的数据数量还是不要超过库存量,我可没做超出判定,只错了大于0的判定,所以输入可以先看供应商含量表再来填。
嗯嗯!累死我啦,而且我没咋写注释!希望以后自己能看懂自己的菜鸡代码哈哈哈哈~

原创粉丝点击