JAVA入门到精通-第71讲-学生管理系统3-增删改查

模式的概念(mv):
提高系统的可读性、可维护性、效率;
 ---------------------
添加、修改、删除
//添加的界面做好了
//对添加的按钮做个响应,直接操作数据库;
//完全可以满足添加的这个任务的

//重新获得数据模型,更新

//删除数据
JTable删除,最关键是拿到“学号“,唯一标识信息

//画个程序的结构图,写代码会容易点
程序框架图:
描述程序中的文件以及各个文件之间的关系
StuManage    主界面
StuModel       数据模型
StuAddDialog添加学生界面
-查询,中间借助了StuModel,有互相使用关系
-删除,在主界面产生
-删除:拿到拿到ID:这一行的第一列
//getSelectedRow() 会返回用户点中的行
//如果该用户一行都没选择,会返回-1;

//消息框
this-在这个窗口跳出的
JOptionPane.showMessageDialog(this,  xxx);
return:返回主调函数的下一行;
谁调用就返回给谁

不是-1,得到学生编号:

//学生模型对象StuModel是作为局部变量的,不够合理
存在内存泄露的问题;

多个sm,用完并没有关闭,前面那个用完之后
虽然没有用了,但仍然会有引用指向它;

内存泄露:
如果一个数据对象有一个引用指向它,
但你在程序当中又没有用它,(查询完的sm)
这样的话,垃圾回收机制是回收不了这个对象的;
成为一个内存泄露;

查询完的sm指向堆区,
但是主栈的sm没有回收,始终指向堆区;
垃圾回收机制认为主栈里面还有一个引用
指向堆区的;实际上已经没有用;
这就,内存泄露了。

本身就是很危险的;
----------------
解决方法:把数据模型做成成员变量;

始终这个栈区指向只有一个sm
只是根据数据库的查询不停地更新;


强转为string



//连接数据库,完成删除任务



-修改Update:
StuUpdDialog
能让用户输入新的数据;
-StuUpdDialog

-数据应该是从主界面传过来的

引用传递,把模型StuModel sm,
和行数据rowNums传过来;

直接从模型里面传过来就行;
耦合性越高,代码越烂,
尽可能通过引用传递、来传递数据;

//修改数据

局部变量“就近原则”
ClassCastException 类型转换出错:
这里不允许把Integer强制转化为String

toString进行转换

//让jtff1不能修改
jtf1.setEditable(false);


[StuUpdDialog.java]源码

 
1
/**
2
 * 修改学生信息
3
 */
4
package com.student1;
5
 
6
import java.awt.BorderLayout;
7
import java.awt.Frame;
8
import java.awt.GridLayout;
9
import java.awt.event.ActionEvent;
10
import java.awt.event.ActionListener;
11
import java.sql.Connection;
12
import java.sql.DriverManager;
13
import java.sql.PreparedStatement;
14
import java.sql.ResultSet;
15
import java.sql.SQLException;
16
import java.sql.Statement;
17
import javax.swing.JButton;
18
import javax.swing.JDialog;
19
import javax.swing.JLabel;
20
import javax.swing.JPanel;
21
import javax.swing.JTextField;
22
 
