使用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的判定,所以输入可以先看供应商含量表再来填。
嗯嗯!累死我啦,而且我没咋写注释!希望以后自己能看懂自己的菜鸡代码哈哈哈哈~
- 使用Java通过sql server做出的第一个订单系统(+心路历程)
- Magento通过订单id修改订单创建时间的sql
- sql server的20个系统变量
- sql server的20个系统变量
- Java第一个系统
- 终于做出第一个开除人的决定了
- 通过SQL 2005 系统表监控 SQL Server 的运行状况
- 通过SQL 2005 系统表监控 SQL Server 的运行状况
- SAP/R3系统通过收货直接创建订单的方法
- SQL Server通过系统表查询对象
- 通过bdc批量创建销售订单(多个销售订单)
- 第一个linux系统下的java程序
- 我的第一个项目----Java图书管理系统
- java订单系统原型
- java 通过jdbc连接sql server数据库的常见问题
- Java程序通过JDBC连接远程的数据库SQL Server
- Coalesce (MS SQL Server)——取指定内容(列)中第一个不为空的值
- 分贝通第一个功能-查询消息列表包括订单/消费/审批/系统等消息
- Kotlin 第二站
- 利用三元组求稀疏矩阵的加、减、逆置(c语言)
- JTAG的SWD接线方式
- 实验三、顺序栈和链栈
- mysql语句
- 使用Java通过sql server做出的第一个订单系统(+心路历程)
- Win10下OpenCV3.2.0+VS2015配置
- tomcat学习之二:tomcat的结构
- msyql中cast()与convert()的区别
- 关于用户注册界面测试用例总结
- python自动订餐小程序
- MySql多表联查
- 数组名作为函数参数例子(C语言)
- java初入多线程11