[數據庫課設進行時]第二天 DAO與GUI設計

今天考慮數據庫的邏輯結構,管理系統的E-R圖如下,學籍變更記錄、獎勵記錄、處分記錄的外鍵是學號,要想插入記錄,學生表中一定要有數據。同時學生表的外鍵時院系代碼,和班級編號,要想插入學生記錄,那么院系和班級表中一定要先有數據。昨天已經解決這個問題了,各表中該加入數據的已經加入了,如下面的文章:
數據庫課設進行時第一天 數據庫和表的建立和基本的增刪查改操作


模式設計就是上面的一些基本表,但在界面視圖上不僅僅要顯示學生表,要以學生的ID建立多個表的連接,顯示其他的信息,例如院系、班級、學籍、獎勵、處分。在數據修改的時候,對基本表進行修改。

昨天只是實現了對學生表的數據庫操作,但是沒有實現對其它表進行數據庫的操作,所以還要接著幾個設計數據庫操作類,這里為了方便先設計一個泛型接口DAO(),然后其他表進行操作的類都實現這個接口就OK了。

public interface DAO<T> {
    //增加
    public void add(T object);
    //修改
    public void update(T object);
    
    //刪除
    public void delete(int id);
    
    //獲取
    public Student get(int id);
    //查詢
    public List<T> list();
    
    //分頁查詢
    public List<T> list(int start ,int count);

}

java泛型(泛型接口、泛型類、泛型方法)
下面實現對處罰情況的輸入:


