生成績管理系統(tǒng)課設(shè)實(shí)戰(zhàn)拆解)
簡介基于EclipseJavaSwingMySQL構(gòu)建的學(xué)生成績管理系統(tǒng)是一份面向高校Java課程設(shè)計(jì)的高分參考項(xiàng)目適用于需要完成期末大作業(yè)或課設(shè)的計(jì)算機(jī)相關(guān)專業(yè)學(xué)生。系統(tǒng)涵蓋學(xué)生端與管理員端兩大模塊學(xué)生可登錄并瀏覽成績管理員可進(jìn)行班級添加與維護(hù)、學(xué)生信息添加與維護(hù)等功能界面采用Swing繪制交互直觀結(jié)構(gòu)清晰。資源包共126個(gè)文件包含16個(gè)Java源碼、48個(gè)編譯后class文件、SQL建表腳本、Eclipse工程配置及大量界面截圖與圖標(biāo)資源png/jpg壓縮后僅3.03MB便于下載與二次開發(fā)。項(xiàng)目已通過導(dǎo)師審核取得95分成績代碼完整、運(yùn)行穩(wěn)定。當(dāng)前已有396人學(xué)習(xí)使用。對于缺乏項(xiàng)目經(jīng)驗(yàn)、希望獲得完整可運(yùn)行代碼并快速理解業(yè)務(wù)分層與Dao交互的同學(xué)而言這套資源能直接提供可借鑒的模塊劃分、DAO數(shù)據(jù)訪問方式以及基于MySQL的持久化思路省去從零搭建的繁瑣過程。1. 課設(shè)寫作背后的三個(gè)坑這一篇全給你拆完很多人拿到“基于EclipseJavaSwingMysql的學(xué)生成績管理系統(tǒng)”這種題第一反應(yīng)是找個(gè)源碼改改交差。但真正被導(dǎo)師卡住的地方往往不是功能不夠而是三個(gè)說不出口的問題Swing界面為什么這么難看、Mysql連接為什么在本機(jī)好使換臺機(jī)器就報(bào)錯(cuò)、以及答辯護(hù)盤時(shí)“這個(gè)類是干什么的”一問三不知。這套系統(tǒng)我一直留著就是因?yàn)樗诮Y(jié)構(gòu)上把Dao、Frame、Entity分層做得很規(guī)矩登錄判斷、班級維護(hù)、學(xué)生增刪改查都齊了不是那種一個(gè)文件寫到底的作業(yè)。把它當(dāng)課設(shè)交或者拿它當(dāng)SwingMysql的入門項(xiàng)目拆著玩都很合適。下面按我自己的復(fù)盤順序來寫先看懂分層和實(shí)體再解決環(huán)境與連接然后過一遍管理員和學(xué)生兩條主流程最后把容易翻車的細(xì)節(jié)和答辯點(diǎn)放在收尾。2. 項(xiàng)目結(jié)構(gòu)拆解從.class反推SwingMysql的分層設(shè)計(jì)拿到手一堆.class文件第一件事不是急著運(yùn)行而是先搞明白每個(gè)類在系統(tǒng)里扮演什么角色。這套系統(tǒng)里能看到LoginFrame、MainstudentFrame、StudentManagerFrame、ClassTypeManagerFrame、StudentAddFrame、ClassTypeAddFrame、StudentUserFrame這些界面類以及StudentDao、UserDao兩個(gè)數(shù)據(jù)訪問類加上Student實(shí)體類。說白了三層界面層負(fù)責(zé)交互Dao層負(fù)責(zé)和Mysql對話實(shí)體類負(fù)責(zé)承載一行數(shù)據(jù)。2.0.1 界面類拆分原則Swing寫課設(shè)最容易犯的錯(cuò)是幾百行代碼全堆在一個(gè)JFrame里事件監(jiān)聽、SQL語句、組件初始化擠在一起。這個(gè)項(xiàng)目把它拆成了多個(gè)Frame每個(gè)窗口只做一件事。比如LoginFrame只處理登錄驗(yàn)證驗(yàn)證通過后根據(jù)角色跳轉(zhuǎn)到MainstudentFrame管理員主界面或者StudentUserFrame學(xué)生界面。班級相關(guān)的單獨(dú)拆了ClassTypeManagerFrame和ClassTypeAddFrame學(xué)生相關(guān)的拆了StudentManagerFrame和StudentAddFrame。這樣拆的好處是每個(gè)類的職責(zé)清楚答辯被問到“新增一個(gè)班級功能去哪里改”時(shí)你直接說改ClassTypeAddFrame和ClassTypeManagerFrame比說“在那個(gè)大文件里找”要體面得多。2.0.2Student實(shí)體類的字段設(shè)計(jì)不能亂Student不是簡單裝幾個(gè)屬性它的字段要跟Mysql表結(jié)構(gòu)對齊。以這套系統(tǒng)的常見設(shè)計(jì)為例學(xué)生表大概長這樣CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 主鍵, student_no VARCHAR(20) NOT NULL UNIQUE COMMENT 學(xué)號, name VARCHAR(30) NOT NULL COMMENT 姓名, class_id INT NOT NULL COMMENT 班級ID關(guān)聯(lián)班級表, score DOUBLE DEFAULT 0 COMMENT 成績, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 錄入時(shí)間 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;對應(yīng)Java端Student類的字段就是id、studentNo、name、classId、score、createTime。這里有個(gè)容易被忽略的點(diǎn)classId是int類型對應(yīng)Mysql的INT不要寫成String。成績用double還是BigDecimal課設(shè)場景用double沒問題但如果你打算擴(kuò)展成真實(shí)項(xiàng)目建議改BigDecimal防精度丟失。StudentDao里的方法基本圍繞這個(gè)實(shí)體轉(zhuǎn)add(Student s)、deleteById(int id)、update(Student s)、findByNo(String no)、findAll()。這五個(gè)方法覆蓋了教師和管理員最常見的操作。2.0.3UserDao與登錄驗(yàn)證的分工UserDao負(fù)責(zé)用戶表一般表結(jié)構(gòu)就是id、username、password、role。角色字段建議用String存admin或student別用int存0和1——答辯時(shí)導(dǎo)師問“為什么不用int”你解釋“字符串可讀性好而且角色數(shù)量如果以后增加擴(kuò)展不用改代碼邏輯”。登錄驗(yàn)證邏輯不放在LoginFrame的按鈕事件里寫死SQL而是調(diào)用UserDao.findByUsernameAndPassword(username, password)返回User對象或null。返回null就彈JOptionPane.showMessageDialog提示用戶名或密碼錯(cuò)誤返回非空就判斷角色然后dispose()當(dāng)前窗口new MainstudentFrame()或new StudentUserFrame()。這種寫法把SQL隔離在Dao層界面里看不到Statement和ResultSet既整潔又方便單元測試。3. EclipseMysql環(huán)境搭建從JDBC驅(qū)動(dòng)到連接池的幾個(gè)必踩點(diǎn)課設(shè)答辯現(xiàn)場最常見的事故是開發(fā)者在自己筆記本上運(yùn)行得好好的換到教室電腦上就報(bào)ClassNotFoundException: com.mysql.jdbc.Driver或者Communications link failure。這兩個(gè)錯(cuò)基本都是環(huán)境問題不是代碼問題。提前把環(huán)境弄扎實(shí)比多寫十個(gè)功能都重要。3.0.1 JDBC驅(qū)動(dòng)版本與Mysql版本匹配Mysql 5.x用com.mysql.jdbc.Driver沒問題但如果你用的是Mysql 8.x驅(qū)動(dòng)類名要換成com.mysql.cj.jdbc.DriverURL也要加上時(shí)區(qū)參數(shù)。這套系統(tǒng)的源碼里寫的是老驅(qū)動(dòng)名所以建議直接在項(xiàng)目里改用Mysql 8驅(qū)動(dòng)一行代碼的事Class.forName(com.mysql.cj.jdbc.Driver); String url jdbc:mysql://localhost:3306/student_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; String user root; String password your_password; Connection conn DriverManager.getConnection(url, user, password);serverTimezone不寫Mysql 8會(huì)報(bào)The server time zone value???: unrecognizedcharacterEncodingutf8不寫中文錄入到數(shù)據(jù)庫大概率變問號。這兩項(xiàng)屬于經(jīng)驗(yàn)值課設(shè)文檔里最好提一句“為解決中文亂碼和時(shí)區(qū)問題在URL顯式聲明”這能加分。3.0.2 Eclipse中導(dǎo)入外部Jar的兩種姿勢項(xiàng)目里如果沒有l(wèi)ib文件夾要自己把mysql-connector-java-8.0.x.jar放進(jìn)去。常見做法是在項(xiàng)目根目錄建lib目錄把jar復(fù)制進(jìn)去然后右鍵jar -Build Path-Add to Build Path。注意Build Path里看到的是“Referenced Libraries”不是項(xiàng)目里那個(gè)lib文件夾別搞混。如果換機(jī)器打開項(xiàng)目報(bào)找不到驅(qū)動(dòng)先看Build Path里是否還引用著原來那個(gè)jar路徑Eclipse經(jīng)常因?yàn)槁窂阶兞藖G引用。3.0.3 數(shù)據(jù)庫連接封裝別在每個(gè)Frame里重復(fù)寫連接原項(xiàng)目里每個(gè)Dao都在方法里調(diào)DriverManager.getConnection()這確實(shí)能跑但答辯時(shí)如果你能主動(dòng)提出“連接代碼重復(fù)可以用一個(gè)DBUtil工具類統(tǒng)一管理”印象分就出來了。我給你一個(gè)課設(shè)夠用的版本import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String DRIVER com.mysql.cj.jdbc.Driver; private static final String URL jdbc:mysql://localhost:3306/student_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; private static final String USER root; private static final String PASSWORD 123456; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }static塊在類加載時(shí)執(zhí)行一次確保驅(qū)動(dòng)只注冊一次。getConnection()每次調(diào)用都新建連接對課設(shè)的并發(fā)量完全沒問題。如果被問到“為什么不復(fù)用連接”你可以說“課設(shè)場景單用戶操作連接開銷可接受生產(chǎn)環(huán)境我會(huì)用HikariCP連接池”一來顯得你知道連接池二來也說明你分得清場景。3.0.4 Mysql 8的密碼加密方式坑老教程里經(jīng)常配mysql_native_password但Mysql 8默認(rèn)是caching_sha2_passwordJDBC驅(qū)動(dòng)8.x其實(shí)支持但如果你用5.x驅(qū)動(dòng)就會(huì)報(bào)Unable to load authentication plugin caching_sha2_password。解決辦法要么升級驅(qū)動(dòng)要么在Mysql里把用戶改成老密碼方式ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123456;這個(gè)坑在答辯演示時(shí)尤其致命。建議提前在答辯機(jī)器上跑一次System.out.println(DBUtil.getConnection())驗(yàn)證連接別等到打開登錄窗口才報(bào)錯(cuò)。4. 主流程實(shí)戰(zhàn)從登錄到班級與學(xué)生維護(hù)的完整操作路徑系統(tǒng)分管理員和學(xué)生兩種角色操作路徑完全不一樣。管理員登錄后進(jìn)MainstudentFrame能看到班級管理和學(xué)生管理兩大塊學(xué)生登錄后只能進(jìn)StudentUserFrame看自己的成績。下面把這兩條路徑的關(guān)鍵代碼邏輯拆開講。4.0.1 登錄驗(yàn)證的代碼怎么寫才穩(wěn)妥LoginFrame里一般是一個(gè)JTextField、一個(gè)JPasswordField、一個(gè)登錄按鈕。按鈕事件里要處理三個(gè)分支輸入為空提示、用戶不存在提示、密碼錯(cuò)誤提示。別把“用戶不存在”和“密碼錯(cuò)誤”合并成一個(gè)提示導(dǎo)師可能會(huì)問“為什么不能用同一個(gè)提示”——你可以說“為了用戶體驗(yàn)明確告訴用戶是賬號問題還是密碼問題如果你擔(dān)心安全生產(chǎn)系統(tǒng)應(yīng)該統(tǒng)一提示”。這屬于開放性回答。核心驗(yàn)證代碼String username userField.getText().trim(); String password new String(passField.getPassword()); User user userDao.findByUsernameAndPassword(username, password); if (user null) { JOptionPane.showMessageDialog(this, 用戶名或密碼錯(cuò)誤); return; } if (admin.equals(user.getRole())) { dispose(); new MainstudentFrame(username).setVisible(true); } else if (student.equals(user.getRole())) { dispose(); new StudentUserFrame(username).setVisible(true); } else { JOptionPane.showMessageDialog(this, 未知角色); }new String(passField.getPassword())是從JPasswordField取密碼的標(biāo)準(zhǔn)寫法不要用passField.getText()——那個(gè)方法已過時(shí)而且會(huì)以明文方式把密碼留在內(nèi)存里。傳username給下一個(gè)窗口是為了在界面上顯示“當(dāng)前登錄人xxx”也是后續(xù)學(xué)生查詢自己成績的過濾條件。4.0.2 班級添加與維護(hù)窗口間傳值靠什么ClassTypeManagerFrame打開時(shí)會(huì)從Mysql查全部班級裝進(jìn)JTable或JComboBox。新增班級入口在MainstudentFrame的按鈕事件里一般寫成new ClassTypeAddFrame(ClassTypeManagerFrame.this).setVisible(true);把父窗口傳進(jìn)去是為了子窗口保存成功后能調(diào)用父窗口的refreshTable()方法刷數(shù)據(jù)。這種“父子窗口回調(diào)刷新”在Swing課設(shè)里很常見。ClassTypeAddFrame保存時(shí)執(zhí)行INSERT INTO class_type(name, remark) VALUES(?, ?)用PreparedStatement占位符不要字符串拼接不然字符里帶單引號直接崩String sql INSERT INTO class_type(name, remark) VALUES(?, ?); try (PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, nameField.getText().trim()); ps.setString(2, remarkArea.getText().trim()); int rows ps.executeUpdate(); if (rows 0) { JOptionPane.showMessageDialog(this, 添加成功); } } catch (SQLException e) { e.printStackTrace(); }try-with-resources會(huì)自動(dòng)關(guān)閉PreparedStatement和Connection這是Java 7以后的特性比寫finally關(guān)連接更清爽。executeUpdate()返回影響行數(shù)大于0說明插入成功。這是標(biāo)準(zhǔn)寫法也是答辯時(shí)高頻提問點(diǎn)。4.0.3 學(xué)生添加學(xué)號唯一性怎么校驗(yàn)學(xué)生添加窗口字段多學(xué)號、姓名、班級下拉框、成績。最容易出問題的時(shí)學(xué)號重復(fù)。數(shù)據(jù)庫層面已經(jīng)建了UNIQUE索引但代碼層面也要先查一次否則會(huì)直接拋Duplicate entry異常。規(guī)范的邏輯是先用SELECT COUNT(*) FROM student WHERE student_no ?查一下如果大于0就彈提示并返回不再執(zhí)行插入。這里有個(gè)細(xì)節(jié)班級下拉框裝的是班級對象不是班級ID選擇后取selectedItem再強(qiáng)轉(zhuǎn)成ClassTypeClassType ct (ClassType) classCombo.getSelectedItem(); int classId ct.getId();如果你直接往JComboBox里addItem(計(jì)科1班)那取出來是String再映射班級ID就麻煩了。所以常見做法是給ClassType重寫toString()返回班級名這樣下拉框顯示文字拿到的卻是對象本身。4.0.4 學(xué)生維護(hù)JTable的選中行與數(shù)據(jù)同步StudentManagerFrame里一般放一個(gè)JTable下面有“修改”“刪除”“刷新”按鈕。刪除邏輯常見的坑是用戶沒選中任何行結(jié)果getSelectedRow()返回-1代碼直接崩潰。所以要判空int row studentTable.getSelectedRow(); if (row 0) { JOptionPane.showMessageDialog(this, 請先選擇一行); return; } int studentId (int) studentTable.getValueAt(row, 0);getValueAt(row, 0)取的是表格第一列的值所以建表時(shí)第一列最好放ID但如果你不想把ID顯示給用戶就把它隱藏掉用TableColumn.setMinWidth(0)或setMaxWidth(0)。刪除時(shí)調(diào)studentDao.deleteById(studentId)然后刷新表格。刷新表格的常見方式是把查詢結(jié)果重新DefaultTableModel.setDataVector()。這里注意setDataVector會(huì)自動(dòng)清空舊數(shù)據(jù)不需要先setRowCount(0)。4.0.5 學(xué)生端成績?yōu)g覽只查自己的數(shù)據(jù)學(xué)生登錄后StudentUserFrame里做得不是把所有學(xué)生成績都查出來而是根據(jù)登錄用戶名學(xué)號過濾。比如登錄名是2021001那就執(zhí)行SELECT s.student_no, s.name, c.name AS class_name, s.score FROM student s LEFT JOIN class_type c ON s.class_id c.id WHERE s.student_no ?用LEFT JOIN把班級名帶出來而不是在Java里二次查詢。StudentDao對應(yīng)方法返回ListStudent再轉(zhuǎn)成DefaultTableModel。這里可以順帶展示一個(gè)加分點(diǎn)用JOIN查詢而不是在Student實(shí)體里再塞一個(gè)className字段然后手動(dòng)賦值。答辯時(shí)說“我通過關(guān)聯(lián)查詢把班級名直接查出來避免N1問題”導(dǎo)師一聽就知道你真寫過代碼。5. 運(yùn)行不起來三個(gè)高頻報(bào)錯(cuò)和對應(yīng)的驗(yàn)證方法課設(shè)答辯現(xiàn)場和平時(shí)練習(xí)報(bào)錯(cuò)就那么幾類。提前把報(bào)錯(cuò)信息記下來現(xiàn)場能少一半緊張。5.0.1java.sql.SQLSyntaxErrorException表名或字段名寫錯(cuò)這個(gè)錯(cuò)多半是SQL里用了Mysql關(guān)鍵字比如class是保留字你不能建一張表叫class要叫class_type或t_class。字段名同理desc也是保留字別拿它當(dāng)“描述”字段。如果原項(xiàng)目里用了這些名字改表結(jié)構(gòu)或者SQL里加反引號SELECT desc FROM class_type;但反引號是Mysql專屬沾了Mysql的方言換到別的數(shù)據(jù)庫就不兼容。課設(shè)無所謂但你在答辯時(shí)可以說“我知道這是Mysql方言如果要做跨數(shù)據(jù)庫我會(huì)改名”。5.0.2java.sql.SQLNonTransientConnectionException連接數(shù)或網(wǎng)絡(luò)問題Communications link failure嘛常見原因有三個(gè)Mysql服務(wù)沒啟動(dòng)、端口被占用、防火墻攔了3306。快速驗(yàn)證步驟netstat -ano | findstr :3306有LISTENING說明服務(wù)在跑。如果沒有打開服務(wù)管理器啟動(dòng)Mysql。注意課設(shè)機(jī)房的Mysql服務(wù)可能沒設(shè)自動(dòng)啟動(dòng)每次開機(jī)要手動(dòng)起。另外如果你在代碼里把localhost改成了127.0.0.1效果一樣。如果Mysql裝的是免安裝版還要確認(rèn)my.ini里的port是不是默認(rèn)的3306。5.0.3 數(shù)據(jù)庫中文亂碼三個(gè)層面都要統(tǒng)一亂碼問題先看Mysql客戶端工具里直接插中文顯示是否正常。如果工具里正常說明數(shù)據(jù)庫和表都沒問題問題出在JDBC連接URL少了characterEncodingutf8。如果工具里就亂碼那要改my.ini里的character-set-serverutf8mb4然后重啟Mysql。這里有個(gè)小的驗(yàn)證技巧在StudentDao.findByName里打印SQL和參數(shù)看傳進(jìn)去的中文是不是正常就能定位是URL層還是數(shù)據(jù)庫層的問題。我一般建議整套系統(tǒng)統(tǒng)一用utf8mb4因?yàn)閡tf8mb4能存Emojiutf8不行——雖然課設(shè)用不上Emoji但顯得你考慮過編碼層級。5.0.4 答辯驗(yàn)證清單一張表說清自檢項(xiàng)檢查項(xiàng)操作預(yù)期結(jié)果數(shù)據(jù)庫初始化執(zhí)行student_db.sql無報(bào)錯(cuò)student和class_type表存在JDBC連接運(yùn)行DBUtil.getConnection()控制臺無異常能拿到連接對象管理員登錄admin / admin123進(jìn)入主界面班級管理可見學(xué)生登錄2021001 / 123456進(jìn)入學(xué)生界面僅顯示本人成績添加班級輸入“軟件工程1班”列表刷新出現(xiàn)新班級添加學(xué)生學(xué)號填已有學(xué)號彈出“學(xué)號已存在”提示刪除學(xué)生選中某行點(diǎn)刪除二次確認(rèn)后該行消失網(wǎng)關(guān)防火墻關(guān)閉或放行3306遠(yuǎn)程連接正常這份清單我自己每次調(diào)試前都會(huì)過一遍能快速把問題圈定在某一塊。你交作業(yè)前照著走一遍比臨時(shí)翻源碼強(qiáng)得多。6. 答辯加分技巧把Swing線程、設(shè)計(jì)模式和異常處理說清楚最后一個(gè)部分講幾個(gè)容易被忽視但導(dǎo)師愛問的細(xì)節(jié)。如果你還有余力把這幾條補(bǔ)進(jìn)項(xiàng)目里課設(shè)評價(jià)會(huì)明顯不一樣。6.0.1 Swing事件分發(fā)線程EDT與耗時(shí)操作的取舍Swing的組件更新必須跑在事件分發(fā)線程上。現(xiàn)在課設(shè)里點(diǎn)“查詢”按鈕直接在主線程里執(zhí)行SQL數(shù)據(jù)量大時(shí)界面會(huì)卡死。雖然課設(shè)數(shù)據(jù)量小沒什么感覺但你主動(dòng)寫出SwingUtilities.invokeLater(() - { // 更新JTable的代碼 });導(dǎo)師會(huì)認(rèn)為你懂Swing的單線程模型。更規(guī)范的寫法是用SwingWorker做后臺查詢查詢完把結(jié)果publish回EDT。你不需要真改代碼但答辯時(shí)說“我知道這把查詢放在EDT里會(huì)阻塞UI課設(shè)里數(shù)據(jù)量小所以沒影響生產(chǎn)環(huán)境我會(huì)用SwingWorker”就足夠。6.0.2 Dao層接口與實(shí)現(xiàn)分離如果原項(xiàng)目StudentDao是個(gè)類你可以順手提一句更好的設(shè)計(jì)是抽個(gè)接口IStudentDaoStudentDaoImpl實(shí)現(xiàn)它。好處是以后想換個(gè)持久層框架比如MyBatis業(yè)務(wù)層不用改。課設(shè)里兩層就夠了但話要能接上。導(dǎo)師追問“你怎么做單元測試”時(shí)你答“如果Dao是接口可以mock一個(gè)假實(shí)現(xiàn)不用連數(shù)據(jù)庫就能測上層邏輯”這比說“我沒寫過測試”強(qiáng)得多。6.0.3 異常處理別只printStackTrace課設(shè)代碼里到處e.printStackTrace()很常見但這確實(shí)不是好習(xí)慣。答辯時(shí)你指出“生產(chǎn)環(huán)境我會(huì)用log框架記錄異常并向上層拋業(yè)務(wù)異常”這是亮點(diǎn)。如果不想大改可以把關(guān)鍵方法里的異常包裝一下catch (SQLException e) { throw new RuntimeException(數(shù)據(jù)庫操作失敗 e.getMessage(), e); }這樣調(diào)用方Frame層能拿到用戶能看懂的信息而不是一坨堆棧。注意RuntimeException不需要在方法簽名上throws調(diào)用方吞掉也不會(huì)編譯報(bào)錯(cuò)——但更好的是在Frame層捕獲后彈提示框。這個(gè)細(xì)節(jié)很多工作兩三年的都不一定做得好你寫在答辯PPT里屬于“超過課設(shè)預(yù)期”的水平。6.0.4 一個(gè)能馬上驗(yàn)證的最終技巧導(dǎo)出數(shù)據(jù)備份答辯前最后一步導(dǎo)出一份Mysql的數(shù)據(jù)備份萬一現(xiàn)場電腦的數(shù)據(jù)庫被人清了你能在5分鐘內(nèi)恢復(fù)mysqldump -uroot -p student_db student_db_backup.sql恢復(fù)時(shí)mysql -uroot -p student_db student_db_backup.sql把student_db_backup.sql放到項(xiàng)目根目錄和源碼一起打包。現(xiàn)場恢復(fù)只需要兩條命令比打開Mysql Workbench點(diǎn)導(dǎo)入快得多。這一招看起來簡單但很多做課設(shè)的人不知道結(jié)果現(xiàn)場手忙腳亂重建表。你把這個(gè)寫進(jìn)演示準(zhǔn)備步驟里就是一個(gè)實(shí)實(shí)在在的“工程意識”體現(xiàn)。本文還有配套的精品資源點(diǎn)擊獲取