JAVA入门到精通-第72讲-学生管理系统4-model 2模式(1)

删除、查询、添加、修改:
-修改:

每个字段都可能修改:


//给?赋值

//在prepareStatement语句后面赋值才好用

//修改完了,更新数据





目前为止,已经完成了增删改查-Model1模式
最大特点:
界面和业务逻辑操作是放在一起的;
优点:简单,开发方便;
缺点:代码复用性不高;
中大型项目可读性差,可维护性不高;
前台后端混杂在一起的;
比如:“数据库密码换了,
所有涉及到数据库的地方都需要发生变化”
=================================
=================================
Model2模式:界面和操作分离
思想是最重要的;

数据库的操作全部交给StuModel处理;
对数据库的维护比较方便,比如数据库的密码,地址变化了,
就改动数据模型StuModel就可以了;
-简单的model2模式
界面(view)和模型(model/后台/业务逻辑层)
最大特点:界面和后台操作是分离的;
优点:代码复用性好、可读性高、可维护性好;
缺点:相对来说比较复杂;
默认是添加成功的

可以把数据库的地址、用户名、密码作为成员变量,
传参数进去,这样方便日后的修改;
以后更换数据库比较方便;
可以通过字符串数组String []paras 方式把参数传进来


i+1,传进来的参数是从0开始编号的;


