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