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.getConnection111
("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





浙公网安备 33010602011771号