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