23
public class StuUpdDialog extends JDialog implements ActionListener{
24
    //定义我需要的swing组件
25
    JLabel jl1,jl2,jl3,jl4,jl5,jl6;
26
    JButton jb1,jb2;
27
    JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;
28
    JPanel jp1,jp2,jp3;
29
   
30
    //owner它的父窗口;title窗口名;model指定是模态窗口,还是非模态
31
    public StuUpdDialog(Frame owner,String title,boolean modal,StuModel sm,int rowNum){
32
        super(owner,title,modal);//调用父类构造方法,达到模式对话框效果
33
        jl1=new JLabel("学号");
34
        jl2=new JLabel("名字");
35
        jl3=new JLabel("性别");
36
        jl4=new JLabel("年龄");
37
        jl5=new JLabel("籍贯");
38
        jl6=new JLabel("系别");
39
       
40
        jtf1=new JTextField();
41
        //初始化数据
42
        jtf1.setText((String)sm.getValueAt(rowNum, 0));
43
        //让jtf1不能修改
44
        jtf1.setEditable(false);
45
        jtf2=new JTextField();
46
        jtf2.setText((String)sm.getValueAt(rowNum, 1));
47
        jtf3=new JTextField();
48
        jtf3.setText((String)sm.getValueAt(rowNum, 2));
49
        jtf4=new JTextField();
50
        jtf4.setText(sm.getValueAt(rowNum, 3).toString());
51
        jtf5=new JTextField();
52
        jtf5.setText((String)sm.getValueAt(rowNum, 4));
53
        jtf6=new JTextField();
54
        jtf6.setText((String)sm.getValueAt(rowNum, 5));
55
       
56
        jb1=new JButton("修改");
57
        jb2=new JButton("取消");
58
       
59
        jp1=new JPanel();
60
        jp2=new JPanel();
61
        jp3=new JPanel();
62
       
63
        //设置布局
64
        jp1.setLayout(new GridLayout(6,1));
65
        jp2.setLayout(new GridLayout(6,1));
66
       
67
        //添加组件
68
        jp1.add(jl1);
69
        jp1.add(jl2);
70
        jp1.add(jl3);
71
        jp1.add(jl4);
72
        jp1.add(jl5);
73
        jp1.add(jl6);
74
       
75
        jp2.add(jtf1);
76
        jp2.add(jtf2);
77
        jp2.add(jtf3);
78
        jp2.add(jtf4);
79
        jp2.add(jtf5);
80
        jp2.add(jtf6);
81
       
82
        jp3.add(jb1);
83
        jp3.add(jb2);
84
       
85
        this.add(jp1,BorderLayout.WEST);
86
        this.add(jp2,BorderLayout.CENTER);
87
        this.add(jp3,BorderLayout.SOUTH);
88
       
89
        jb1.addActionListener(this);
90
        jb2.addActionListener(this);
91
       
92
        //展现
93
        this.setSize(300, 250);
94
        this.setVisible(true);
95
    }
96
 
97
    public void actionPerformed(ActionEvent e) {
98
        //用户点击添加按钮后的响应动作
99
        if(e.getSource()==jb1){
100
            //连接数据库
101
            Connection ct=null;
102
            Statement stmt=null;
103
            ResultSet rs=null;
104
            PreparedStatement ps=null;
105
            //连接数据库
106
            try {
107
                //1、加载驱动
108
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
109
                //2、得到连接
110
                  ct=DriverManager.getConnection
111
                       ("jdbc:sqlserver://127.0.0.1:1433;
112
                        databaseName=stussystem;user=sa;password=sa;");
113
               
114
                String strsql="update stu set stuName=?,stuSex=?,stuAge=?,
115
                        stuJg=?,stuDept=? where stuId=?";
116
                ps=ct.prepareStatement(strsql);
117
                ps.setString(1,jtf2.getText());
118
                ps.setString(2,jtf3.getText());
119
                ps.setInt(3,Integer.parseInt(jtf4.getText()));
120
                ps.setString(4,jtf5.getText());
121
                ps.setString(5,jtf6.getText());
122
                ps.setString(6, jtf1.getText());
123
                ps.executeUpdate();
124
                this.dispose();
125
            } catch (Exception e2) {
126
                e2.printStackTrace();
127
            }finally{
128
                try {
129
                    if(ps!=null){
130
                        ps.close();
131
                    }
132
                    if(ct!=null){
133
                        ct.close();
134
                    }
135
                } catch (SQLException e1) {
136
                    e1.printStackTrace();
137
                }
138
            }
139
        }
140
        else if(e.getSource()==jb2){
141
            this.dispose();
142
        }
143
    }
144
}
145
 





原文地址:https://www.cnblogs.com/xuxaut-558/p/10045808.html