public void add(Punishment object) {
        // TODO Auto-generated method stub
        String sql  ="insert into punishment Values(null,?,?,?,?,?)";       
        try(Connection c = getConnection();
            PreparedStatement s = c.prepareStatement(sql);) {

            s.setString(1, object.studentID);
            s.setString(2, object.leves);
            s.setString(3, object.rec_time);
            s.setString(4, object.enable);
            s.setString(5, object.description);
            s.execute();
            System.out.println("數據庫插入成功!");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

對獎勵情況的輸入:

public void add(Reward object) {
        // TODO Auto-generated method stub
        String sql = "insert into reward Values(null,?,?,?,?)";
        
        try(
                Connection c = getConnection();
                PreparedStatement s = c.prepareStatement(sql);) {
            s.setString(1, object.studentID);
            s.setString(2, object.leves);
            s.setString(3, object.rec_time);
            s.setString(4, object.description);
            s.execute();
            System.out.println("數據插入成功!");
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

對學籍更改表進行添加記錄:

public void add(Changement object) {
        // TODO Auto-generated method stub
        String sql = "insert into change Values(null,?,?,?,?)";
        
        try
        (   Connection c = getConnection();
            PreparedStatement s = c.prepareStatement(sql);
                ) {
            s.setString(1, object.studentID);
            s.setString(2, object.change);
            s.setString(3, object.rec_time);
            s.setString(4, object.description);
            s.execute();
            System.out.println("數據插入成功!");
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

運行一個test程序,插入如下:

        c.studentID = "1";
        c.description = "回家生娃去了";
        c.rec_time = "2020-3-4";
        c.change = "3";
        test.add(c);

結果出現以下錯誤:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'change Values(null,'1','3','2020-3-4','???????”??¨???????')' at line 1
看了半天沒弄清出錯在哪?網上百度,發現是使用了mysql的關鍵字change
所以要改,把表名改為changement就OK了.參考博客:
Error Code : 1064 You have an error in your SQL syntax; check the manual that corresponds to your My

前期過程中的一些小Tips:
date類型怎么插入數據庫

好了,下面就來進行GUI圖形界面的實現:
先復習一下有關GUI的知識,

  • GUI中的重角色應該就是容器(container),有兩個,一個是JFrame,另一個是JDialog.容器的作用是可以放置多個組件(按鈕,文本框等等).在放置的時候要注意布局,于是就有了布局器,布局有絕對布局(需要設置大小和位置),網格布局(GridLayout),BorderLayout(上北下南左西右東還有中間一個大的東西),FlowLayout(即流式布局).窗體大小不可變 f.setResizable(false);
  • 組件也是GUI的一大部分,有標簽JLabel,按鈕JButton,文本框JTextField,下拉框(JComBox),對話框(JOptionPane),密碼框(JPasswordField)
//下拉框出現的條目
        String[] heros = new String[] { "姓名", "ID號" };
        JComboBox cb = new JComboBox(heros);
    這個地方可以用在按字段進行查詢.
  • 根據外部窗體實例化JDialog
       JDialog d = new JDialog(f);
       // 設置為模態
       d.setModal(true);```這個部分可以在輸入記錄的時候起作用.例如點擊添加記錄,就彈出一個JDialog窗體.然后用戶進行輸入即可了.
  • 面板:面板和JFrame都是容器,都可以添加組件,在面板中添加組件的好處是,可以對整體的組件進行渲染或者大小或者位置變化.適用于整體的界面的設計
    • JPanel 為基本面板,可以添加多個組件,然后把JPanel添加到JFrame即可;ContentPanel為JFrame上的一個面板,向JFrame添加組件其實是往ContentPanel添加組件.splitPanel是水平面板,JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pLeft, pRight);通過設置分割條的位置,將pleft和pright分隔開.
  • 表格:使用JScrollPane可以看見表格的標題
String[] columnNames = new String[] { "id", "name", "hp", "damage" };
        String[][] heros = new String[][] { { "1", "蓋倫", "616", "100" },
                { "2", "提莫", "512", "102" }, { "3", "奎因", "832", "200" } };
        JTable t = new JTable(heros, columnNames);
 
        // 根據t創建 JScrollPane
        JScrollPane sp = new JScrollPane(t);
// 設置列寬度
        t.getColumnModel().getColumn(0).setPreferredWidth(10);

整個GUI設計選擇JTabbedPane選項卡面板,一個包含5個面板:

學生個人信息輸入界面

學籍變更情況輸入界面

獎勵情況輸入界面

處罰情況輸入界面

學生個人情況查詢和修改界面

JFrame jf; //整個窗體
    JPanel jpstudent; //學生信息面板
    JPanel jpchangement; //學籍變更面板
    JPanel jpreward; //獎勵面板
    JPanel jppunish; //處罰面板
    JTabbedPane jtp;//選項卡面板

將各個面板都添加到選項卡面板中:

//將4個面板添加到選項卡面板中.
        jtp.add("學生信息模塊",jpstudent);
        jtp.add("學籍變更模塊", jpchangement);
        jtp.add("獎勵模塊", jpreward);
        jtp.add("處罰模塊", jppunish);
        jf.setContentPane(jtp);

學生信息表格顯示:

String[] columnnames = {"學號 ","姓名","性別","班級","院系","出生年月","籍貫"};
        StudentDAO stu = new StudentDAO();
        //通過StudentDAO得到數據庫中所有的student對象.
        List<Student> list = stu.list();
        //將數據庫中的對象的各屬性值存到二維的字符串數組中.
        String[][] items = new String[list.size()][10]; 
        for(int i= 0 ;i<list.size();i++) {
            items[i][0] = list.get(i).studentID;
            items[i][1] = list.get(i).name;
            items[i][2] = list.get(i).sex;
            items[i][3] = list.get(i).Class;
            items[i][4] = list.get(i).department;
            items[i][5] = list.get(i).birthday;
            items[i][6] = list.get(i).native_place;
            
        }
        //把屬性名和得到的二維數組作為參數傳到表格中,初始化表格.
        jtable = new JTable(items,columnnames);
        //下面是設置第一列學號的寬度,由于學號很長(10位),所以要設置寬點,不然有的看不到
        jtable.getColumnModel().getColumn(0).setPreferredWidth(100);
        //將表格放到JScrollPane中,不然看不到屬性名.
        JScrollPane jsr = new JScrollPane(jtable);
        //添加到學生面板中.
        jpstudent.add(jsr);

結果如下.


后文

今天對系統進行了整體的設計,設計接口DAO(Data Access Object數據庫訪問對象 ),然后對要操作的各個表實現接口DAO,為以后表的操作奠定基礎。接著界面的實現的思路也出來了,使用選項卡面板,將各個界面添加到面板中,接下來的工作是對每個界面設置面板、組件。重點在于查詢模塊的實現。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容