亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Java Swing+MySQL學(xué)生選課系統(tǒng):JDBC事務(wù)與數(shù)據(jù)庫設(shè)計(jì)實(shí)戰(zhàn)

Java Swing+MySQL學(xué)生選課系統(tǒng):JDBC事務(wù)與數(shù)據(jù)庫設(shè)計(jì)實(shí)戰(zhàn) 簡介基于Java Swing與MySQL實(shí)現(xiàn)的學(xué)生選課管理系統(tǒng)課程設(shè)計(jì)資源面向Java初學(xué)與課程設(shè)計(jì)人群提供一套可直接運(yùn)行、復(fù)用的完整項(xiàng)目方案。系統(tǒng)囊括系統(tǒng)管理、數(shù)據(jù)管理、數(shù)據(jù)查詢?nèi)蠛诵哪K覆蓋用戶登錄與密碼設(shè)置、學(xué)生/課程/選課信息的新增刪除修改、以及多維查詢等典型功能運(yùn)行于Eclipse/IDEA、JDK8、MySQL5.7以上環(huán)境功能鏈路完整適合理解Swing界面開發(fā)與MySQL數(shù)據(jù)庫交互。資源包共3個(gè)文件總大小3.34MB包含項(xiàng)目源碼壓縮包、數(shù)據(jù)庫初始化SQL腳本及一份課程設(shè)計(jì)實(shí)訓(xùn)報(bào)告docx按“源碼—數(shù)據(jù)—報(bào)告”組織結(jié)構(gòu)清晰便于對照使用。已有268人學(xué)習(xí)下載讀者可借助完整源碼快速部署調(diào)試參考報(bào)告梳理論文框架與設(shè)計(jì)思路高效完成課程作業(yè)或畢業(yè)設(shè)計(jì)。1. 學(xué)生選課管理系統(tǒng)Java Swing 與 MySQL 的典型落地組合如果你在學(xué)校或培訓(xùn)機(jī)構(gòu)待過大概率見過這種場景教務(wù)老師還在用 Excel 維護(hù)幾百人的選課名單學(xué)生要發(fā)郵件或者跑到辦公室才能改選一次課。這套基于 Java Swing MySQL 的學(xué)生選課管理系統(tǒng)目標(biāo)就是把“課程信息維護(hù)、學(xué)生選課、退課、成績錄入、統(tǒng)計(jì)查詢”這幾件高頻事收斂到一個(gè)桌面程序里。它是 Java 課程設(shè)計(jì)里最經(jīng)典的題目之一難點(diǎn)不在業(yè)務(wù)邏輯而在你把 Swing 界面事件、JDBC 事務(wù)、數(shù)據(jù)庫表關(guān)系這三樣?xùn)|西縫在一起時(shí)是否足夠穩(wěn)。這套方案適合兩類人一是準(zhǔn)備做畢業(yè)設(shè)計(jì)或課程設(shè)計(jì)的學(xué)生需要一份能跑通、能答辯、有實(shí)訓(xùn)報(bào)告支撐的完整項(xiàng)目二是剛學(xué)完 Java SE想找一個(gè)“不依賴 Web 容器、雙擊就能跑”的桌面項(xiàng)目來鍛煉 JDBC 和 GUI 編程的開發(fā)者。它的價(jià)值在于選課系統(tǒng)天然包含一對多、多對多的表關(guān)系你能在一百來行 SQL 里把外鍵約束、級聯(lián)刪除、事務(wù)回滾這些概念全部實(shí)戰(zhàn)一遍比刷十道練習(xí)題都管用。我對這套組合的評價(jià)是技術(shù)棧雖然不算新但它穩(wěn)定、可控、容易調(diào)試作為一個(gè)練手和交付物都合適的項(xiàng)目依然是當(dāng)下課程設(shè)計(jì)里最穩(wěn)妥的選擇之一。2. 技術(shù)選型為什么是 Swing MySQL桌面端 JDBC 項(xiàng)目的經(jīng)典組合2.1 Swing 和 JavaFX 的選擇穩(wěn)定優(yōu)先于新潮很多人在做桌面選課系統(tǒng)時(shí)會(huì)糾結(jié)用 Swing 還是 JavaFX我的經(jīng)驗(yàn)是除非你有明確的動(dòng)畫、圖表或富媒體需求不然 Swing 依然是課程設(shè)計(jì)里更安全的選擇。原因有三點(diǎn)第一Swing 是 JDK 自帶的 GUI 工具包不需要額外引入運(yùn)行時(shí)和構(gòu)建插件放在普通 JDK 環(huán)境里就能編譯運(yùn)行第二Swing 的資料沉淀極多遇到 “JTable 刷新不生效”“JFrame 關(guān)閉后進(jìn)程不退出”這類問題隨便搜一下就有現(xiàn)成答案第三Swing 的組件模型足夠完成選課系統(tǒng)里所有的需求包括表格展示課程列表、下拉框選擇院系、文本域錄入反饋意見。JavaFX 雖然界面更現(xiàn)代但它需要獨(dú)立 SDK、可能在 IDEA 里需要額外配置 VM 參數(shù)這對一個(gè)以“快速跑通、順利答辯”為目標(biāo)的實(shí)訓(xùn)項(xiàng)目來說是多余的復(fù)雜度。你交的是“學(xué)生選課管理系統(tǒng)”不是“交互動(dòng)效展示平臺(tái)”Swing 的平庸恰恰是它的優(yōu)勢。我現(xiàn)在做這類桌面工具時(shí)一般先用 Swing 做原型如果后續(xù)確實(shí)需要更精致的界面再考慮遷移到 JavaFX 或者干脆改成 Web 版但那是后話了。2.2 MySQL 5.7 還是 8.0先看你手頭的環(huán)境數(shù)據(jù)庫方面這個(gè)項(xiàng)目用 MySQL 是標(biāo)配。你需要先做一個(gè)決定用 MySQL 5.7 還是 8.0。我建議你在自己機(jī)器上裝哪個(gè)方便用哪個(gè)但要注意驅(qū)動(dòng)版本。如果你用 8.0JDBC 驅(qū)動(dòng)類名是com.mysql.cj.jdbc.DriverURL 需要加serverTimezoneAsia/Shanghai否則連數(shù)據(jù)庫時(shí)會(huì)報(bào)時(shí)區(qū)錯(cuò)誤。如果你用 5.7驅(qū)動(dòng)類名是com.mysql.jdbc.DriverURL 則不需要帶時(shí)區(qū)參數(shù)但兩者在代碼里混用會(huì)導(dǎo)致 ClassNotFoundException 或者奇怪的通信異常。另一個(gè)常見坑是 MySQL 8.0 的加密規(guī)則。如果你在連接時(shí)遇到 “Public Key Retrieval is not allowed” 的錯(cuò)誤在 JDBC URL 后追加allowPublicKeyRetrievaltrueuseSSLfalse就能解決。這個(gè)參數(shù)不寫在驅(qū)動(dòng)代碼里而是寫在連接字符串里。下面是一個(gè)兼容 MySQL 5.7 和 8.0 的 JDBC 配置模板我一般會(huì)寫在db.properties文件里方便以后修改jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/course_select?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue jdbc.usernameroot jdbc.password123456這段配置里characterEncodingutf8是為了避免中文亂碼serverTimezoneAsia/Shanghai只對 MySQL 8.0 有效useSSLfalse是因?yàn)楸镜亻_發(fā)不需要加密連接能省去證書配置的麻煩。注意allowPublicKeyRetrievaltrue這個(gè)參數(shù)如果你用的驅(qū)動(dòng)是 8.0 且 MySQL 用戶秘鑰是 caching_sha2_password不加這個(gè)會(huì)在第一次連接時(shí)報(bào)錯(cuò)。2.3 IDEA 里的項(xiàng)目結(jié)構(gòu)一個(gè) Module 就夠別搞多 Module這個(gè)項(xiàng)目我建議用 IDEA 新建一個(gè)普通的 Java 項(xiàng)目不要用 Maven也不要用 Gradle除非你后續(xù)打算把項(xiàng)目轉(zhuǎn)成 Web 服務(wù)。原因還是在“可控”兩個(gè)字上不引入構(gòu)建工具你只需要把 mysql-connector.jar 導(dǎo)入到項(xiàng)目的 lib 目錄然后在 Project Structure 里把它添加為 Library 即可。如果用 Maven雖然依賴管理方便但很多新手會(huì)在坐標(biāo)版本、私服配置上浪費(fèi)時(shí)間這些都不是選課系統(tǒng)本身的關(guān)注點(diǎn)。IDEA 里建議的項(xiàng)目結(jié)構(gòu)是course-selection-system/ ├── src/ │ ├── com.course.ui/ # Swing 界面類 │ │ ├── LoginFrame.java │ │ ├── StudentFrame.java │ │ └── AdminFrame.java │ ├── com.course.dao/ # JDBC 數(shù)據(jù)訪問層 │ │ ├── StudentDao.java │ │ ├── CourseDao.java │ │ └── SelectionDao.java │ ├── com.course.model/ # 實(shí)體類 │ │ ├── Student.java │ │ ├── Course.java │ │ └── Selection.java │ ├── com.course.util/ # 工具類 │ │ ├── DBUtil.java │ │ └── TableModelUtil.java │ └── com.course.MainApp.java ├── lib/ │ └── mysql-connector-java-8.0.30.jar └── sql/ └── init.sql這里我把MainApp.java放到com.course包下作為程序入口只負(fù)責(zé)調(diào)用LoginFrame。不要把 main 方法寫在某個(gè)界面類里否則后續(xù)做單元測試和代碼審查都會(huì)別扭。另外我建議把init.sql放在項(xiàng)目根目錄下的sql文件夾中這樣實(shí)訓(xùn)報(bào)告里可以直接引用建表語句答辯時(shí)也方便演示。3. 數(shù)據(jù)庫設(shè)計(jì)與初始化從三張表到兩個(gè)核心事務(wù)3.1 表結(jié)構(gòu)設(shè)計(jì)學(xué)生表、課程表、選課表再多一張就是冗余選課系統(tǒng)的核心數(shù)據(jù)模型是三張表學(xué)生表student、課程表course、選課關(guān)系表selection。其中選課表是連接前兩張表的多對多關(guān)系表它只存student_id和course_id兩個(gè)外鍵以及選課時(shí)間、成績這兩個(gè)業(yè)務(wù)字段。為什么要單獨(dú)拆出來而不是在學(xué)生表里加一個(gè)course_ids字段因?yàn)殛P(guān)系型數(shù)據(jù)庫的設(shè)計(jì)原則是“一行只表達(dá)一個(gè)事實(shí)”你在學(xué)生表里塞一個(gè)逗號分隔的課程 ID 列表后續(xù)統(tǒng)計(jì)“每個(gè)課程選了多少人”的時(shí)候就只能靠字符串分割既慢又容易出錯(cuò)這種反模式在面試?yán)镆彩堑湫偷目鄯猪?xiàng)。下面是初始化 SQL我在課程設(shè)計(jì)項(xiàng)目里慣用的寫法是這樣。注意我刻意用了ENGINEInnoDB和CHARSETutf8mb4并打開了外鍵約束-- 學(xué)生表 CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 學(xué)號主鍵, student_no VARCHAR(20) NOT NULL UNIQUE COMMENT 學(xué)號唯一索引, name VARCHAR(30) NOT NULL COMMENT 學(xué)生姓名, password VARCHAR(64) DEFAULT 123456 COMMENT 登錄密碼默認(rèn)123456, major VARCHAR(50) COMMENT 專業(yè), class_name VARCHAR(50) COMMENT 班級, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT學(xué)生表; -- 課程表 CREATE TABLE course ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 課程主鍵, course_no VARCHAR(20) NOT NULL UNIQUE COMMENT 課程編號, name VARCHAR(50) NOT NULL COMMENT 課程名稱, teacher VARCHAR(30) COMMENT 授課教師, credit DECIMAL(3,1) DEFAULT 2.0 COMMENT 學(xué)分, max_students INT DEFAULT 50 COMMENT 選課人數(shù)上限, selected_count INT DEFAULT 0 COMMENT 已選人數(shù)可在應(yīng)用層維護(hù) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT課程表; -- 選課關(guān)系表 CREATE TABLE selection ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, course_id INT NOT NULL, select_time DATETIME DEFAULT CURRENT_TIMESTAMP, score DECIMAL(5,2) COMMENT 成績教務(wù)錄入, UNIQUE KEY uk_student_course (student_id, course_id), CONSTRAINT fk_sel_student FOREIGN KEY (student_id) REFERENCES student(id) ON DELETE CASCADE, CONSTRAINT fk_sel_course FOREIGN KEY (course_id) REFERENCES course(id) ON DELETE CASCADE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT選課關(guān)系表;這里說明幾個(gè)設(shè)計(jì)決策第一student_no用UNIQUE而不是直接做主鍵是為了讓主鍵id在后續(xù)關(guān)聯(lián)時(shí)保持穩(wěn)定學(xué)號即使被教務(wù)處調(diào)整也不影響已有選課關(guān)系第二course表里的selected_count字段是冗余設(shè)計(jì)主要是為了方便在課程列表界面直接展示已選人數(shù)不用每展示一行課程就COUNT(*)一次這個(gè)字段可以通過事務(wù)保證一致第三selection表上的UNIQUE KEY uk_student_course是防重復(fù)選課的關(guān)鍵應(yīng)用層就算代碼有并發(fā)問題數(shù)據(jù)庫這一層也會(huì)攔住重復(fù)插入。3.2 初始化數(shù)據(jù)與事務(wù)演示把實(shí)訓(xùn)報(bào)告的案例測出來建表之后建議你順手插入幾條演示數(shù)據(jù)方便后面測試登錄和選課功能。這個(gè)數(shù)據(jù)集不要太大一兩百個(gè)學(xué)生、二三十門課足夠。插入時(shí)注意學(xué)生密碼我用的是123456真實(shí)環(huán)境里應(yīng)該加密存儲(chǔ)但作為課程設(shè)計(jì)演示明文密碼在實(shí)訓(xùn)報(bào)告里更容易講清楚認(rèn)證流程。下面這段 SQL 用于插入 5 個(gè)學(xué)生和 5 門課程并且預(yù)置一條選課記錄用來驗(yàn)證登錄后的界面能正確顯示“我已選的課程”INSERT INTO student (student_no, name, major, class_name) VALUES (2023001, 張三, 計(jì)算機(jī)科學(xué)與技術(shù), 計(jì)科2301), (2023002, 李四, 軟件工程, 軟工2302), (2023003, 王五, 數(shù)據(jù)科學(xué), 數(shù)據(jù)2301), (2023004, 趙六, 計(jì)算機(jī)科學(xué)與技術(shù), 計(jì)科2302), (2023005, 錢七, 網(wǎng)絡(luò)工程, 網(wǎng)工2301); INSERT INTO course (course_no, name, teacher, credit, max_students, selected_count) VALUES (C001, Java程序設(shè)計(jì), 陳老師, 3.0, 50, 0), (C002, 數(shù)據(jù)庫原理, 劉老師, 3.5, 40, 1), (C003, 操作系統(tǒng), 李老師, 3.0, 45, 0), (C004, 計(jì)算機(jī)網(wǎng)絡(luò), 王老師, 2.5, 35, 0), (C005, 軟件工程, 趙老師, 2.0, 60, 0); -- 預(yù)置一條選課記錄張三選了數(shù)據(jù)庫原理 INSERT INTO selection (student_id, course_id) VALUES (1, 2);注意這里選課記錄插入后course表里C002的selected_count也應(yīng)該同步更新為 1。這個(gè)同步動(dòng)作在真實(shí)代碼里應(yīng)該在同一個(gè)事務(wù)里完成。SQL 文件里如果你手動(dòng)跑這兩條語句需要記得把selected_count一起UPDATE掉否則界面上的已選人數(shù)不準(zhǔn)確很容易在演示的時(shí)候被老師挑出毛病。4. 用 JDBC 寫一個(gè)永不串號的學(xué)生端選課邏輯從連接池到事務(wù)4.1 數(shù)據(jù)庫連接工具類別把連接參數(shù)散落在各處寫 Swing 界面時(shí)最容易出現(xiàn)的情況是每個(gè)按鈕事件里都直接寫DriverManager.getConnection(url, user, password)結(jié)果換一臺(tái)電腦跑項(xiàng)目時(shí)要全局搜索替換數(shù)據(jù)庫密碼。這種做法在課程設(shè)計(jì)里不算致命但會(huì)讓你的代碼在實(shí)訓(xùn)報(bào)告里顯得很業(yè)余。我建議你寫一個(gè)DBUtil工具類把連接管理工作收口package com.course.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/course_select?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue; private static final String USER root; private static final String PASSWORD 123456; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(Connection conn, java.sql.Statement stmt, java.sql.ResultSet rs) { try { if (rs ! null) rs.close(); } catch (SQLException ignored) {} try { if (stmt ! null) stmt.close(); } catch (SQLException ignored) {} try { if (conn ! null) conn.close(); } catch (SQLException ignored) {} } }這個(gè)工具類里Class.forName是在注冊 JDBC 驅(qū)動(dòng)MySQL 8.0 的驅(qū)動(dòng)在 SPI 機(jī)制下可以省略這行但寫上它能讓驅(qū)動(dòng)加載過程更明確排查問題時(shí)也少一個(gè)變量。close方法里我把ResultSet、Statement、Connection的關(guān)系理清楚關(guān)閉順序必須從里到外否則你可能會(huì)在日志里看到連接泄漏。這里我沒有引入連接池因?yàn)?Swing 桌面應(yīng)用是單用戶模式并發(fā)量極低每次操作新建連接、用完即關(guān)就夠了。如果后續(xù)你把它改造成多用戶并發(fā)訪問再考慮換成 HikariCP但現(xiàn)在不要過度設(shè)計(jì)。4.2 核心選課事務(wù)先查容量再插入最后更新計(jì)數(shù)下面是選課功能里最關(guān)鍵的一段代碼。我把它寫在SelectionDao.selectCourse(int studentId, int courseId)方法里這個(gè)方法要承擔(dān)兩個(gè)職責(zé)一是檢查課程是否已滿、學(xué)生是否已選過二是完成插入選課記錄并更新課程已選人數(shù)。整個(gè)過程必須在一個(gè)事務(wù)里執(zhí)行否則在“檢查容量”和“插入記錄”之間如果其他線程也執(zhí)行了同樣操作就可能導(dǎo)致超選。package com.course.dao; import com.course.util.DBUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class SelectionDao { public boolean selectCourse(int studentId, int courseId) { String checkCourseSql SELECT max_students, selected_count FROM course WHERE id ? FOR UPDATE; String checkSelectedSql SELECT id FROM selection WHERE student_id ? AND course_id ?; String insertSql INSERT INTO selection (student_id, course_id) VALUES (?, ?); String updateCountSql UPDATE course SET selected_count selected_count 1 WHERE id ?; Connection conn null; PreparedStatement checkCourseStmt null; PreparedStatement checkSelectedStmt null; PreparedStatement insertStmt null; PreparedStatement updateCountStmt null; ResultSet rs null; try { conn DBUtil.getConnection(); // 開啟事務(wù)關(guān)閉自動(dòng)提交 conn.setAutoCommit(false); // 第一步鎖定課程行防止并發(fā)超選 checkCourseStmt conn.prepareStatement(checkCourseSql); checkCourseStmt.setInt(1, courseId); rs checkCourseStmt.executeQuery(); if (!rs.next()) { conn.rollback(); return false; // 課程不存在 } int maxStudents rs.getInt(max_students); int selectedCount rs.getInt(selected_count); if (selectedCount maxStudents) { conn.rollback(); return false; // 課程已滿 } // 第二步檢查是否重復(fù)選課 checkSelectedStmt conn.prepareStatement(checkSelectedSql); checkSelectedStmt.setInt(1, studentId); checkSelectedStmt.setInt(2, courseId); rs checkSelectedStmt.executeQuery(); if (rs.next()) { conn.rollback(); return false; // 已經(jīng)選過這門課 } // 第三步插入選課記錄 insertStmt conn.prepareStatement(insertSql); insertStmt.setInt(1, studentId); insertStmt.setInt(2, courseId); insertStmt.executeUpdate(); // 第四步更新課程已選人數(shù) updateCountStmt conn.prepareStatement(updateCountSql); updateCountStmt.setInt(1, courseId); updateCountStmt.executeUpdate(); // 全部成功提交事務(wù) conn.commit(); return true; } catch (SQLException e) { if (conn ! null) { try { conn.rollback(); } catch (SQLException ignored) {} } e.printStackTrace(); return false; } finally { DBUtil.close(conn, insertStmt, rs); } } }這段代碼的邏輯說明如下。第一步里FOR UPDATE是關(guān)鍵它會(huì)在事務(wù)期間鎖住course表里那一行其他事務(wù)要更新同一行時(shí)必須等當(dāng)前事務(wù)提交或回滾。第二步的重復(fù)檢查能攔截大部分重復(fù)插入但由于應(yīng)用層可能并發(fā)執(zhí)行數(shù)據(jù)庫層的外鍵約束和UNIQUE索引仍然是最后的兜底防線。事務(wù)的提交或回滾都放在try-catch里任何一個(gè)步驟失敗都會(huì)把所有改動(dòng)回滾避免出現(xiàn)“選課記錄插入成功但課程已選人數(shù)沒更新”的數(shù)據(jù)不一致。這里有個(gè)參數(shù)值得你注意setAutoCommit(false)必須在getConnection()之后、第一條 SQL 執(zhí)行之前調(diào)用如果放在finally里再改回去就沒有意義了。另外這個(gè)事務(wù)里rs變量在第一步和第二步之間重復(fù)使用我每次執(zhí)行完查詢后就繼續(xù)復(fù)用同一個(gè)ResultSet其實(shí)這是有風(fēng)險(xiǎn)的因?yàn)橥粋€(gè)Statement上復(fù)用ResultSet會(huì)關(guān)閉前一個(gè)結(jié)果集。好在這里第一步的rs在第二步執(zhí)行前已經(jīng)用完了所以沒有踩坑但更規(guī)范的寫法是為每一步查詢單獨(dú)準(zhǔn)備Statement和ResultSet。這是我在實(shí)際開發(fā)中踩過的坑所以特別提醒你。4.3 Swing 事件線程按鈕點(diǎn)擊之后代碼跑在哪里Swing 是單線程模型所有界面更新必須在事件分發(fā)線程EDT上執(zhí)行。這里有個(gè)常見的做法是在按鈕的事件監(jiān)聽器里直接調(diào)用SelectionDao.selectCourse()然后根據(jù)返回值彈出JOptionPane提示框并刷新表格模型。這個(gè)做法對于課程設(shè)計(jì)來說沒有問題因?yàn)楸镜財(cái)?shù)據(jù)庫查詢很快你不會(huì)感受到界面卡頓。但如果你把項(xiàng)目擴(kuò)展到網(wǎng)絡(luò)數(shù)據(jù)庫或者數(shù)據(jù)量變大就需要在SwingWorker里執(zhí)行 JDBC 操作避免 EDT 被數(shù)據(jù)庫 IO 阻塞導(dǎo)致界面無響應(yīng)。下面這段代碼是選課按鈕的典型實(shí)現(xiàn)我把刷新表格數(shù)據(jù)的邏輯一起寫進(jìn)去btnSelectCourse.addActionListener(e - { int selectedRow courseTable.getSelectedRow(); if (selectedRow 0) { JOptionPane.showMessageDialog(this, 請先在表格中選擇一門課程); return; } // 從表格模型取課程 ID注意這里是 model 的索引不是 view 的索引 int courseId (int) courseTableModel.getValueAt(selectedRow, 0); boolean success new SelectionDao().selectCourse(currentStudentId, courseId); if (success) { JOptionPane.showMessageDialog(this, 選課成功); loadMyCourses(); // 刷新“我的課程”表格 loadAllCourses(); // 刷新全部課程表格更新已選人數(shù) } else { JOptionPane.showMessageDialog(this, 選課失敗課程已滿或已選過該課程); } });這里有一個(gè)培訓(xùn)時(shí)經(jīng)常被忽略的細(xì)節(jié)JTable的getSelectedRow()返回的是視圖模型view的行索引而表格數(shù)據(jù)我們存放在DefaultTableModel中兩者在表格經(jīng)過排序或篩選后可能不一致。如果課程表格只是順序展示沒有排序功能那么 view 索引和 model 索引是一致的但如果你加了TableRowSorter排序就必須用table.convertRowIndexToModel(selectedRow)轉(zhuǎn)換。我在做這個(gè)系統(tǒng)時(shí)加過排序功能結(jié)果選課選錯(cuò)了課程所以在這提醒你拿到選中行以后第一件事就是做索引轉(zhuǎn)換否則容易給學(xué)生選錯(cuò)課。5. 避坑與排查實(shí)訓(xùn)報(bào)告里最容易翻車的 5 個(gè)細(xì)節(jié)5.1 中文亂碼不是數(shù)據(jù)庫的鍋是連接參數(shù)沒帶對現(xiàn)象登錄界面顯示中文正常但課程列表里所有中文都變成“”。原因數(shù)據(jù)庫表已經(jīng)是utf8mb4但 JDBC 連接字符串里沒有characterEncodingutf8導(dǎo)致客戶端和服務(wù)器之間的字符集不一致。解決在db.properties或DBUtil里把 URL 改成jdbc:mysql://localhost:3306/course_select?useUnicodetruecharacterEncodingutf8同時(shí)確認(rèn) IDEA 里項(xiàng)目的文件編碼是 UTF-8不要用 GBK。另外如果你發(fā)現(xiàn)INSERT語句傳中文參數(shù)亂碼檢查PreparedStatement的參數(shù)是否在 setString 之前就經(jīng)過了正確編碼一般加連接參數(shù)后這個(gè)問題會(huì)一并消失。5.2 mysql-connector 版本與 MySQL 服務(wù)器版本不匹配現(xiàn)象程序能編譯但運(yùn)行到Class.forName(com.mysql.jdbc.Driver)時(shí)報(bào) ClassNotFoundException或者連接時(shí)報(bào)Communications link failure。原因MySQL 8.0 的驅(qū)動(dòng)類名改了你用 5.1.x 驅(qū)動(dòng)連 8.0 服務(wù)器會(huì)失敗。解決確認(rèn)你的 lib 目錄下 jar 包版本。如果是 8.x驅(qū)動(dòng)類名是com.mysql.cj.jdbc.Driver并且 URL 里要帶serverTimezone。我一般直接在 MySQL 官網(wǎng)下載mysql-connector-j-8.0.30.jar然后導(dǎo)入 IDEA 的 Project Structure Libraries。這個(gè)坑在實(shí)訓(xùn)報(bào)告里值得寫一段因?yàn)樗?Java 連接數(shù)據(jù)庫最典型的升級兼容問題。5.3 重復(fù)選課成功應(yīng)用層檢查被繞過現(xiàn)象連續(xù)快速點(diǎn)擊“選課”按鈕兩次數(shù)據(jù)庫里出現(xiàn)兩條一樣的選課記錄。原因并發(fā)時(shí)兩個(gè)線程都通過了checkSelectedSql的檢查然后先后執(zhí)行了插入。解決不要只依賴應(yīng)用層判斷數(shù)據(jù)庫里的UNIQUE KEY uk_student_course (student_id, course_id)是最后防線。當(dāng)插入第二條時(shí)MySQL 會(huì)拋出DuplicateKeyException你的catch (SQLException e)會(huì)捕獲它并回滾。為了讓實(shí)訓(xùn)報(bào)告更好看我建議你在這個(gè) catch 里判斷e.getErrorCode() 1062然后提示“您已選過這門課”而不是顯示“選課失敗”這種模糊文案。5.4 Swing 界面卡死JDBC 操作阻塞了事件分發(fā)線程現(xiàn)象點(diǎn)擊“加載全部課程”按鈕后窗口變成白屏光標(biāo)轉(zhuǎn)圈幾秒鐘后才恢復(fù)。原因MainApp直接調(diào)用 DAO 查詢數(shù)據(jù)庫執(zhí)行時(shí)間較長時(shí)阻塞了 EDT。解決最簡單的做法是在查詢方法里加一個(gè)Thread.sleep(100)模擬慢查詢?nèi)缓蟾挠肧wingWorkerVoid, Void在后臺(tái)線程執(zhí)行查詢在done()方法里更新表格模型。不過對于本地 MySQL 和幾千條數(shù)據(jù)不這樣做也感覺不出來。我的建議是實(shí)訓(xùn)報(bào)告里可以寫這個(gè)方案但代碼里不必過度設(shè)計(jì)只要答辯時(shí)能解釋清楚 EDT 模型就行。5.5 關(guān)閉主窗口后 Java 進(jìn)程不退出現(xiàn)象點(diǎn)窗口右上角關(guān)閉按鈕界面消失了但 IDEA 里程序還在運(yùn)行進(jìn)度條一直是綠色。原因沒有設(shè)置setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)默認(rèn)是HIDE_ON_CLOSE窗口隱藏了但 JVM 還在跑。解決在JFrame構(gòu)造函數(shù)里加this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);。這算是最基礎(chǔ)的 Swing 常識但幾乎每屆都有學(xué)生在這上面踩坑因?yàn)楣鈽?biāo)點(diǎn)在窗口右上角時(shí)根本沒意識到只是隱藏。也有同學(xué)用DISPOSE_ON_CLOSE配合System.exit(0)效果一樣但EXIT_ON_CLOSE是最直接的。6. 把項(xiàng)目做成能答辯的樣子從報(bào)表導(dǎo)出到體檢清單項(xiàng)目到了收尾階段除了選課、退課這些核心功能外教務(wù)管理員通常需要把選課名單導(dǎo)出來存檔。一個(gè)實(shí)用的技巧是直接在 Swing 界面里用JFileChooser選擇保存路徑然后用FileWriter把ResultSet的內(nèi)容寫成 CSV 文件。這個(gè)功能不需要引入第三方庫二十行代碼就能完成而且容易在答辯時(shí)演示。我只保留一個(gè)建議——先寫表頭再寫數(shù)據(jù)行用英文逗號分隔中文內(nèi)容加雙引號這樣用 Excel 打開時(shí)不容易亂。下面是一個(gè)簡易的導(dǎo)出實(shí)現(xiàn)private void exportSelectionToCsv() { JFileChooser chooser new JFileChooser(.); chooser.setDialogTitle(導(dǎo)出選課名單); int result chooser.showSaveDialog(this); if (result ! JFileChooser.APPROVE_OPTION) { return; } File file chooser.getSelectedFile(); if (!file.getName().endsWith(.csv)) { file new File(file.getAbsolutePath() .csv); } String sql SELECT s.student_no, s.name, s.major, c.name AS course_name, sc.select_time FROM selection sc JOIN student s ON sc.student_id s.id JOIN course c ON sc.course_id c.id ORDER BY c.id, s.student_no; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql); ResultSet rs ps.executeQuery(); BufferedWriter writer new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), UTF-8))) { writer.write(學(xué)號,姓名,專業(yè),課程名稱,選課時(shí)間\n); while (rs.next()) { writer.write(String.format(\%s\,\%s\,\%s\,\%s\,\%s\\n, rs.getString(student_no), rs.getString(name), rs.getString(major), rs.getString(course_name), rs.getString(select_time))); } JOptionPane.showMessageDialog(this, 導(dǎo)出成功 file.getAbsolutePath()); } catch (Exception ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(this, 導(dǎo)出失敗 ex.getMessage()); } }這里用try-with-resources把連接、語句、結(jié)果集和文件流都收口是 Java 7 以后的推薦寫法即使有異常也會(huì)自動(dòng)關(guān)閉資源。輸出到 CSV 文件時(shí)用了OutputStreamWriter指定 UTF-8 編碼防止 Excel 打開亂碼。注意String.format里的占位符順序要和writer.write的拼接保持一致一般我在開發(fā)時(shí)如果導(dǎo)出的表格列很多會(huì)先在一張紙上畫出表頭順序再寫代碼這樣不容易出錯(cuò)。答辯演示時(shí)除了導(dǎo)出功能我還會(huì)在實(shí)訓(xùn)報(bào)告里附上一份“項(xiàng)目運(yùn)行環(huán)境清單”包括 JDK 版本推薦 8 或 11、MySQL 版本5.7 或 8.0、IDEA 版本2019.3 及以上均可、mysql-connector-java-8.0.30.jar 以及數(shù)據(jù)庫初始化腳本。這個(gè)清單看起來不起眼但評委老師最常問的就是“你換一臺(tái)電腦能跑起來嗎”你把這幾個(gè)版本信息寫清楚能省掉不少追問。另外我習(xí)慣給項(xiàng)目根目錄配一個(gè) README.txt里面寫清楚三步啟動(dòng)流程先用 MySQL 執(zhí)行sql/init.sql再在 IDEA 導(dǎo)入項(xiàng)目最后修改DBUtil.java里的數(shù)據(jù)庫密碼為本地密碼。這樣哪怕過了一個(gè)月再回來看這個(gè)項(xiàng)目也能快速接手。最后說一個(gè)我自己的教訓(xùn)我在早期做這類課程設(shè)計(jì)時(shí)總是忍不住往項(xiàng)目里堆功能比如加一個(gè)“公告板”模塊加一個(gè)“課程評價(jià)”模塊結(jié)果數(shù)據(jù)庫表越來越多代碼越來越亂最后連自己都理不清外鍵關(guān)系。后來我?guī)W(xué)生做項(xiàng)目時(shí)都會(huì)先讓他們把核心流程走順——學(xué)生登錄、選課、退課、管理員審核、統(tǒng)計(jì)報(bào)表一個(gè)功能只能有一個(gè)界面、一個(gè) DAO 方法以及一段事務(wù)邏輯做完這些之后其余的可選功能都只是錦上添花。Selbst當(dāng)老師問起“你的項(xiàng)目有什么亮點(diǎn)”時(shí)你不必說“界面特別好看”你可以說“我的選課事務(wù)能保證數(shù)據(jù)一致”這個(gè)說服力強(qiáng)得多。希望這些經(jīng)驗(yàn)和代碼片段能幫到你祝你的選課管理系統(tǒng)一次通過答辯。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美αv.com| 96免费视频在线| 大香久久| 欧美九一精品久久久熟妇| 久久久艹艹艹| 在线99热| 乱色视频中文字幕| 无码乱人伦中文视频| 亚洲久9| 青春草A| 青青草密桃在线播放| 不卡一区二区日本视频| 波多野结衣一级视频| 婷婷色香伊人| 亚洲导航深夜福利| 国产 亚洲 一二三四| 97视频免费在线| 97中文字幕色| 青青草影视蜜久久| 久久精品视| 99热99re超碰精品| 欧美九九99久久精品| 91精品无码人妻系列| 日韩免费中文字幕视频| 国产精品黄色三级av| 日韩人妻丝袜中文字幕| 欧美三级偷拍| 午夜福利 成人 91| 亚洲中文sv| 亚洲AV色图一区| 亚洲视频小说| 色制服丝袜夫妻av一区| 九九热精彩视频| 九一综合精品视品av| 国产粉嫩蜜臀av一区二区三区| 五月天黄色激情视频| 免费亚洲黄色视频在线观看| 国产久久久久久| 99在线啪| 强奸乱伦AV网址| 边做饭边操逼逼| 九九九网站| 久久久久久久久久久久97| 亚洲 中文 欧美 日韩 在线| 国产日韩美女小穴视频网站不卡| 亚洲女人91| 精品免费囯产一区二区三区 | 啊啊好多水| 黄页大片在线观看| 久久精品老司| 高潮9999外国| 无码人妻精品酒店| 免费一级a毛片久久久久久鸭绿欲 国产精品亚洲天堂网址 | 91久久久老司机| 亚洲性爱无码乱伦av| 久久久婷婷| 超碰色综合| 国产精品成人无码av无码免费| 性久久| 欧美视频一区二区在线| 裸体美女免费看网站青草| 综合网欧美在线| 人妻精品一区二区三区| AV乱伦专区| 97综合久久| 91成人精品| 國產尤物AV尤物在線觀看| 国产一进一出视频网站| 天天久久| hd成人一区二区在线| 亚洲欧美中文日韩视频中国语| 亚洲天堂久久| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 欧美在线干| 亚洲色天堂日韩中| 91 国产丝袜在线播放-百度| A级在线视频| 激情抓乳插进去啪啪啪日韩| 日本天天色| AV丝袜少妇| 色99久草| 日韩欧美午夜一区二区| 中文字幕大片三级狠狠干| 欧亚揄拍偷拍精品视频 | 激情五月天网站| 国产视频三区四区| 欧美性五月| 午夜小电影在线插入淫高潮| h在线看免费版在线看| 欧美色院| 国产亚州精品美女久久久免费| 不卡超碰护士AV在线免费播放| 亚洲色丰满少妇高潮| 色欲久久99国产精品久久久久久| 伊人五月天激情| 国产精品夜夜夜| 欧美婷婷| 岛国毛片在线观看免费| 五月丁香啪啪网| 精品国产网站| 国产狂喷潮在线精品| 无码国产精品午夜不卡(| 日日夜夜国产综合| 亚洲在线| 久操大香蕉手机视频在线看| 超碰色大香蕉| AV电影在线播放| 黑人精品久久97| 蜜臀久久99精品久久久久久无删减 | 91网18| 97国产精品一区| 日韩欧美国产一区二区三区四区 | 后入式免费视频| 黄片在线免费在线观看| 亚洲素人网| 国产一区自拍欧美日韩| 欧美AAAA黄片| 日欧美色| 亚洲欧洲中文日韩女优乱码| 97超碰色屌| 美国日韩黄片| 啊啊啊快操我视频| 国产精品激情久久久久久久| 9久精品视频在线观看| 日本在线观看网址| 久久久久久久久久久久黄色| 精品欧美А∨无码黑人大荫蒂| 人妻一区久久二区三区色播| AV天堂国产| 麻豆国产成人精品| 综合操逼| 久久久无码视频| 色精品极品| 欧美夜夜| 日日夜夜草草草| 午夜一区二区三区国产| 青操影院| 久久人妻视频网| 另类欧美色| 好湿好紧好爽 视频| 国产综合色精品在线观看| 淫色网综合| 亚洲中文字幕久久人妻| 超碰导航97| 欧美第一页性| 8x福利精品第一福利视频导航| 少妇人妻无码| 精品一二三区久久AAA片| 日日躁狠狠躁天天躁精品| 色播五月丁香| www亚洲免费| 最新9久久久9免费视频| 亚洲 91 在线| 大色综合网| 91天堂| 啊啊啊不要啊啊受不了了视频在线 | 久久春色| 欧美日韩人妻婷婷一区| 狠狠干综合| yaouchengrenav| 天天躁狠狠躁av| 99热久| 国产精品人人爽人人做可爱福利| 人妻喷水| 淫乱图区| 蜜臀精品1区2区| 麻豆啪啪啪视频| 中文字幕在线免费观看2| 精品一区二区三区四区外站| 精品一区二区三区蜜桃臀赵总 | 欧美五区| 国产 日韩 欧美 人妻 熟女 中文 69人妻精品一区二区绯色 | 国产乱子伦一区二区三区在线观看| 91在线美女| 99自拍视频在线| 强被迫伦姧在线观看无码网站| 免费99精品国产自在在线| 精品射1999| 黄网在线播放| 九九激情网| 日本狂喷奶水在线播放212| 日本一二区不卡| 亚洲色图第一页| 91天天爱| 亚射在线| 亚91亚洲网| 亚洲色图在线视频| 丁香五月综合| 日韩另类| www.色操逼| 淫荡少妇免费| 日小BB小视频| 在线无码网站| 777琪琪午夜免费A片| 亚洲精品久久久久久久蜜桃臀| 久久久久久中文| 韩日精品福利视频一区不卡在线免| 亚洲av夫妻操穴网| 99色色| 在线啊v一区| 首页中文字幕中文字幕免费| 日本狂喷奶水在线播放212| 国产成人拍国产亚洲精品| 91天天| 欧美牲| 欧美激情精品| 久9re热视频这里只有精品| 久久人妻熟女一区二区| 成人一二三区| 国产精品人妻免费精品| 婷婷色色五月天福利| 97超碰欧美| 啊啊啊无码| 97超碰9| 熟女91网站| 欧美 色 亚洲| 久久久久97| 亚洲AV秘无码一区..| 校园春色综合网| 麻豆天天躁天天揉揉AV| 2010男人的天堂| 黄色一级视| 国产激情av女片自拍| 亚洲欧美日韩免费电影| 色嗨嗨在线| 日韩人妻播放| 女优视频第10页| 色哟哟的毛片| 日本一片一区| 国产不卡的视频| 少妇精品久久久八区九区| 欧美高潮| 91久久久久久久久18| 亚洲国产精品久久AV| 国产对白刺激视频| 欧美国产日韩清纯唯美| 99热导航| 欧美 色 亚洲| 看一级特黄a大一片| 国产美女高潮叫床视频| 97久久精品亚洲| 韩国女主播青草在线| 性色av一区二区| 91中文字幕在线观看| 91人妻在线视频| 琪琪精品免费一区二区三区 | 在线日韩视频| 97超碰热线| 亚洲综合69| 九九无码久久精品视频| 丁香五月天视频| 国产伦精品免编号公布| 人妻大香蕉| 思思热一热婷婷热一热| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 日韩精品国产精品五码一区二区| 97 超碰 人人做 人人爱| 日本久久久精品电影| 天天澡天天狠天天天做| 成人无码影片视频在线| 99re这里只有精品3| AV久日| 2021国产成人精品久久| 亚洲精品色| 999九九精品| 日韩射精| 六月丁香久久| 97ai亚洲| 久久肏大逼| 精品97久久综合| 午夜欧美精品久久久| 久久riav中文精品| 久久这里精品国产99丫e6| 玖玖无码超碰| 日韩性爱网址| 亚洲青青草| 国产成人超碰在线| 校园春色欧美色图| 日韩字幕一区| 久久曰曰| 多毛小伙内射老太婆| 极品丝袜无码| 人人操人人摸人人骑| 五月婷丁香| 亚洲中字慕不卡| 亚洲黄色网址视频| 夜夜 中文视频rt| 欧美性爱第一页久久| 成人综合色网| 一级做受视频免费是看美女| 亚洲91网。| 欲香欲色| 成 人 影视 一区 二区 三区 四区 | 极品另类| 久久色一区| 2024年最新色情网站在线观看| 国产 日韩 欧美 人妻 熟女 中文| 国产青青综合伊人| 激情四射婷婷四五月天| WWW.操逼.COM| 欧美999999| 久久东京伊人一本到鬼色| 噜噜噜久久亚洲精品色情| 自拍偷拍亚洲熟女妇人精品| 天天综合网亚洲综合网| 67194国产| 91综合网| 日韩情色AV| 成人亚欧免费视频| 9久9久| 深夜啪啪啪视频免费| 女人综合网| 激情图片亚洲色图| 亚洲 欧美 手机在线观看| 粉嫩久久久极品| 色五月激情网| 欧美偷拍区| 日韩中文字幕精品一二三事国产精品| 婷婷色影院| 老女人综合网| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 热久久这里只有精品| 国产搭汕a级片| 婷婷中文字幕| 人人看人人插| 欧洲一区二区| 吉川爱美98堂在线| 激情专区综合| 先锋激情∨在线视频播放| 久久是精品| 懂色综合久久久| 69少妇一区二区| 日本一卡二区在线| 色偷偷色偷偷欧美日韩| 综合网欧美在线| 久久久亚洲高清不打码| AVE乱伦| 蜜臀aV午夜一区二区三区| 色色操| 欧美日韩黄片精品在线| 国产人妻久久精品一区二区三区| 亚洲欧美日产国产91毛片| 自拍鲍鱼一区在线高清观看免费| 久久久精品中文字幕爱豆| 国产精品久久久久久久黄无码| 夜夜嗨一区| 夜夜嗷嗷一区二区| 综合网欧| 久久99黄色卞西瓜| 五月丁香六月婷| 亚洲欧洲中文日韩女优乱码| 国产欧美另类久久久精品课程| 97bbn| 亚洲欧美九九九| 五月丁香影院| 人人色人人操在线| 在线人人人人人人精品超| 日本东京热久久久电影| 亚洲欧美另类小说| 大香蕉人妻久久| 国产外初女出血视频| 九九玖玖精品| 午夜福利久久久噜久噜久久综合 | 婷婷久久综合| 一区二区娱乐网站| 婷婷视频在线免费观看| 中文字幕乱在线伦视频中文字幕乱码在线 | 成人av在线播放| 久久9久| 婷婷性网| 果冻传媒A片麻豆熟妇人妻| 91爱欧美| 9118禁| 无码人妻一区二区三区免费九色| 操淫穴亚洲五月丁香| 日本三级小说中文字幕| 国产伊人自拍| 精品国产网站| 国产suv精品一区二区四区999| 亚洲成人久久美女| 人人插人人搞人人操| 天天日天天搞天天干| a'v在线资源| 1区2区3区视频| 亚洲男人的天堂va亚洲男人社| 97精品全部| 亚州欧美在线| 亚洲男人电影天堂| 熟妇综合一区二区三区| 一起草三级AV电影在线观看 | 成人三级片无码| 91人妻做a观看视频| 色婷婷视频| 久久久久成人亚洲国产| 极品色www影院| 欧美性爱五月天| 色婷婷电影网| 91九九九馒头| 亚洲欧美日韩电影网站一区 | 69少妇一区二区| 免费一级a毛片久久久久久鸭绿欲| 三级激情网站| 国产精品岛国片在线观看| 欧美性爱另类综合| 国产成人资源| 97国产色图| 久久av色| 精品九九国产无码| 美女被艹尤物视频| ′ !γ}丶。。久久精品欧美一区二区三区| 九九九九九九九精品视频| 午夜天天碰综合视频| 青青草视频在线观看一区二区| 天美传媒AV国产在线| 成人夜夜| 国产日韩无码一区二区三区久久区| 精品毛片av一区二区 | 国产极品999| 天美传媒Av在线| 密臀成人视频久久久| 欧美综合另类| 中文字幕免费看大片| 国产玖玖| 91国内外在线| 亚洲美女AV无码| 亚洲高清无毛一区二区| 99热只有| 91九九九吃| 中文字幕丰满子伦无码专区在线视频最新| 巨爆乳一区二区爆乳区| 超碰在线91| 超碰97最新人妻| 91女人的网站| 精品少妇后入一区二区三区四区人妻巨乳| 综合网~91综合网| 91精品久久久久| 收看日本人日bb| 99热这里都是精品| 久久精品女同亚洲女同13| 操国产逼| 欧美第一页性| 97资源亚洲| 福利在线观看一区二区| 日本999精品视频| 国产精品久久久久久久久AV大片| 亚洲色悠悠久久88| 日韩有码 一区二区三区| 大香蕉五月天| 亚洲欧美啪啪| 岛国AB视频| 国产精品亚洲四五区在线观看| 免费在线视频97| av日韩手机在线影视| 亚洲精品少妇| 黄色电影观看久久9| 中文字幕在线免费观看| 静品嫩模一区二区| 日韩欧美蜜桃精品久久中文字幕久久| 欧亚性爱在线视频| 无码男人天堂| av在线一区二区三区| 啊啊啊好舒服好爽啊啊啊视频| 啊啊啊免费视频| 九九99久久| 夜夜春夜夜操| av片在线观看免费播放| 精品二区三四区五电影| 日本精品高清一二区一本到| 九九av| 欧美顶级黄色大片免费| 大香蕉青青9| 四虎国产精品永久地址入口| 最新精品久久蜜桃 | 成人五级久久| 亚洲欧美setu| a v网站在线播放| 日本五区不卡| 丁香五月激情五月| 9118禁| 欧美老熟另类| 免费自拍三级综合| 曰本道人妻久久久在线不卡色视频| 午夜寂寞欧美| 少妇熟女一区二区三区| 成 人 影视 一区 二区 三区 四区| 加勒比伊人| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 人人妻人人澡人人爽久久av| 亚 欧 美 综合| 青娱乐国产剧情av一区| 大香蕉伊人在线成人AV在线观看| 国产乱色国产精品免费视| 综合91网| www.色婷婷| 色吧5亚洲| 亚精品无码毛片一区二区三区| 国产中文字幕曰本毛片| 一区二区三区不卡视频| 天美传媒在线一区| 人人操人人狠狠操| 日韩有码 一区二区三区| 无码男人天堂| 日韩丝袜人妻AV| 国产又黄又粗的视频| 亚洲AV在线资源| 嗯嗯啊啊视频在线看| 无码人妻精品一区二区三区99不卡| 久久久久久久久久久久九| 偷窥自拍亚洲天堂网爆| 国产无码久久高清| 亚欧操逼片在线观看 | 综合久久欧美| 国产欧美日本亚洲精品| 午夜福利 成人 91| 中日韩久久人妻一区二区| 色爱三区| 亚洲国产奇米影视久久| 亚洲色天| 久久九九97| 色网在线| 亚洲日本男人天堂网| 久久草在线综合视频| 国产欧美日本亚洲精品 | 91校园春色长篇| 在线观看岛国有码| 免费观看成人www精品视频| 日韩欧美天堂| 成人天天爽| 99国产在线绯色一区| 色五月婷婷色| 久久精品国产亚洲AV无码电影| 探花精品 一区二区| 久久r精品| 久草精品一区| 国产精品欧美激在线| 欧美第一页性| 九九在线精品| 国产福利精品最新在线| 亚洲国产尤物yw在线观看| 亚洲九九九| 欧美日韩精品青青| 欧美色日| 屁股久久久久久久久| 97看操| 亚洲五区熟女| 精品97精品97| 中国黑人三级片网站上区| 伊人大香蕉在线| 97操97色| 色狠狠综合噜一二三区| 欧美成不卡网| 10000部十八禁看电影| 欧美日韩人人精品| 欧中日成人免费影视| 四虎AV无码| 禁止观看美女黄| 极品粉嫩一区二区| 亚洲人妻熟妇三十三区| 久久少妇视频| 乱子伦一区二区三区国产精品| 夜夜嗷嗷一区二区| 国产亚洲精品美女| 色妇91| …中文字幕亚洲乱,97人妻无码费视…| 国产精品一区二区后入| 亚洲好色人妻| v91av| 日本淫乱女一区二区三区视频| 国产深夜福利| 日本欧美韩国国产在线| 少妇xx精品| 天天日天天干天天整| 国产尹人在线视频免费| 91 国产丝袜在线播放-百度| 日韩欧美成人大香蕉| 一二三啪啪专区| 国产丝袜美腿美女麻豆| 91l欧美在线| 久草男人天堂| 漂亮人妻被强中文字幕hd| 久久久久久加勒比| 手机午夜电影神马久久| 精品人体无圣光凹凸| 免费操逼视频下载| 99色悠悠| 日本超碰色精品| 黑人性欧美| 家庭乱伦麻豆| 欧美人妻精品一区二区| 五月天激情网站| 99操| 国产91美女视频| 日韩免费a级毛片无码a∨| 樱花蜜乳av| 亚洲成人免费电影| 东北女人| 一二三区精品视频| 蜜乳AV.COM| 六月丁香啪啪| 蜜臀久久在线视频| 在线欧美亚洲| 久久黄色性爱视频| 操九九九九九九| 中国黄色特级精品一区二区三区片| 午夜精品久久久久久久第一页按摩| 天天看精品动漫视频一区| 青青草在线视频欧美| 日本高清一本二本免费不卡| 欧洲特黄毛片免费看欧洲毛片| 欧美熟女操屄| 中 文字幕一区二区三四 五 区日 日 骚 | 啊v视频在线观看| 日本色婷婷| 99色骚| 亚洲精品九九九| 天天天天天天天天天天干美女| 欧美超碰9798| 蜜区区视频79 | 亚洲一区二区性爱电影| 欧美一二三区四五区| 口爆综合网| 老汉网| 久久精品国产亚洲粉嫩| 999亚洲国产视频| 国产不卡精品91| 亚洲丝袜二区在线| 91爆操视频| 中文字幕88av在线| 91精品国产91久久青草| 91chinese在线| 亚洲欧美变态| 久久精品国产亚洲AV无码电影| 白丝jkav| 乱伦一二三区| 99久久综合| 牛牛AV人人夜夜澡人人爽| 美女诱惑爱爱| 亚洲欧美不卡线| 99精品久久| 精品人妻久久久| 亚洲av无码成人精品国产| 中国一级操逼视频| 美女毛片999| 99在线免费公开视频| 久久97资源 网| 18禁无码永久免费无限制| 精品无码一区二区| 亚洲天堂在线怕怕视频| 丝袜性亚洲| 看免费的黄片| 麻豆 亚洲 97| 特级毛片特黄久久免费看| 97精品97久久| 99日精品欧美国产| 日韩人妻无码不卡网站| 日本久久99| 97综合国产| 婷婷综合在线观看| 欧美激情性爱视频网站| 中文字幕久久亚州无码| 在线强奷到舒服的无码视频| 97在线亚洲| 一区二区偷拍拍视频| 97视频在线免费观看| 永久免费发布性爱网| 九九九九九九九九九五码| 日日夜夜精品| 天天综合网亚洲综合网| 91一起操| 亚洲欧美国产中文视频| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 日韩无码操逼片| 蘋果手機免費看成人Av| 亚洲高清无码免费观看视频| 97国产精品一区二区传媒公司| 78综合网| 亚洲 一区二区 自拍| 东北女人高潮视频| 老熟女区| 国产麻豆一级精品视频| 99re9| 国产第二页| www.婷婷| 自拍偷拍 高清无码| 欧美—性—交—色| 综合 青草 伊久久 影院 综合| 亚洲aw毛茸茸在线| 日韩精品在线观看网站| yw尤物av无码点击进入麻豆| 日韩 女同 综合| 爽爽淫人网| 东京热男人的天堂精品| 人人妻人人玩人人澡人人爽| 99色婷婷中文字幕乱色| 天天日天天插| 亚洲成人美女无吗| 草草电影院| 亚洲日韩狠狠撸视频| 97中文字幕色| 99色综合| 久久免费精品视频免一| 激情五月综合开心五月| 超碰久超碰久| 熟女精品一区二区在线观看| 久久久久久久久久久久久9999| 成人乱码一区二区三少妇| 精品无码久久久久久久杏吧| 日韩在线观看AV| 国产一区二区三区,在线观看观看| 欧美成人精品A片免费一区99| 亚洲成人日韩小说| 精品无码一区二区三区色欲| 日本久久久久久久久久| 国产乱码久久久久久| 免费人人搞97| 亚洲色堂免费视频| 婷婷五月激情综合| 丰满人妻一区二区三区大胸懂色 | 亚洲熟妇自偷自拍另欧美| 狠狠色噜噜狠狠狠狠狠色综合久久| 国产色图乱伦| 亚州综合色| 国内一级精品| 欧美色蜜桃97| 玖色av| 久久久精品视频欧州站| 日韩欧美偷拍美女视频| 日夜干射色啊| 青女在线| 夜夜骑天天燥| 久久日本熟女精品一区| 日韩啪啪啪视频| 伊人国产视频| 91爰爱欧美| 日本999精品| 日韩钢筋无码高清啾啾啾| 91欧美长吊| 欧美在线伊人色| 九久9热| 嗯……啊…嗯嗯…啊…好舒服| 99丝袜福利在线播放| 久久国产视频性吧 | 传媒免费一区二区三区| 狠狠热这里都是精品| 中文字幕一区二区三区人妻少妇在线| 久热69九色熟妇97| 国产精品经典一卡久久久| 骚乳在线| 亚洲美女色图| 91黑丝操| 91高清欧美| 爱逼综合| 黄色免费网| 人人操人人操人人人操| 久久av成人无码免费| 亚欧高清在线| 992这里有精品| 天天操天天射青青草| 91欧美长吊| 啊啊啊啊啊好舒服视频| 偷偷人人精品女女久久| 欧美人妻少妇| 26uuu欧美日韩| 中文字幕免费看大片| 99热| 欧亚日韩三区| 啊啊在线| 强奸抽插av| 夜嗨影院| 婷婷香蕉欧美在线一区二区三区| 色999偷自拍拍| 五月婷婷青青草娱乐伊人| 欧美色九九| 久久黄片国产一区二区| 怡红院一区二区熟女人妻| 啊啊啊啊一区| 欧美传媒一区| 91丝袜在线观看| 99国产精品视频尤物| 亚洲AV免费在线| 久久九七| 男人的天堂VA| 18禁精品网站在线看| 婷婷丁香在线| 亚州综合图片| 超碰78| 亚洲精品aa久久伊人| 在线观看十八禁| 国产欧美日产一区二区三区 - 国产欧美日| 91性片| 约操熟妇| 91国产丝袜足交精品视频| 91精品少妇搡搡搡| 国产丝袜欧美在线视频| 99色在线视频| 亚洲的天堂网| 日本国产亚洲一区在线观看| 岛国精品视频在线观看 | 亚洲精品乱码线路中文字幕| 色色色综合网| 日韩丨制服丨中文|在线| 国产一区二区三区高清视频| 日韩中文字幕二区| 玖玖草久草99蜜月一区二区三区| 欧美亚洲中文| 超碰在线成人| 破处bbq| 丰满岳乱妇一区二区三区| 色av中文字| 黑人性欧美| 婷婷丁香五月天综合东京热| 国产精品欧美激在线| 校园春色综合网| 天天射影院| 97在线视频观看免费| 久久久亚洲欧美综合| 青青青国产| 国产白丝av| 91蜜桃婷婷狠狠久久综合9色| 国产蜜臀在线| 中国东北熟女老太婆内谢| 性色国产东北露脸精品视频| 人人爱人人乐人人操| 亚洲影视综合网| 国产美女自拍视频| 丁香激情五月天| 春色91| 欧美日韩成人| 91A欧美电影网站| 99热91| 日本Suv精品一区二区| 亚洲图片欧美在线视频| 亚洲丝袜二区在线| 婷婷色中文字幕| 九九热精品视频六| 99热婷婷| 亚洲国产97| 亚洲最大黄网| 成人五级久久| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 欧美色吧综合| 久9热| 欧美性性性| 国产精品一二三免费网站| 久久高潮妇女视频| 欧美综合骚| 免费A片三p视频| 亚洲欧美国产中文字幕| 插穴性爱视频在线观看| 日韩精品一区,二区 九九...老司机| 亚洲日韩美女中文字幕乱| 天堂精品| 五月丁香综合激情| 懂色aV一区二区天美传媒| 美腿色图| 性在久久久久久| 天美av在线| 伊色综合天堂色97| www.91人妻.com| 校园春色家庭伦理欧美激情| 色噜噜婷婷| 久久久性| 91国精产品| 欧洲色| 精品人妻1区| 欧美特黄视频网站| 天天综合亚在线| 日韩av不卡在线看| 97操碰| 宅男午夜在线视频| 风流老熟女一区二区三区l| 国产97av| 超碰97玖玖爱| 天美麻花大全视频| 人人搞人人插人人操| 国产第二页| 欧美色五月| 岛国激情视频在线观看| 欧洲亚洲人妻无码久久三区四区| 久草精品热视| 人人操人人叉人人插人人| 999久久久九九九九| 白 大 人妻 区 在线| 粉嫩AV一区夜夜嗨| 亚洲无码一区二区三区三州| 五月天啪啪| 中国一级αV| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 极品粉嫩一区二区| 国模不卡| 丝袜美腿亚洲| 黑人粗大V S日韩女优视频| 女人的久久久| 亚洲乱伦图片视频| 久久久999| 欧洲自拍第一页| 97看操| 小草三级久久观看| 日本一级性爱| 国产乱色国产精品免费视| 欧美78P| 欧美天天在线| 最新av在线| 97视频在线视频| 看日韩操逼| AAAA级日本片免费视频| 久久宗合97| AV99热18这里只有精品| www四虎| 国模精品娜娜一二三区| 国产精品久久久久久久AV大片 | 亚洲网站一区二区在线| 久久成人东京热人妻| 国产白丝在线| 亚洲色图加勒比| 天天色悠悠激情| 色婷婷电影网| 国产一区二区三区影片| 中文字幕交换人妻| 美女视频尤物网在线看| 中文字幕av亚洲精品| 成人怡红院| 精品国产乱码久久久A| 在线播放欧洲免费av| 怡红院亚洲怡春院av| 亚洲精品一区二区免费在线观看| 国产一区二区三区不卡手机在线| 欧美日韩色图片| 亚洲 欧美 91| 999久久久精品国产| 香蕉久久国产AV一区二区| 日本日皮视频逼| 丰满人妻一区二区三区大胸懂色| 18禁网站在线播放| av无码av无码专区| 亚洲欧洲精品视频发布| 久久黄色视频一区二区三区| 另类小说综合网| 9丨亚洲一区二区在线| 粉嫩av平台| 亚洲国产另类在线中文| 国产精品久久久啊| 国产在线能看的你懂的| 国产亚洲99久久精品熟| 91被操| 在线观看无码三级少妇| 久草国产在线视频| 九月丁香综合网| 黄色片大香蕉| 五月婷丁香| 97视频在线免费看| 蜜桃在线观看一区二区三区 | 男人天堂久久精品不卡| 色综合1991| 综合五月天| 亚洲精品九九九| 翔田千里爆乳巨臀无码| 日韩综合无码色欲vv| 黄色小视频日本txt| 99久久网站| 操狠狠| 青青草视频导航官网| 激情小说亚洲视频| 自拍六区| 日韩免费av片高清无码| 国产精品极品美女视频| 一级A啪啪啪啪| 亚洲人精| 青娱乐手机日韩在线视频| 国产熟码AV| 97天堂| 97在线观看播放视频| 久久露脸国产老熟女| 久操视频免费在线观看| 91网站视频在线观看| 久草电影网| 一级做受视频免费是看美女| 国产精品亚洲天堂网址| 97综合在线| 日韩少妇丰满亚洲| 天天干夜夜| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 日韩精品1区2区中文字幕| 人妻少妇色综合| 亚洲日韩青青草色月| 2019男人的天堂| 亚洲综合网电影91| 97精品视频免费| 欧美日韩制服| 人人看人人爰人人操| 人妻少妇色综合| 国产十八禁视频| 久久精品店| 操逼逼福利视频| 男人天堂.AB| 天天影视综合色| 大香蕉www.超碰| 久久极品一区二区| 呻吟 欧美 日本 中出| 黄色视频高清无码网站| 国产AV超爽| 97超级欧美| 97日韩| 九九性爱网| 97在线观看免费视频l| 国产400孕妇孕交群| 天天精品| 成人十八禁日韩欧美一二三| 精品九九九九九| 性一交一乱一交A片久久四色| 亚洲欧美日产国产91毛片| 麻豆久久一区二区三区| 丁香色五月 97干| 欧美大干日韩| 九九热久久99精品re| 中文无码一二三区| 蜜臀久久99精品久久久久久成人小说 | 大香蕉淫人| 大伊香蕉在线视频免费| 久久伦理视频久久大香蕉视频| 亚洲阿v天堂在线| 亚洲有码 欧美精品| 国产美女91| 亚洲欧美日韩夜夜| 97精品在线| 免费公开人人操| 1204金沙人妻懂旧版免费| 乱伦一二三区| 涩爱AV在线| 亚洲一区日韩精品中文字幕| 女人的久久久| 色噜噜国产精品视频一区二区| 亚洲av无码成人精品国产| 白嫩妹子国产骚| 人妻99p| 中日韩久久久免费看| 在线观看日韩av不卡| WWW美腿丝袜香蕉中文| 日本色色色色色视频| 午夜精品人妻二区三区| 操高情无码| 丝袜狠狠草尤物 91| 欧美强奸乱能| 久久华人网| 亚欧色图在线激情| 神马麻豆福利院 | 97视频免费播放| 亚洲综合五月天| 最新AV在线| 91美女中出| 国产熟女无套内射| 中文字幕日韩综合| 97久久精品| 色鬼在线综合| 欧美亚洲一级在线观看| 伊人玖玖网| 日本操嫩b网| 欧洲一区二区| 碰碰在线视频| 日韩欧美性吧婷婷乱伦大香蕉| 亚洲色图 欧美热图 清纯唯美 另类自拍| 日韩性爱啪啪视频| 日本黄色裸日本黄色裸体 | 懂色AV中文| 欧美强奸乱| 亚洲欧美骚| 欧美综合第一| 国产精品视频| 亚洲各类熟们中文字幕| 人妻丝袜日本| 五十路熟女工口| 欧亚性爱视频免费看| 美女诱惑久久| 老熟妇综合| 免费人成?大片在线播放| 青草一区二区| 精品人妻视频一区二区三区蜜桃视频| 99re公开精品免费视频 | 乱老女人一区二区视频| 78久久| 色超碰综合| 久久久久久人妻| 在线人成亚洲视频免费观看| 日本久久999| 淮穴色AV| 成人八戒网站| 亚洲欧美天堂| 狠狠爱AV| 无码一区二区三区四区五区六区七区八区九区十区视频 | 人人模人人看| 色欲久久99精品久久| 淫色网综合| 色婷亚洲五月在线观看| 无码操逼视频一下| 亚洲午夜精品久久久中文影院| 91天美传媒精品| 97久久视频| 国产黄片在线免费观看| 亚洲欧美小说| 久久久九| 久久免费精品96| baisiav| 国产动漫操逼视频| 欧美日韩免费性爱| 99色网| 婷婷8月天青娱乐| 91美女色视频亚洲| 亚洲精品一区二区三区新线路| 久久人人爽人人爽人人片Ⅴ| 免费一级性爱久久| 2017大香蕉| 国产丝袜啪啪| 亚洲国产亚洲天堂| 日韩一级二级在线| 久久精品国产精品亚洲艾通辽熟妇| 亚乱色| 精品人妻中文字幕4399| 青娱乐国产剧情av一区| 日曰骚久久精品| 日韩专区久久久| 麻豆成人av| 岛国人妻少妇av在线观看| 96久久科窝| 天堂精品在线| 婷婷九月色| 蜜桃无码AV一区二区| 亚洲 日韩 丝袜 熟女 变态| 国内精品a| 亚洲无码超碰免费| 男女性无套 免费九一| 国产400孕妇孕交群| 天天狂操夜夜狂日| 欧美丝袜中文字幕07在线| 精品女同一区| 综合网亚洲1| 亚洲久久东京热一二三四五区视频| 97精品97| 色九九九综合| 1204金沙人妻懂旧版免费| 丰满搜索结果 -第18页- 久久高清无码| 亚洲国产精品乱码在线观看| 国产91美女高潮| 激情自拍 校园春色| 五月天婷婷影院| www.婷婷六月天| 国产 日韩 欧美 人妻 熟女 中文| 久久婷婷亚洲| 人人摸人人干| 久久天天摸| 91色黑人少妇| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚 | 殴洲老熟女| 精品久久久久久AV无码| 国产精品内射婷婷一级二| 欧美国产精品久久九九| 四虎国产精品永久在线囯在线| 久久国产在线一区二区| 欧美18老人禁| 人妻在线臀日韩| 欧美情色男人的天堂|