JAVA入门到精通-第70讲-学生管理系统2-增删改
-完成一个mini版本学生管理系统
jude软件:很好使的,安装一下就可以用了;

-学生管理系统的添加 、修改、删除、上下页分页

----------------------------------------------

上面是一个流布局,JPanel
下面是一个流布局,JPanel
中间是Border布局,边界布局,CENTER

JTextField jtf;
先加JLable--->Jtf文本域->JButton按钮



-------------------------
mis 系统:信息管理系统;
-模糊查询还是精确匹配?

查询-按钮响应-监听:
ActionListener
注册监听器:

//判断是哪个按钮被点击
响应函数:

也可以这样做:
局限性是响应函数
actionPerformed和jb1在同一个类里面;
至少能访问到jb1;

Connectionpool这样的技术不需要重新连接;
JDBC需要重新连接数据库;
------------------------------------------
-可不可以对数据库的操作单写一个类,
当我们需要数据库的操作的时候,去new出一个实例

1.想办法把对表的操作封装成一个类:
这个类可以完成对表的操作;
-抽象表模型:

-setModel
如果不用这个方法的话,数据不更新,
查询完以后,更新数据,会发现原来的数据还在那,又添加了一条数据;
会变得越来越多;

-TableModel类
StuModel可以当成一个表来使用了;
-AbstractTableModel



--------------------------------------------
-把对数据库的操作放在AbstractTableModel
-数据模型就是表;
-数据库的操作放在构造函数-public StuModel( )

-初始化的代码放在StuModel ( )里面,代码封装在StuModel
这个类里面去了;


后面需要取数据,直接从这个模型类里面拿就行了;




rowData是一个向量;
row行,column列;
会自动调用;

@override
重写方法-更改列名-Override-getColumnName



【把对数据库的操作做成一个模型】
---------------------------------------------
-如何取数据?
1.创建一个数据模型对象
StuModel sm=new StuModel();
-查询数据库变得简单方便了:
现在只要能够拿到用户的关键字,
然后把一个SQL语句传到
StuModel里面去,再更新一下就可以了;

String name=this.jtf.getText().trim(); //trim把空的字符串过滤一下

//通过传递的sql语句来获得数据模型

//构建新的数据类型 ,并更新
setModel() 会 自动更新数据;



查询:



在init()函数里面做个小小的配置:


-------------------------
-添加、修改:
这个类显示添加学生信息的对话框:
StuAddDialog继承类:
Browse可以直接让它继承:继承JDialog


extends JDialog

//owner它的父窗口
//title窗口名
//modal模态窗口还是非模态的

modal-这个窗口打开后,是否允许点击其他窗口页面;

--------------------------
-添加按钮

-对按钮响应:


false 窗口可以任意的移动;true必须对窗口响应;
------------------
-把添加的一些列动作,封装到addStu里面去

-添加完过后,需要重新再获得新的数据模型

//删除、修改依次类推;

=================================
-把对一个表的操作封装到数据模型里;
Mini学生管理系统

