1. 程式人生 > >JAVA入門到精通-第73講-學生管理系統5-dao.sqlhelper

JAVA入門到精通-第73講-學生管理系統5-dao.sqlhelper

-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

========================================

[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