JAVA入門到精通-第73講-學生管理系統5-dao.sqlhelper
阿新 • • 發佈:2018-11-30
-Model2模式
如果資料模型會很多,怎麼辦?
處理業務邏輯的:Model層
後臺又分為:處理業務邏輯和對資料庫的操作DAO-data access object
-決定,再抽象一層出來:資料模型:BO
-類:SqlHelper:專門對資料庫操作,不含業務邏輯:DAO
-介面層只認業務邏輯類的物件;業務邏輯層認SqlHelper類的物件; -每一層的功能不一樣;
-------------------------------------------------------------- -把對資料庫的操作放在SqlHelper類:
-傳sql,傳陣列 -把關閉的程式碼單獨拿出來,寫成一個函式;
-查詢資料庫的操作 public ResultSet queryExectue(String sql)
分層的好處:修改某一模組,不影響其他功能模組
-SqlHelper 更新
單態的:始終只有一個連線
-查詢 查詢過後,資源沒有關閉
select * from stu where 1=? ,用? 沒有問號,注入比較麻煩 讓他們都統一起來,又不想多寫一個函式
不需要注入引數 public ResultSet queryExecute(String sql)
把資料更新一遍
-SqlHelper
========================================
-介面層只認業務邏輯類的物件;業務邏輯層認SqlHelper類的物件; -每一層的功能不一樣;
-------------------------------------------------------------- -把對資料庫的操作放在SqlHelper類:
-傳sql,傳陣列 -把關閉的程式碼單獨拿出來,寫成一個函式;
-查詢資料庫的操作 public ResultSet queryExectue(String sql)
分層的好處:修改某一模組,不影響其他功能模組
-SqlHelper 更新
單態的:始終只有一個連線
-查詢 查詢過後,資源沒有關閉
select * from stu where 1=? ,用? 沒有問號,注入比較麻煩 讓他們都統一起來,又不想多寫一個函式
不需要注入引數 public ResultSet queryExecute(String sql)
把資料更新一遍
-SqlHelper
========================================
[JTable_Test3.java]原始碼
168 1/**
2
* 完成一個mini版本的學生管理系統(MODEL2-2模式)
3
* 1、查詢任務
4
* 2、新增功能
5
*/
6
package com.student3;
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
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
*/
5
package com.student3;
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
//新增學生(增、刪、改)
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