//弹出消息框JOptionPane.showMessageDialog(this,"添加失败");
//关闭对话框
this.dispose();
---------------------
-删除,把增删改全部写在“添加学生”模块
-public boolean updStu
156
156
1
/**2
* 完成一个mini版本的学生管理系统(MODEL2模式)3
* 1、查询任务4
* 2、添加功能5
*/6
package com.student2;7
8
import java.awt.event.ActionEvent;9
import java.awt.event.ActionListener;10
import java.sql.Connection;11
import java.sql.DriverManager;12
import java.sql.PreparedStatement;13
import java.sql.ResultSet;14
import java.sql.SQLException;15
import java.util.Vector;16
import javax.swing.*;17
import javax.swing.table.AbstractTableModel;18
19
public class JTable_Test3 extends JFrame implements ActionListener{20
//定义组件21
JPanel jp1,jp2;22
JLabel jl1;23
JButton jb1,jb2,jb3,jb4;24
JTable jt;25
JScrollPane jsp;26
JTextField jtf;27
StuModel sm;28
29
public static void main(String[] args) {30
try {31
// 将当前窗体外观设置为所在操作系统的外观32
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());33
} catch (ClassNotFoundException e) {34
e.printStackTrace();35
} catch (InstantiationException e) {36
e.printStackTrace();37
} catch (IllegalAccessException e) {38
e.printStackTrace();39
} catch (UnsupportedLookAndFeelException e) {40
e.printStackTrace();41
}42
new JTable_Test3();43
}44
45
//构造函数46
public JTable_Test3(){47
jp1=new JPanel();48
jtf=new JTextField(10);49
jb1=new JButton("查询");50
jb1.addActionListener(this);51
jl1=new JLabel("请输入名字");52
53
//把各个空间加入列54
jp1.add(jl1);55
jp1.add(jtf);56
jp1.add(jb1);57
jp2=new JPanel();58
jb2=new JButton("添加");59
jb2.addActionListener(this);60
jb3=new JButton("修改");61
jb3.addActionListener(this);62
jb4=new JButton("删除");63
jb4.addActionListener(this);64
65
//把各个按钮加入到jp2中66
jp2.add(jb2);67
jp2.add(jb3);68
jp2.add(jb4);69
70
//创建一个数据模型对象71
sm=new StuModel();72
73
//初始化JTable74
jt=new JTable(sm);75
76
//初始化jsp JScrollPane77
jsp=new JScrollPane(jt);78
79
//把jsp放入到jframe80
this.add(jsp);81
this.add(jp1,"North");82
this.add(jp2,"South");83
84
this.setSize(400, 300);85
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);86
this.setVisible(true);87
}88
89
public void actionPerformed(ActionEvent e) {90
if(e.getSource()==jb1){91
//因为把对表的数据封装到StuModel中,我们就可以比较简单的完成查询92
String name=this.jtf.getText();93
//写一个SQL语句94
String sql="select * from stu where stuName='"+name+"'";95
//构建新的数据模型类,并更新96
sm=new StuModel(sql);97
//更新JTable98
jt.setModel(sm);99
}100
//用户点击添加时101
else if(e.getSource()==jb2){102
StuAddDialog sa=new StuAddDialog(this, "添加学生", true);103
//重新再获得新的数据模型104
//构建新的数据模型类,并更新105
sm=new StuModel();106
//更新JTable107
jt.setModel(sm);108
}109
//用户修改数据110
else if(e.getSource()==jb3){111
int rowNum=this.jt.getSelectedRow();112
if(rowNum==-1){113
//提示114
JOptionPane.showMessageDialog(this, "请选择一行", "提示", JOptionPane.INFORMATION_MESSAGE);115
return;116
}117
118
//显示修改对话框119
new StuUpdDialog(this,"修改学生信息",true,sm,rowNum);120
121
//更新数据模型122
sm=new StuModel();123
//更新JTable124
jt.setModel(sm);125
}126
127
//用户点击删除时,删除一条选中的数据128
else if(e.getSource()==jb4){129
//1、得到学生的ID号130
//getSelectedRow会返回用户点中的行131
//如果该用户一行都没有选择,就会返回-1132
int rowNum=this.jt.getSelectedRow();133
if(rowNum==-1){134
//提示135
JOptionPane.showMessageDialog(this, "请选择一行", "提示", JOptionPane.INFORMATION_MESSAGE);136
return;137
}138
//得到学生编号139
String stuId=(String)sm.getValueAt(rowNum, 0);140
//创建一个sql语句141
String sql="delete from stu where stuid=?";142
String []paras={stuId};143
StuModel temp=new StuModel();144
if(temp.updStu(sql, paras)){145
JOptionPane.showMessageDialog(this,"删除数据成功","删除数据提示",JOptionPane.INFORMATION_MESSAGE);146
}else{147
JOptionPane.showMessageDialog(this,"删除数据失败","删除数据提示",JOptionPane.ERROR_MESSAGE);148
}149
150
//更新数据模型151
sm=new StuModel();152
//更新JTable153
jt.setModel(sm);154
}155
}156
}*******************************************************************[StuModel.java]源码
152
152
1
/**2
* 这是一个stu表的模型3
* 可以把对student表的各种操作封装到该模型中4
*/5
package com.student2;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.JOptionPane;14
import javax.swing.table.AbstractTableModel;15
16
public class StuModel extends AbstractTableModel{17
//rowData用来存放行数据、columnNames存放列名18
Vector rowData,columnNames;19
//定义操作数据库需要的组件20
PreparedStatement ps=null;21
Connection ct=null;22
ResultSet rs=null; 23
String sqlDriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";24
String url="jdbc:sqlserver://127.0.0.1:1433;databaseName=stussystem;user=sa;password=sa;";25
26
//添加学生(增、删、改)27
public boolean updStu(String sql,String []paras){28
boolean b=true;29
try {30
//1、加载驱动31
Class.forName(sqlDriver);32
//2、得到连接33
ct=DriverManager.getConnection(url);34
//3、创建ps35
ps=ct.prepareStatement(sql);36
//给ps的问号赋值37
for(int i=0;i<paras.length;i++){38
ps.setString(i+1, paras[i]);39
}40
41
//4、执行操作42
if(ps.executeUpdate()!=1){43
b=false;44
}45
46
} catch (Exception e) {47
b=false;48
JOptionPane.showMessageDialog(null, "数据源错误或数据库用户名、密码错误", "数据库连接错误提示", JOptionPane.ERROR_MESSAGE);49
e.printStackTrace();50
}finally{51
try {52
if(rs!=null){53
rs.close();54
}55
if(ps!=null){56
ps.close();57
}58
if(ct!=null){59
ct.close();60
}61
} catch (SQLException e1) {62
e1.printStackTrace();63
}64
}65
return b;66
}67
68
public void init(String sql){69
if(sql==""||sql.equals(null)){70
sql="select * from stu";71
}72
//中间73
columnNames=new Vector<>();74
//设置列名75
columnNames.add("学号");76
columnNames.add("名字");77
columnNames.add("性别");78
columnNames.add("年龄");79
columnNames.add("籍贯");80
columnNames.add("系别");81
82
rowData=new Vector<>();83
//rowData可以存放多行84
try {85
//1、加载驱动86
Class.forName(sqlDriver);87
//2、得到连接88
ct=DriverManager.getConnection(url);89
90
ps=ct.prepareStatement(sql);91
rs=ps.executeQuery();92
93
while(rs.next()){94
Vector hang=new Vector();95
hang.add(rs.getString(1));96
hang.add(rs.getString(2));97
hang.add(rs.getString(3));98
hang.add(rs.getInt(4));99
hang.add(rs.getString(5));100
hang.add(rs.getString(6));101
//加入rowData102
rowData.add(hang);103
}104
} catch (Exception e) {105
e.printStackTrace();106
}finally{107
try {108
if(rs!=null){109
rs.close();110
}111
if(ps!=null){112
ps.close();113
}114
if(ct!=null){115
ct.close();116
}117
} catch (SQLException e) {118
// TODO Auto-generated catch block119
e.printStackTrace();120
}121
}122
}123
124
//构造函数,用于初始我们的数据模型125
public StuModel(String sql){126
this.init(sql);127
}128
129
//构造函数130
public StuModel(){131
this.init("");132
}133
134
//得到共有多少列135
public int getColumnCount() {136
return this.columnNames.size();137
}138
139
public String getColumnName(int column) {140
return (String)this.columnNames.get(column);141
}142
143
//得到共有多少行144
public int getRowCount() {145
return this.rowData.size();146
}147
148
//得到某行某列的数据149
public Object getValueAt(int rowIndex, int columnIndex) {150
return ((Vector)this.rowData.get(rowIndex)).get(columnIndex);151
}152
}*******************************************************************************
[StuAddDialog.java]源码
106
106
1
/**2
* 添加数据3
*/4
package com.student2;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
jb1.addActionListener(this);81
jb2.addActionListener(this);82
83
//展现84
this.setSize(300, 250);85
this.setVisible(true);86
}87
88
public void actionPerformed(ActionEvent e) {89
//用户点击添加按钮后的响应动作90
if(e.getSource()==jb1){91
StuModel temp=new StuModel();92
String sql="insert into stu values(?,?,?,?,?,?)";93
String []paras={jtf1.getText(),jtf2.getText(),jtf3.getText(),jtf4.getText(),jtf5.getText(),jtf6.getText()};94
if(!temp.updStu(sql, paras)){95
JOptionPane.showMessageDialog(this, "添加数据失败", "添加数据提示", JOptionPane.ERROR_MESSAGE);96
}else{97
JOptionPane.showMessageDialog(this,"添加数据成功","添加数据提示",JOptionPane.INFORMATION_MESSAGE);98
}99
//关闭对话框100
this.dispose();101
}102
else if(e.getSource()==jb2){103
this.dispose();104
}105
}106
}******************************************************************
[StuUpdDialog.java]源码
x
118
1
/**2
* 修改学生信息3
*/4
package com.student2;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 StuUpdDialog 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 StuUpdDialog(Frame owner,String title,boolean modal,StuModel sm,int rowNum){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
//初始化数据43
jtf1.setText((String)sm.getValueAt(rowNum, 0));44
//让jtf1不能修改45
jtf1.setEditable(false);46
jtf2=new JTextField();47
jtf2.setText((String)sm.getValueAt(rowNum, 1));48
jtf3=new JTextField();49
jtf3.setText((String)sm.getValueAt(rowNum, 2));50
jtf4=new JTextField();51
jtf4.setText(sm.getValueAt(rowNum, 3).toString());52
jtf5=new JTextField();53
jtf5.setText((String)sm.getValueAt(rowNum, 4));54
jtf6=new JTextField();55
jtf6.setText((String)sm.getValueAt(rowNum, 5));56
57
jb1=new JButton("修改");58
jb2=new JButton("取消");59
60
jp1=new JPanel();61
jp2=new JPanel();62
jp3=new JPanel();63
64
//设置布局65
jp1.setLayout(new GridLayout(6,1));66
jp2.setLayout(new GridLayout(6,1));67
68
//添加组件69
jp1.add(jl1);70
jp1.add(jl2);71
jp1.add(jl3);72
jp1.add(jl4);73
jp1.add(jl5);74
jp1.add(jl6);75
76
jp2.add(jtf1);77
jp2.add(jtf2);78
jp2.add(jtf3);79
jp2.add(jtf4);80
jp2.add(jtf5);81
jp2.add(jtf6);82
83
jp3.add(jb1);84
jp3.add(jb2);85
86
this.add(jp1,BorderLayout.WEST);87
this.add(jp2,BorderLayout.CENTER);88
this.add(jp3,BorderLayout.SOUTH);89
90
jb1.addActionListener(this);91
jb2.addActionListener(this);92
93
//展现94
this.setSize(300, 250);95
this.setVisible(true);96
}97
98
@Override99
public void actionPerformed(ActionEvent e) {100
//用户点击添加按钮后的响应动作101
if(e.getSource()==jb1){102
//做一个sql语句103
String sql="update stu set stuName=?,stuSex=?,stuAge=?,stuJg=?,stuDept=? where stuId=?";104
String []paras={jtf2.getText(),jtf3.getText(),jtf4.getText(),jtf5.getText(),jtf6.getText(),jtf1.getText()};105
StuModel temp=new StuModel();106
if(temp.updStu(sql, paras)){107
JOptionPane.showMessageDialog(this,"修改数据成功","修改数据提示",JOptionPane.INFORMATION_MESSAGE);108
}else{109
JOptionPane.showMessageDialog(this,"修改数据失败","修改数据提示",JOptionPane.ERROR_MESSAGE);110
}111
this.dispose();112
}113
else if(e.getSource()==jb2){114
this.dispose();115
}116
}117
}118










浙公网安备 33010602011771号