先放截图!
功能如下:在客户端提供信息,客户端提交后,在数据库里面进行存储过程的调用,改变订单表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的判定,所以输入可以先看供应商含量表再来填。
嗯嗯!累死我啦,而且我没咋写注释!希望以后自己能看懂自己的菜鸡代码哈哈哈哈~