[JTable_Test3.java]源码
180
1
/**2
* 完成一个mini版本的学生管理系统(MODEL1模式)3
* 1、查询任务4
* 2、添加功能5
* 3、使用的是sql server2012,数据库驱动与连接与视频教程中的sql server2000连接* 有所不同6
*/7
package com.student1;8
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.util.Vector;17
import javax.swing.*;18
import javax.swing.table.AbstractTableModel;19
20
public class JTable_Test3 extends JFrame implements ActionListener{21
//定义组件22
JPanel jp1,jp2;23
JLabel jl1;24
JButton jb1,jb2,jb3,jb4;25
JTable jt;26
JScrollPane jsp;27
JTextField jtf;28
StuModel sm;29
30
//定义操作数据库需要的组件31
PreparedStatement ps=null;32
Connection ct=null;33
ResultSet rs=null; 34
35
public static void main(String[] args) {36
try {37
// 将当前窗体外观设置为所在操作系统的外观38
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());39
} catch (ClassNotFoundException e) {40
e.printStackTrace();41
} catch (InstantiationException e) {42
e.printStackTrace();43
} catch (IllegalAccessException e) {44
e.printStackTrace();45
} catch (UnsupportedLookAndFeelException e) {46
e.printStackTrace();47
}48
new JTable_Test3();49
}50
51
//构造函数52
public JTable_Test3(){53
jp1=new JPanel();54
jtf=new JTextField(10);55
jb1=new JButton("查询");56
jb1.addActionListener(this);57
jl1=new JLabel("请输入名字");58
59
//把各个空间加入列60
jp1.add(jl1);61
jp1.add(jtf);62
jp1.add(jb1);63
64
jp2=new JPanel();65
jb2=new JButton("添加");66
jb2.addActionListener(this);67
jb3=new JButton("修改");68
jb3.addActionListener(this);69
jb4=new JButton("删除");70
jb4.addActionListener(this);71
72
//把各个按钮加入到jp2中73
jp2.add(jb2);74
jp2.add(jb3);75
jp2.add(jb4);76
77
//创建一个数据模型对象78
sm=new StuModel();79
80
//初始化JTable81
jt=new JTable(sm);82
83
//初始化jsp JScrollPane84
jsp=new JScrollPane(jt);85
86
//把jsp放入到jframe87
this.add(jsp);88
this.add(jp1,"North");89
this.add(jp2,"South");90
91
this.setSize(400, 300);92
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);93
this.setVisible(true);94
}95
96
@Override97
public void actionPerformed(ActionEvent e) {98
if(e.getSource()==jb1){99
//因为把对表的数据封装到StuModel中,我们就可以比较简单的完成查询100
String name=this.jtf.getText();101
//写一个SQL语句102
String sql="select * from stu where stuName='"+name+"'";103
//构建新的数据模型类,并更新104
sm=new StuModel(sql);105
//更新JTable106
jt.setModel(sm);107
}108
//用户点击添加时109
else if(e.getSource()==jb2){110
StuAddDialog sa=new StuAddDialog(this, "添加学生", true);111
//重新再获得新的数据模型112
//构建新的数据模型类,并更新113
sm=new StuModel();114
//更新JTable115
jt.setModel(sm);116
}117
//用户修改数据118
else if(e.getSource()==jb3){119
int rowNum=this.jt.getSelectedRow();120
if(rowNum==-1){121
//提示122
JOptionPane.showMessageDialog(this, "请选择一行", "提示", JOptionPane.INFORMATION_MESSAGE);123
return;124
}125
126
//显示修改对话框127
new StuUpdDialog(this,"修改学生信息",true,sm,rowNum);128
129
//更新数据模型130
sm=new StuModel();131
//更新JTable132
jt.setModel(sm);133
}134
135
//用户点击删除时,删除一条选中的数据136
else if(e.getSource()==jb4){137
//1、得到学生的ID号138
//getSelectedRow会返回用户点中的行139
//如果该用户一行都没有选择,就会返回-1140
int rowNum=this.jt.getSelectedRow();141
if(rowNum==-1){142
//提示143
JOptionPane.showMessageDialog(this, "请选择一行", "提示", JOptionPane.INFORMATION_MESSAGE);144
return;145
}146
//得到学生编号147
String stuId=(String)sm.getValueAt(rowNum, 0);148
//连接数据库,完成删除任务149
try {150
//1、加载驱动151
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");152
//2、得到连接153
ct=DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;databaseName=stussystem;user=sa;password=sa;");154
ps=ct.prepareStatement("delete from stu where stuid=?");155
ps.setString(1, stuId);156
ps.executeUpdate();157
} catch (Exception e2) {158
e2.printStackTrace();159
}finally{160
try {161
if(rs!=null){162
rs.close();163
}164
if(ps!=null){165
ps.close();166
}167
if(ct!=null){168
ct.close();169
}170
} catch (SQLException e1) {171
e1.printStackTrace();172
}173
}174
//更新数据模型175
sm=new StuModel();176
//更新JTable177
jt.setModel(sm);178
}179
}180
}*******************************************************************************
[StuModel.java]源码
108
1
/**2
* 这是一个stu表的模型3
* 可以把对student表的各种操作封装到该模型中4
*/5
package com.student1;6
7
import java.sql.Connection;8
import java.sql.DriverManager;9
import java.sql.PreparedStatement;10
import java.sql.ResultSet;11
import java.sql.SQLException;12
import java.util.Vector;13
import javax.swing.table.AbstractTableModel;14
15
public class StuModel extends AbstractTableModel{16
//rowData用来存放行数据、columnNames存放列名17
Vector rowData,columnNames;18
//定义操作数据库需要的组件19
PreparedStatement ps=null;20
Connection ct=null;21
ResultSet rs=null; 22
23
public void init(String sql){24
if(sql==""||sql.equals(null)){25
sql="select * from stu";26
}27
//中间28
columnNames=new Vector<>();29
//设置列名30
columnNames.add("学号");31
columnNames.add("名字");32
columnNames.add("性别");33
columnNames.add("年龄");34
columnNames.add("籍贯");35
columnNames.add("系别");36
37
rowData=new Vector<>();38
//rowData可以存放多行39
try {40
//1、加载驱动41
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");42
//2、得到连接43
ct=DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;databaseName=stussystem;user=sa;password=sa;");44
45
ps=ct.prepareStatement(sql);46
rs=ps.executeQuery();47
48
while(rs.next()){49
Vector hang=new Vector();50
hang.add(rs.getString(1));51
hang.add(rs.getString(2));52
hang.add(rs.getString(3));53
hang.add(rs.getInt(4));54
hang.add(rs.getString(5));55
hang.add(rs.getString(6));56
//加入rowData57
rowData.add(hang);58
}59
} catch (Exception e) {60
e.printStackTrace();61
}finally{62
try {63
if(rs!=null){64
rs.close();65
}66
if(ps!=null){67
ps.close();68
}69
if(ct!=null){70
ct.close();71
}72
} catch (SQLException e) {73
// TODO Auto-generated catch block74
e.printStackTrace();75
}76
}77
}78
79
//构造函数,用于初始我们的数据模型80
public StuModel(String sql){81
this.init(sql);82
}83
84
//构造函数85
public StuModel(){86
this.init("");87
}88
89
//得到共有多少列90
public int getColumnCount() {91
return this.columnNames.size();92
}93
94
public String getColumnName(int column) {95
return (String)this.columnNames.get(column);96
}97
98
//得到共有多少行99
public int getRowCount() {100
return this.rowData.size();101
}102
103
//得到某行某列的数据104
public Object getValueAt(int rowIndex, int columnIndex) {105
return ((Vector)this.rowData.get(rowIndex)).get(columnIndex);106
}107
}108
********************************************************************
[StuAddDialog.java]源码
154
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.JOptionPane;21
import javax.swing.JPanel;22
import javax.swing.JTextField;23
24
public class StuAddDialog extends JDialog implements ActionListener{25
//定义我需要的swing组件26
JLabel jl1,jl2,jl3,jl4,jl5,jl6;27
JButton jb1,jb2;28
JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;29
JPanel jp1,jp2,jp3;30
31
//owner它的父窗口;title窗口名;model指定是模态窗口,还是非模态32
public StuAddDialog(Frame owner,String title,boolean modal){33
super(owner,title,modal);//调用父类构造方法,达到模式对话框效果34
jl1=new JLabel("学号");35
jl2=new JLabel("名字");36
jl3=new JLabel("性别");37
jl4=new JLabel("年龄");38
jl5=new JLabel("籍贯");39
jl6=new JLabel("系别");40
41
jtf1=new JTextField();42
jtf2=new JTextField();43
jtf3=new JTextField();44
jtf4=new JTextField();45
jtf5=new JTextField();46
jtf6=new JTextField();47
48
jb1=new JButton("添加");49
jb2=new JButton("取消");50
51
jp1=new JPanel();52
jp2=new JPanel();53
jp3=new JPanel();54
55
//设置布局56
jp1.setLayout(new GridLayout(6,1));57
jp2.setLayout(new GridLayout(6,1));58
59
//添加组件60
jp1.add(jl1);61
jp1.add(jl2);62
jp1.add(jl3);63
jp1.add(jl4);64
jp1.add(jl5);65
jp1.add(jl6);66
67
jp2.add(jtf1);68
jp2.add(jtf2);69
jp2.add(jtf3);70
jp2.add(jtf4);71
jp2.add(jtf5);72
jp2.add(jtf6);73
74
jp3.add(jb1);75
jp3.add(jb2);76
77
this.add(jp1,BorderLayout.WEST);78
this.add(jp2,BorderLayout.CENTER);79
this.add(jp3,BorderLayout.SOUTH);80
81
jb1.addActionListener(this);82
jb2.addActionListener(this);83
84
//展现85
this.setSize(300, 250);86
this.setVisible(true);87
}88
89
@Override90
public void actionPerformed(ActionEvent e) {91
//用户点击添加按钮后的响应动作92
if(e.getSource()==jb1){93
//连接数据库94
Connection ct=null;95
Statement stmt=null;96
ResultSet rs=null;97
PreparedStatement ps=null;98
//连接数据库99
try {100
//1、加载驱动101
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");102
//2、得到连接103
ct=DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;databaseName=stussystem;user=sa;password=sa;");104
String strsql="insert into stu values(?,?,?,?,?,?)";105
ps=ct.prepareStatement(strsql);106
ps.setString(1,jtf1.getText());107
ps.setString(2,jtf2.getText());108
ps.setString(3,jtf3.getText());109
ps.setInt(4,Integer.parseInt(jtf4.getText()));110
ps.setString(5,jtf5.getText());111
ps.setString(6,jtf6.getText());112
ps.executeUpdate();113
this.dispose();114
} catch (Exception e2) {115
e2.printStackTrace();116
}finally{117
try {118
if(ps!=null){119
ps.close();120
}121
if(ct!=null){122
ct.close();123
}124
} catch (SQLException e1) {125
e1.printStackTrace();126
}127
}128
}129
else if(e.getSource()==jb2){130
this.dispose();131
}132
}133
}134


浙公网安备 33010602011771号