久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

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

Java Swing+MySQL學(xué)生選課系統(tǒng):JDBC事務(wù)與數(shù)據(jù)庫(kù)設(shè)計(jì)實(shí)戰(zhàn) 簡(jiǎ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界面開(kāi)發(fā)與MySQL數(shù)據(jù)庫(kù)交互。資源包共3個(gè)文件總大小3.34MB包含項(xiàng)目源碼壓縮包、數(shù)據(jù)庫(kù)初始化SQL腳本及一份課程設(shè)計(jì)實(shí)訓(xùn)報(bào)告docx按“源碼—數(shù)據(jù)—報(bào)告”組織結(jié)構(gòu)清晰便于對(duì)照使用。已有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)待過(guò)大概率見(jiàn)過(guò)這種場(chǎng)景教務(wù)老師還在用 Excel 維護(hù)幾百人的選課名單學(xué)生要發(fā)郵件或者跑到辦公室才能改選一次課。這套基于 Java Swing MySQL 的學(xué)生選課管理系統(tǒng)目標(biāo)就是把“課程信息維護(hù)、學(xué)生選課、退課、成績(jī)錄入、統(tǒng)計(jì)查詢”這幾件高頻事收斂到一個(gè)桌面程序里。它是 Java 課程設(shè)計(jì)里最經(jīng)典的題目之一難點(diǎn)不在業(yè)務(wù)邏輯而在你把 Swing 界面事件、JDBC 事務(wù)、數(shù)據(jù)庫(kù)表關(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)目來(lái)鍛煉 JDBC 和 GUI 編程的開(kāi)發(fā)者。它的價(jià)值在于選課系統(tǒng)天然包含一對(duì)多、多對(duì)多的表關(guān)系你能在一百來(lái)行 SQL 里把外鍵約束、級(jí)聯(lián)刪除、事務(wù)回滾這些概念全部實(shí)戰(zhàn)一遍比刷十道練習(xí)題都管用。我對(duì)這套組合的評(píng)價(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)畫(huà)、圖表或富媒體需求不然 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)程不退出”這類問(wèn)題隨便搜一下就有現(xiàn)成答案第三Swing 的組件模型足夠完成選課系統(tǒng)里所有的需求包括表格展示課程列表、下拉框選擇院系、文本域錄入反饋意見(jiàn)。JavaFX 雖然界面更現(xiàn)代但它需要獨(dú)立 SDK、可能在 IDEA 里需要額外配置 VM 參數(shù)這對(duì)一個(gè)以“快速跑通、順利答辯”為目標(biāo)的實(shí)訓(xùn)項(xiàng)目來(lái)說(shuō)是多余的復(fù)雜度。你交的是“學(xué)生選課管理系統(tǒng)”不是“交互動(dòng)效展示平臺(tái)”Swing 的平庸恰恰是它的優(yōu)勢(shì)。我現(xiàn)在做這類桌面工具時(shí)一般先用 Swing 做原型如果后續(xù)確實(shí)需要更精致的界面再考慮遷移到 JavaFX 或者干脆改成 Web 版但那是后話了。2.2 MySQL 5.7 還是 8.0先看你手頭的環(huán)境數(shù)據(jù)庫(kù)方面這個(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ù)庫(kù)時(shí)會(huì)報(bào)時(shí)區(qū)錯(cuò)誤。如果你用 5.7驅(qū)動(dòng)類名是com.mysql.jdbc.DriverURL 則不需要帶時(shí)區(qū)參數(shù)但兩者在代碼里混用會(huì)導(dǎo)致 ClassNotFoundException 或者奇怪的通信異常。另一個(gè)常見(jiàn)坑是 MySQL 8.0 的加密規(guī)則。如果你在連接時(shí)遇到 “Public Key Retrieval is not allowed” 的錯(cuò)誤在 JDBC URL 后追加allowPublicKeyRetrievaltrueuseSSLfalse就能解決。這個(gè)參數(shù)不寫(xiě)在驅(qū)動(dòng)代碼里而是寫(xiě)在連接字符串里。下面是一個(gè)兼容 MySQL 5.7 和 8.0 的 JDBC 配置模板我一般會(huì)寫(xiě)在db.properties文件里方便以后修改jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/course_select?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue jdbc.usernameroot jdbc.password123456這段配置里characterEncodingutf8是為了避免中文亂碼serverTimezoneAsia/Shanghai只對(duì) MySQL 8.0 有效useSSLfalse是因?yàn)楸镜亻_(kāi)發(fā)不需要加密連接能省去證書(shū)配置的麻煩。注意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ù)訪問(wèn)層 │ │ ├── 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 方法寫(xiě)在某個(gè)界面類里否則后續(xù)做單元測(cè)試和代碼審查都會(huì)別扭。另外我建議把init.sql放在項(xiàng)目根目錄下的sql文件夾中這樣實(shí)訓(xùn)報(bào)告里可以直接引用建表語(yǔ)句答辯時(shí)也方便演示。3. 數(shù)據(jù)庫(kù)設(shè)計(jì)與初始化從三張表到兩個(gè)核心事務(wù)3.1 表結(jié)構(gòu)設(shè)計(jì)學(xué)生表、課程表、選課表再多一張就是冗余選課系統(tǒng)的核心數(shù)據(jù)模型是三張表學(xué)生表student、課程表course、選課關(guān)系表selection。其中選課表是連接前兩張表的多對(duì)多關(guān)系表它只存student_id和course_id兩個(gè)外鍵以及選課時(shí)間、成績(jī)這兩個(gè)業(yè)務(wù)字段。為什么要單獨(dú)拆出來(lái)而不是在學(xué)生表里加一個(gè)course_ids字段因?yàn)殛P(guān)系型數(shù)據(jù)庫(kù)的設(shè)計(jì)原則是“一行只表達(dá)一個(gè)事實(shí)”你在學(xué)生表里塞一個(gè)逗號(hào)分隔的課程 ID 列表后續(xù)統(tǒng)計(jì)“每個(gè)課程選了多少人”的時(shí)候就只能靠字符串分割既慢又容易出錯(cuò)這種反模式在面試?yán)镆彩堑湫偷目鄯猪?xiàng)。下面是初始化 SQL我在課程設(shè)計(jì)項(xiàng)目里慣用的寫(xiě)法是這樣。注意我刻意用了ENGINEInnoDB和CHARSETutf8mb4并打開(kāi)了外鍵約束-- 學(xué)生表 CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 學(xué)號(hào)主鍵, student_no VARCHAR(20) NOT NULL UNIQUE COMMENT 學(xué)號(hào)唯一索引, 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 班級(jí), 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 課程編號(hào), 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 成績(jī)教務(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)系表;這里說(shuō)明幾個(gè)設(shè)計(jì)決策第一student_no用UNIQUE而不是直接做主鍵是為了讓主鍵id在后續(xù)關(guān)聯(lián)時(shí)保持穩(wěn)定學(xué)號(hào)即使被教務(wù)處調(diào)整也不影響已有選課關(guān)系第二course表里的selected_count字段是冗余設(shè)計(jì)主要是為了方便在課程列表界面直接展示已選人數(shù)不用每展示一行課程就COUNT(*)一次這個(gè)字段可以通過(guò)事務(wù)保證一致第三selection表上的UNIQUE KEY uk_student_course是防重復(fù)選課的關(guān)鍵應(yīng)用層就算代碼有并發(fā)問(wèn)題數(shù)據(jù)庫(kù)這一層也會(huì)攔住重復(fù)插入。3.2 初始化數(shù)據(jù)與事務(wù)演示把實(shí)訓(xùn)報(bào)告的案例測(cè)出來(lái)建表之后建議你順手插入幾條演示數(shù)據(jù)方便后面測(cè)試登錄和選課功能。這個(gè)數(shù)據(jù)集不要太大一兩百個(gè)學(xué)生、二三十門(mén)課足夠。插入時(shí)注意學(xué)生密碼我用的是123456真實(shí)環(huán)境里應(yīng)該加密存儲(chǔ)但作為課程設(shè)計(jì)演示明文密碼在實(shí)訓(xùn)報(bào)告里更容易講清楚認(rèn)證流程。下面這段 SQL 用于插入 5 個(gè)學(xué)生和 5 門(mén)課程并且預(yù)置一條選課記錄用來(lái)驗(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, 錢(qián)七, 網(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ù)庫(kù)原理, 劉老師, 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ù)庫(kù)原理 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)跑這兩條語(yǔ)句需要記得把selected_count一起UPDATE掉否則界面上的已選人數(shù)不準(zhǔn)確很容易在演示的時(shí)候被老師挑出毛病。4. 用 JDBC 寫(xiě)一個(gè)永不串號(hào)的學(xué)生端選課邏輯從連接池到事務(wù)4.1 數(shù)據(jù)庫(kù)連接工具類別把連接參數(shù)散落在各處寫(xiě) Swing 界面時(shí)最容易出現(xiàn)的情況是每個(gè)按鈕事件里都直接寫(xiě)DriverManager.getConnection(url, user, password)結(jié)果換一臺(tái)電腦跑項(xiàng)目時(shí)要全局搜索替換數(shù)據(jù)庫(kù)密碼。這種做法在課程設(shè)計(jì)里不算致命但會(huì)讓你的代碼在實(shí)訓(xùn)報(bào)告里顯得很業(yè)余。我建議你寫(xiě)一個(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是在注冊(cè) JDBC 驅(qū)動(dòng)MySQL 8.0 的驅(qū)動(dòng)在 SPI 機(jī)制下可以省略這行但寫(xiě)上它能讓驅(qū)動(dòng)加載過(guò)程更明確排查問(wèn)題時(shí)也少一個(gè)變量。close方法里我把ResultSet、Statement、Connection的關(guān)系理清楚關(guān)閉順序必須從里到外否則你可能會(huì)在日志里看到連接泄漏。這里我沒(méi)有引入連接池因?yàn)?Swing 桌面應(yīng)用是單用戶模式并發(fā)量極低每次操作新建連接、用完即關(guān)就夠了。如果后續(xù)你把它改造成多用戶并發(fā)訪問(wèn)再考慮換成 HikariCP但現(xiàn)在不要過(guò)度設(shè)計(jì)。4.2 核心選課事務(wù)先查容量再插入最后更新計(jì)數(shù)下面是選課功能里最關(guān)鍵的一段代碼。我把它寫(xiě)在SelectionDao.selectCourse(int studentId, int courseId)方法里這個(gè)方法要承擔(dān)兩個(gè)職責(zé)一是檢查課程是否已滿、學(xué)生是否已選過(guò)二是完成插入選課記錄并更新課程已選人數(shù)。整個(gè)過(guò)程必須在一個(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(); // 開(kāi)啟事務(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)選過(guò)這門(mén)課 } // 第三步插入選課記錄 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); } } }這段代碼的邏輯說(shuō)明如下。第一步里FOR UPDATE是關(guān)鍵它會(huì)在事務(wù)期間鎖住course表里那一行其他事務(wù)要更新同一行時(shí)必須等當(dāng)前事務(wù)提交或回滾。第二步的重復(fù)檢查能攔截大部分重復(fù)插入但由于應(yīng)用層可能并發(fā)執(zhí)行數(shù)據(jù)庫(kù)層的外鍵約束和UNIQUE索引仍然是最后的兜底防線。事務(wù)的提交或回滾都放在try-catch里任何一個(gè)步驟失敗都會(huì)把所有改動(dòng)回滾避免出現(xiàn)“選課記錄插入成功但課程已選人數(shù)沒(méi)更新”的數(shù)據(jù)不一致。這里有個(gè)參數(shù)值得你注意setAutoCommit(false)必須在getConnection()之后、第一條 SQL 執(zhí)行之前調(diào)用如果放在finally里再改回去就沒(méi)有意義了。另外這個(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)用完了所以沒(méi)有踩坑但更規(guī)范的寫(xiě)法是為每一步查詢單獨(dú)準(zhǔn)備Statement和ResultSet。這是我在實(shí)際開(kāi)發(fā)中踩過(guò)的坑所以特別提醒你。4.3 Swing 事件線程按鈕點(diǎn)擊之后代碼跑在哪里Swing 是單線程模型所有界面更新必須在事件分發(fā)線程EDT上執(zhí)行。這里有個(gè)常見(jiàn)的做法是在按鈕的事件監(jiān)聽(tīng)器里直接調(diào)用SelectionDao.selectCourse()然后根據(jù)返回值彈出JOptionPane提示框并刷新表格模型。這個(gè)做法對(duì)于課程設(shè)計(jì)來(lái)說(shuō)沒(méi)有問(wèn)題因?yàn)楸镜財(cái)?shù)據(jù)庫(kù)查詢很快你不會(huì)感受到界面卡頓。但如果你把項(xiàng)目擴(kuò)展到網(wǎng)絡(luò)數(shù)據(jù)庫(kù)或者數(shù)據(jù)量變大就需要在SwingWorker里執(zhí)行 JDBC 操作避免 EDT 被數(shù)據(jù)庫(kù) IO 阻塞導(dǎo)致界面無(wú)響應(yīng)。下面這段代碼是選課按鈕的典型實(shí)現(xiàn)我把刷新表格數(shù)據(jù)的邏輯一起寫(xiě)進(jìn)去btnSelectCourse.addActionListener(e - { int selectedRow courseTable.getSelectedRow(); if (selectedRow 0) { JOptionPane.showMessageDialog(this, 請(qǐng)先在表格中選擇一門(mén)課程); 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, 選課失敗課程已滿或已選過(guò)該課程); } });這里有一個(gè)培訓(xùn)時(shí)經(jīng)常被忽略的細(xì)節(jié)JTable的getSelectedRow()返回的是視圖模型view的行索引而表格數(shù)據(jù)我們存放在DefaultTableModel中兩者在表格經(jīng)過(guò)排序或篩選后可能不一致。如果課程表格只是順序展示沒(méi)有排序功能那么 view 索引和 model 索引是一致的但如果你加了TableRowSorter排序就必須用table.convertRowIndexToModel(selectedRow)轉(zhuǎn)換。我在做這個(gè)系統(tǒng)時(shí)加過(guò)排序功能結(jié)果選課選錯(cuò)了課程所以在這提醒你拿到選中行以后第一件事就是做索引轉(zhuǎn)換否則容易給學(xué)生選錯(cuò)課。5. 避坑與排查實(shí)訓(xùn)報(bào)告里最容易翻車的 5 個(gè)細(xì)節(jié)5.1 中文亂碼不是數(shù)據(jù)庫(kù)的鍋是連接參數(shù)沒(méi)帶對(duì)現(xiàn)象登錄界面顯示中文正常但課程列表里所有中文都變成“”。原因數(shù)據(jù)庫(kù)表已經(jīng)是utf8mb4但 JDBC 連接字符串里沒(méi)有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語(yǔ)句傳中文參數(shù)亂碼檢查PreparedStatement的參數(shù)是否在 setString 之前就經(jīng)過(guò)了正確編碼一般加連接參數(shù)后這個(gè)問(wèn)題會(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)告里值得寫(xiě)一段因?yàn)樗?Java 連接數(shù)據(jù)庫(kù)最典型的升級(jí)兼容問(wèn)題。5.3 重復(fù)選課成功應(yīng)用層檢查被繞過(guò)現(xiàn)象連續(xù)快速點(diǎn)擊“選課”按鈕兩次數(shù)據(jù)庫(kù)里出現(xiàn)兩條一樣的選課記錄。原因并發(fā)時(shí)兩個(gè)線程都通過(guò)了checkSelectedSql的檢查然后先后執(zhí)行了插入。解決不要只依賴應(yīng)用層判斷數(shù)據(jù)庫(kù)里的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然后提示“您已選過(guò)這門(mén)課”而不是顯示“選課失敗”這種模糊文案。5.4 Swing 界面卡死JDBC 操作阻塞了事件分發(fā)線程現(xiàn)象點(diǎn)擊“加載全部課程”按鈕后窗口變成白屏光標(biāo)轉(zhuǎn)圈幾秒鐘后才恢復(fù)。原因MainApp直接調(diào)用 DAO 查詢數(shù)據(jù)庫(kù)執(zhí)行時(shí)間較長(zhǎng)時(shí)阻塞了 EDT。解決最簡(jiǎn)單的做法是在查詢方法里加一個(gè)Thread.sleep(100)模擬慢查詢?nèi)缓蟾挠肧wingWorkerVoid, Void在后臺(tái)線程執(zhí)行查詢?cè)赿one()方法里更新表格模型。不過(guò)對(duì)于本地 MySQL 和幾千條數(shù)據(jù)不這樣做也感覺(jué)不出來(lái)。我的建議是實(shí)訓(xùn)報(bào)告里可以寫(xiě)這個(gè)方案但代碼里不必過(guò)度設(shè)計(jì)只要答辯時(shí)能解釋清楚 EDT 模型就行。5.5 關(guān)閉主窗口后 Java 進(jìn)程不退出現(xiàn)象點(diǎn)窗口右上角關(guān)閉按鈕界面消失了但 IDEA 里程序還在運(yùn)行進(jìn)度條一直是綠色。原因沒(méi)有設(shè)置setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)默認(rèn)是HIDE_ON_CLOSE窗口隱藏了但 JVM 還在跑。解決在JFrame構(gòu)造函數(shù)里加this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);。這算是最基礎(chǔ)的 Swing 常識(shí)但幾乎每屆都有學(xué)生在這上面踩坑因?yàn)楣鈽?biāo)點(diǎn)在窗口右上角時(shí)根本沒(méi)意識(shí)到只是隱藏。也有同學(xué)用DISPOSE_ON_CLOSE配合System.exit(0)效果一樣但EXIT_ON_CLOSE是最直接的。6. 把項(xiàng)目做成能答辯的樣子從報(bào)表導(dǎo)出到體檢清單項(xiàng)目到了收尾階段除了選課、退課這些核心功能外教務(wù)管理員通常需要把選課名單導(dǎo)出來(lái)存檔。一個(gè)實(shí)用的技巧是直接在 Swing 界面里用JFileChooser選擇保存路徑然后用FileWriter把ResultSet的內(nèi)容寫(xiě)成 CSV 文件。這個(gè)功能不需要引入第三方庫(kù)二十行代碼就能完成而且容易在答辯時(shí)演示。我只保留一個(gè)建議——先寫(xiě)表頭再寫(xiě)數(shù)據(jù)行用英文逗號(hào)分隔中文內(nèi)容加雙引號(hào)這樣用 Excel 打開(kāi)時(shí)不容易亂。下面是一個(gè)簡(jiǎn)易的導(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é)號(hào),姓名,專業(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把連接、語(yǔ)句、結(jié)果集和文件流都收口是 Java 7 以后的推薦寫(xiě)法即使有異常也會(huì)自動(dòng)關(guān)閉資源。輸出到 CSV 文件時(shí)用了OutputStreamWriter指定 UTF-8 編碼防止 Excel 打開(kāi)亂碼。注意String.format里的占位符順序要和writer.write的拼接保持一致一般我在開(kāi)發(fā)時(shí)如果導(dǎo)出的表格列很多會(huì)先在一張紙上畫(huà)出表頭順序再寫(xiě)代碼這樣不容易出錯(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ù)庫(kù)初始化腳本。這個(gè)清單看起來(lái)不起眼但評(píng)委老師最常問(wèn)的就是“你換一臺(tái)電腦能跑起來(lái)嗎”你把這幾個(gè)版本信息寫(xiě)清楚能省掉不少追問(wèn)。另外我習(xí)慣給項(xiàng)目根目錄配一個(gè) README.txt里面寫(xiě)清楚三步啟動(dòng)流程先用 MySQL 執(zhí)行sql/init.sql再在 IDEA 導(dǎo)入項(xiàng)目最后修改DBUtil.java里的數(shù)據(jù)庫(kù)密碼為本地密碼。這樣哪怕過(guò)了一個(gè)月再回來(lái)看這個(gè)項(xiàng)目也能快速接手。最后說(shuō)一個(gè)我自己的教訓(xùn)我在早期做這類課程設(shè)計(jì)時(shí)總是忍不住往項(xiàng)目里堆功能比如加一個(gè)“公告板”模塊加一個(gè)“課程評(píng)價(jià)”模塊結(jié)果數(shù)據(jù)庫(kù)表越來(lái)越多代碼越來(lái)越亂最后連自己都理不清外鍵關(guān)系。后來(lái)我?guī)W(xué)生做項(xiàng)目時(shí)都會(huì)先讓他們把核心流程走順——學(xué)生登錄、選課、退課、管理員審核、統(tǒng)計(jì)報(bào)表一個(gè)功能只能有一個(gè)界面、一個(gè) DAO 方法以及一段事務(wù)邏輯做完這些之后其余的可選功能都只是錦上添花。Selbst當(dāng)老師問(wèn)起“你的項(xiàng)目有什么亮點(diǎn)”時(shí)你不必說(shuō)“界面特別好看”你可以說(shuō)“我的選課事務(wù)能保證數(shù)據(jù)一致”這個(gè)說(shuō)服力強(qiáng)得多。希望這些經(jīng)驗(yàn)和代碼片段能幫到你祝你的選課管理系統(tǒng)一次通過(guò)答辯。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产真实子伦对白| 天堂国产AV| 97爱爱爱| 久久骚| 久久婷婷综合国际产色怕| 九九久精品| 99色悠悠| 亚洲无线码一区国产欧美国| 2024年最新色情网站在线观看| 麻豆天美在线喷水AV| 精品久久久亚洲AV成人网站| 青青操综合网| 日本孕妇一区二区视频操逼免费看| 少妇内射www在线观看视频| 精品久久久亚洲AV成人网站| 欧美人妻久久精品二区三区| 国产成人一级av88| 亚洲国产一级精品毛一级精品看免费视频 | 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 大香蕉一人在线| 激情久久久| 亚欧国产无码精品在线| 国产www色在线观看| 日本淫乱女一区二区三区视频| 夜色97| www四虎| 国产尹人在线视频免费| 日本一级二级三级网站| 自怕偷自怕亚洲精品| 日韩精品-原创伙伴| 欧美论理片| 国产精品 午夜福利| av在线不卡一区二区三区| 97天天摸天天爽| 亚洲第一男人天堂| 亚洲校园激情| 久草看看看| 亚洲在高跟鞋自慰久久在色线| 东京热激情视频一二三区| 强奸乱伦中文字幕AV| 在线观看亚洲成人精品| 白丝被操91| 被操高清无码视频| 欧美性生活男人的天堂| 狠狠操,使劲操| 高清孕妇孕交 交| 欧美啪啪啪91| 少妇天堂| 一区二区三区国产在线播放| 午夜精品久久一区二区| 96AV精品| 久草福利在线资源站| 老司机老司机午夜影院| 久久伊人大香蕉| 婷婷五月天激情网| 日本在线一二 | 亚洲在线网站| 亚洲自拍天堂| 大稥蕉免费视频这里只有精品| 99re视频在线观看这里只有精品| 好吊妞转入那个网| 中文字幕片| 9精品在线| 天天色怡春院| 麻豆成人影音在线| 亚洲97成人在线观看| 亚洲精品免费中文字幕| 性做久久久久久免费观看软件| 另类 日韩 熟女| 亚洲欧美国产其他二区| 91麻豆天美国产欧美日| 欧美日韩人人早| 五十路人妻在线| 天天操天天日青青草超碰av| 色婷婷一区二区三区久久| 亚洲在线网站| av凤凰久久久| 精品无码一区二区| 老女人碰碰在线碰碰视频| 后入合集| 亚洲精品尤物yw在线影院| 亚洲图片婷婷五月天| 国内毛片国产专区二| 久久免费精彩视频| 求求你操操我| 97香蕉网| 97精品综合久久| 中文字暮97| 9久精品视频在线观看| 国产精品一二三| 久久精品一区二区| 人人操人人操草草| 国产精品久久久久久久久久久久久久久久 | 国产免费操逼| 亚洲不卡不卡中文字幕不卡| 女人天堂网| 欧美片第一页| 欧美日韩丝袜 | 96久久久久| 一级久久久久久久久久久| 久久久不能久久久久| 欧美日韩小说| 强奸国产精品视频| 熟女丰满人妻一区| 超碰久久.com| 大香网站| 色天堂综合| 超碰97亚洲| 天天躁日日躁AAA片李宗瑞| 69AV女优男人的天堂| 久久原创中文| 天天操夜夜嗨| 色九九综合AV| 国内毛片婷婷六月色| 韩国三级三级BD在线| 天天综合亚洲综合| 67914在线兔费成人视频| 91亚洲色图| www…国产操逼| 亚洲大色堂| 国产粉嫩蜜臀av一区二区三区| 超碰91在线| 92大香蕉| 国产这里只有精品| 超碰97亚洲| av九九| 日韩AV噜噜噜一区二区三区四区| 色情乱伦AV| 亚洲鸥美色图| 婷婷五月天激情四射| 日日AAvv| 丁香五月天啪啪| 国产深喉| www.激情| 亚洲码在线中文在线观看| 精品国产乱码久久久久A| 人爽不卡视频| 欧美另类色| 狠狠躁伊人中文字幕| 爱爱动态120秒| 97欧美视频| 久久精品人体| 日韩黄片影院| 欧洲精品区| 大香蕉免费乱伦视频| 91网站在线播放| 日韩在线观看中文字幕视频| 一起草在线视频| 2019天天干天天操| 久午视频| 狠狠狠狠狠干| 91狼人| 久久五月天婷婷丁香中文字幕| 色老汉色| 九九探花视频在线观看| 欧美精品久久96人妻无码| 欧美天天谢综合网| a天堂视频| 国产在线激情| 97精品视频免费| 国产男人又猛又粗又爽| 中文字幕乱码在线观看| 久久一留热品黄| 亚洲小电影免费涩涩成人在线高清| 91久久国外网| 亚洲日韩肥臀视频在线观看| 亚洲欧美色综合| 韩美日操逼| www久久精品| 精品国产网站| 日韩欧美经典在线观看| 九九无码| 亚洲双插| 91精品婷婷国产综合久久竹菊| 国产精品一区二区三区,亚洲综合| 亚洲日韩欧美一区二区| 久久久久久九九九九-美女久久久久久久-成人AV | 色999亚洲人成色| AV乱伦国产| 久男人久久| 天天操天天射青青草| 亚洲毛片一级带毛片基地| 日日骚中文字幕| 色男人色天堂东京热| 久久久久9| 人妻中文字幕精品无码| 日韩免费福利在线观看| 色欲天天综合久久久无码网中文| 欧美日日人人天天| www.高清无码诱惑一区.com | 热久久这里只有精品| 中国一级αV| 狠狠爱夜夜干| 中文字幕艹艹| 日日干夜夜操视频h| 婷婷中文字幕| 操逼日韩无码 | 久久男女激情视频网站| 九月激情婷婷| 日产欧美电影一区二区三区| 97资源亚洲| 青青草中日韩在线| 中文字幕精品乱码| 高清国产无码av| 密臀成人视频久久久| 国产二区三区粉嫩在线| 亚州成人A√| 激情五月婷婷综合| 亚洲福利中文字幕在线| 国产午夜无码片在线观看影视 | 少妇天堂网络| 亚洲日本男人天堂网| 五月婷婷六月色| 丰满人妻av一区二区三区| 国产精品无码久久久久2028| 欧美大香蕉同搞| 99老司机精品视频在线观看 | 亚殴在线| 99青草| 九九毛片这里只有精品| 日韩AV一区二区三区四四| 五月婷婷丁香中文字幕| 亚洲精品三| 日产狠狠干| 亚洲激情综合| 久久久精品国产亚洲伊人| 爽爽淫人网| 国内91熟女人妻丝袜天天精品视频在线| 亚洲av无码成人精品国产| 久久综合激情| 欧美色偷拍| 国产精品青青草| 夜夜操av亚洲一区二区| 色综合20p| julia ann久久| 日韩性色| 中文字幕一区电影在线观看| 无遮挡h肉动漫在线观看| 日产成人久久| 9久9久| 欧美伦乱| 国产午夜精品理论片一二三区区| 成人免费看吃奶视频网站| 在线有码中文字幕| 欧亚乱色熟女一区二区| 亚洲婷婷五月天| 国产日本熟女顶级一区二区三区视频 | 刺激精品视频| 人人妻人人色一区二区三区| 久久久久久久性爱| 亚洲另类小说卡通动漫| 天天操av懂色| 久久精品中文字幕女同| 九九九九九用不成了| 中文字幕精品亚洲熟女| 啪啪性爱免费视频| 99久久e免费热视| 综合久| 99久久这里只有精品| 伊人991| 噜噜瑟| 亚洲欧美高清无码| 精品久久人妻成人网| 91狠| 精品视频一区二区| 日本 色 导航| 色五月婷婷麻豆在| 伊人久久亚洲中文字幕不卡| 97欧美视频| 欧美一区二区三区四区综合| 日本99视频| 欧美成人色| 综合久久欧美| 国产精品久久久久久久免牛肉蒲团| 男人的天堂99| 麻豆国产免费影片| 亚洲天堂人人妻| 久久尹人大香焦视| 日本在线播放不卡一区| 亚洲免费日韩在线一区二区| 激情欧美97| 久久免费精品视频免一| av东京热男人的天堂| 91狠狠综| 五月婷婷综合在线| 欧美日韩亚洲天堂| 日韩一性一交一A片俄罗斯| 超碰公开久久网| 91女色| 亚洲va有码在线天堂| 亚洲成人精品久久久| 美女91在线| 国产精品成人无码av无码免费| 国产白嫩精品久久| 大香蕉伊人网| 欧美少妇一区二区三区| 欧美日韩资源| 久久久一热在线播放| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 岛国毛片手机在线观看| 黄色免费一级在线毛片| 婷婷激情综合网| 国产蜜臀在线| 91精品黄在线观看| 激情婷婷丁香网| 日韩人成网站在线播放| 亚洲青青草| xxx0国产在线播放| 蜜桃AV天堂| 欧美特大黄一级片片免费| 91亚洲欧美色图| 久久老女人| 99re不伦| 操操逼视频| 人妻无码后入| 亚洲高清国产理伦片| 国产AV人人夜夜澡人人爽麻豆| 狠狠操官网| 我中文字幕6区| 人妻丰满熟妇一区二区三| 男人干美女| 操逼www.| 久久久久久久久久久久97 | 色 婷97| 一起草三级AV电影在线观看| 国产美脚女优尤物在线观看| 秋霞网—男女啪啪亚洲免费体验区| 亚洲人人操| 久久久久久久97| 伊人大香蕉在线| 最新三级网址| 综合五月天| www四虎| 澳门黄片一香蕉视频| 99操| 午夜精品五区| 酒色综合网| 91欧美长吊| 欧美国产欧美在线观看| 欧美激情高清性猛交| 色精品极品| 亚洲蜜乳av| 热热色中文无码| 欧美72网页| 丁香五月综合| 亚洲国产一区二区日韩专区| 国产精品扒开腿做爽爽爽视频| 97在线欧洲| 久热超碰| 精品成人亚洲午夜电影| 97亚洲在线| 久久这里| 欧美美女啪啪视频| 偷窥自拍A片| 蜜乳中文字幕a在线| 97超碰精品成| 特级大荫道BBwBBwBBW| 丰满高潮18xxxx| 超碰午夜| 啊啊啊好大好深| 久久久久久久久久精| 920日本午夜免费| 在线观看免费视频国产| 97综合久久| 日韩特一级久久| 欧美熟女妇同| 精品四五区| 亚洲熟女中文字幕在线| 日韩av不卡在线看| 精品九九国产无码| 天堂v无码免费视频| 天天性射网| 999综合色| 18一区二区三区| 免费黄色片子| 亚洲aV无码成人在线观看| 男女猛烈无遮掩视频免费软件| 亚洲清纯综合| 9.1小视频| 婷婷久草| 欧美色图人妻| 国产精品久久久久久久免牛肉蒲团| 日韩欧美经典在线观看| 自拍偷拍草一草| 91亚洲电影| 天天欧美97| 97在线播放 | 日韩一区二区三区四区五区| 啪啪AV导航| 91色人妻| 无码高清操逼网址| 国产树林里野战在线看| 欧美性爱十八禁| 久久精品国产亚洲AV高级北京| 精品久久久久久中文字幕视频免费| 日韩十八禁| 78精品在线| 男人的天堂VA| 亚欧免费观看视频| 中文字幕精品一区二| A片A5445444| 欧美十八禁视频| 国产高清精品一区二区三区毛片| 日日日日做夜夜夜夜无码| gogogo免费高清看中国国语| 隔壁邻居波多野结衣中文字幕| 国产操逼视频在线观看| 人人妻人人狠人人| 欧美色色色| 亚洲高清无码免费观看视频| 亚洲操操操| 亚洲国产欧美日韩人妻日中文| 野狼激情网| 青青操在线亚洲视频观看欧美在线 | 青青草导航在线视频| 日本最新1区2区3区| 极品美女嘿咻| 无码国产精品96久久久久孕妇| 精品国产Av无码久久久亚洲| 国产精品呦一区二区三区| 天天精品| 精品夜夜澡人妻无码| 婷婷色网| 久久久国产护士丝袜美腿一| 亚洲日韩天堂| 操逼视频亚洲| 超碰97精品在线| 国精综合一二三区影视| 97精品网站| 亚洲天堂男人网| 国产精品麻豆免费视频| 97最新在线播放视频| 97干在线看| 大香蕉天天看妹子| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 熟女精品日韩一区二区三区| 日韩av免费一级电影| 免费中文在线| 欧美狠狠操| 久久久久99精品成人片蜜臀| 国产毛片久久久久久久| 久久精精区一区二区一蜜桃一区二区| 9 9无尺码天堂网| 91亚洲人| 精品一区二区综合熟妇| 夜夜嗨AV蜜臀av| 在线免费试看60秒| 日韩啊V| 国产 丝袜 欧美中文 另类| 亚洲一区日韩| 蜜臀无码一区二区| 内射小黄片| 91大学精品激情戏| 久久久96精品| 欧美另类精品xxxx| 久久99手机免费视频| 人妻欧美| 丁香五月婷婷色| 日韩精品9区| 亚洲一区二区三区在线激情| 中文字幕在线观看丝袜| 天天在线91| 精品国产av一区二区三区四区入口| 欧美性生活综合| 动漫av中文| 国产精品久久天天干| 99热超碰| 少妇一区二区三区| 91狠狠色丁香婷婷综合久久| 天天日骚逼熟女| 色天使亚洲综合在线观看| av操操不卡| 97干97色| 午夜激情床戏激情| 国产综合色精品在线观看| 天天爽天天| 国语精品av| 欧美一级A片在线看视频性色| 香蕉av一区二区三区| 伊人丁香五月婷婷| 九一综合精品视品av| 偷拍亚洲| 久久成年精品| 啪啪啪东京| 91中文精品日韩欧美在线| 无遮挡又黄又刺激的视频| 色色色综合网| 狠狠婷婷亚洲中文综合久久| 国产专区路线| av强奸乱轮| 欧美日韩人妻婷婷一区| av天堂手机版追回| 亚洲图片欧美偷拍| 人妻激情另类| 亚洲欧美色图小说| 欧亚韩国999| 超碰av在线| 校园春色五月天| 亚洲av总站| 色黄污美女啪啪啪免费网站| 亚洲自拍一区夜夜操| 成人a大片在线观看| 人妻天天爽| 亚洲操操操| 久久夜夜| 狠狠躁日日躁夜夜躁A| 精品性爱一二三区| 青青草毛片| 国产农村妇女精品1区二区| 热久久国产| 亚洲人人夜夜澡人人爽| 国产剧情一区在线观看| 国产av波波国产精品| 乱色老一区二区三区的观看方式 | 国产成人主播| 大香蕉久操| 国内伊人久久久久久网站视频| 丁香六月激情| 伦激情人妻另类人妻| 人乳av| 国产精品小视频一区二区三区| 无码操逼视频一下| 自拍啪啪视频| 99啪啪| 这里都是精品在线观看| 日韩免费福利在线观看| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美极品少妇交| 国产Aα| 欧美色图第一页| 人人噜夜夜操| 床上啊啊啊一区二区三区| 中文字幕人成乱码熟女香港| 黑人粗大V S日韩女优视频| 久久久亚洲精品电影免费看| 性色av婷婷久久一区二区点复制| 少妇一区二区三区精选| 97视频网站| 97网站在线观看| AV在线资源| 大香蕉操久久| 婷婷久久综合久| Av色五月| 久久久18| 操逼网站视频漫画国产| 亚洲小说视频| 干美女人妻| 美女的肌被草喷水视频| 久久国产精品91| 香蕉久久国产AV一区二区| 亚洲色色探花| 色色网91| 另类小说综合网| 999综合网| 亚洲一区二区av| 亚洲国产中文字幕| 亚洲有码第一页| 亚洲骚逼少妇| av绯色| 精品人体无圣光凹凸| 999久久久九九九九| 粉嫩久久久极品| 日本不卡二三区| 国产精品三级视频网站| 亚洲一本大道中文字幕无码在线| 中文一区二区三区影院| 欧美高清18A片| 啊啊嗯嗯好爽| 国产高清成人免费视频| 午夜性生活av免费在线看| 色97干| 亚洲天堂资源在线| 日本亚洲嫩草影院啪啪| 精品女同一区二区三区| 九九九热精品| 中出人妻中文字幕91在线| 欧美色图97| 超碰在线日韩一区| 深夜视频| 国产精品午夜AV完会免费| 欧美精品宗合| 99精品国产户外露出| 成人97人人超碰人人| 久久久久久人妻一区精品色欧美| 亚洲免费在线探花| 久久欲| 欧美日韩一区二区三区四区蜜桃| 福利在线黄片| 九九热超碰| 91一起操| 久久av网| av亚洲天堂资源网站| 性色av一区二区| 人人妻人人色| 久久久久国产精品人妻aⅴ天堂| 九色 蝌蚪 熟女自| 国产精品一区二区三| 97ai亚洲| 日B操| 人人摸人人添人人操 | 91影库| 国产精选三级在线观看| 亚洲综合另类| 1区2区3区中文字幕日韩| 超碰日韩美妻| 好吊色综合| 26uuu国产亚洲综合| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 亚洲宗合网| 91美女视频直播| 韩国三级一线观看久| 极品尤物自安慰| 天天日少妇逼AV| 1024手机看片欧美日韩| 日本精品一区二区不卡| 九九精品无码专区免费| 亚洲av强奸乱伦| 大香蕉伊人亚洲| 青青草国产一区二区三区| 91这里只有精品| 国产又大又硬又长又粗| 中文字幕一区二区三区蜜臀| 亚洲综合另类色图| 亚洲黄色视频在线观看视频| 中文字幕在线免费观看视频| 啊啊啊啊啊啊啊啊啊啊在线观看| 97欧美综合| 深夜激情无码| 欧美最婬乱婬爆婬性视频 | 91网站18+| 国语av狠狠色丁香婷婷综合激情| α√在线| www.高清无码诱惑一区.com | 97色干| 99re这里| 日本成人免费一区二区三区| 91操人| 亚洲人码13| 中文字幕美女91| 色色色综合| 久久精品一区一起草| 国产成人午夜视频网址| 一道本东京热加勒比一区二区三区| 日韩无码服务区| 黄片免费日韩| 91久久久久免| 国产精品农村妇女| 亚洲黄色a级片| 天天射夜夜| 一区二区三区四区五区高清无码永久视频 | 天天干夜夜鈤| 岛国成人av在线播放网址| 试看60秒| 91成人久久 | 国产尤物AV尤物在线观看不卡| 欧美黑人与女人91~| 97欧美| 亚洲AV成人无码久久精品播放| baiduhicn.com。| 无码免费在线观看黄色片| 精品一区二区三区最新| 91老女人| 97久久资源| av网站免费看| 97免费在线视频在线观看| 亚洲开心网| 曰韩欧美国产传媒麻豆第一区| 亚洲福利影院一区久久| 久久久影院| 国产精品无码成人精品| 97超碰亚洲| 国产亚洲精品av一区| 日韩av情韩国爱禁区av一区二区| 深夜激情无码| 国产97免费视频| 日本不卡卡一区| 欧美人人曰人人操人人射射| 丰满精品人妻少妇久久字幕| 26uuu国产日韩综合在线观看| 亚洲性少妇| 韩国黄色片精品久久久 | 无套内射性感少妇视频| 久久αⅴ| 午夜精品久久久99| 亚洲精品性爱片| 欧洲精品欧洲精品| 91超级碰碰| 久久老女人| 五十路熟女工口 | 淫荡网址| 第45页一区二区| 亚洲成人一区二区精品| 欧美亚州综合网图片| 狠狠躁AV| 国产www色在线观看| 丝袜av一区二区三区| 欧洲一级性爱视频在线观看| sewuyueav| 精品九九九| 欧美日韩大陆黑人少妇99| 日本不卡高清视频| 蜜屁av| 东京成人一区| 久久激情五月| A一区片| 97精品视频在线| 婷婷色一区| 日韩不卡毛片Av免费高清| 国产精品视屏| 欧美在线|亚洲| 白丝1区2区3区| 色欲日韩欧美在线一区| 黄片www视频免费| 玖玖大干人妻| 东北女人的毛片| 婷婷99狠狠| 欧美色视频在线| 九九九九热| 久久风骚城市| 久久综合超碰| 中文字暮97| 大香蕉五月天| 97在线观看播放视频| 国产女大学生AV| 一二三区视频在线观看| 久久99草| 国产精品久久久久久久久久久久久久久久久久 | 日韩国产乱子伦App| 嗯嗯啊啊好爽| 欧美一二级| 精品176精品2| 91在线美女| 丁香六月啪啪| 色官网在线| 国产精品无码av嫩草| 午夜性刺激视频免费观看| 亚洲春色欧美| 色九九九九九九| 综合网97| 色哟哟av网址| 欧美色图 人妻| 色狠狠综合噜一二三区| 中文字暮97| 国产92麻豆天美精品色欲5| 国产精品一区二区亚洲人成毛片| A级在线视频| 97这里只有精品| 97狠狠| 自拍六区| 欧美日韩精品久久久久久久久东北老熟妇| 中文字幕诱惑制服人妻丝袜美丝袜美 | 亚洲青青草| 欧美综合娱乐久久| 亚洲熟女乱色一区二区三区| 一中国女人毛片水真多| 日韩三级av片| 人妻精品一区二区| 日本色日夜干| 久久精品一区二区| 精品久久久久久中文字幕视频免费| 啊啊啊爽爽| 精品国产Av无码久久久伦古装| 国内一区二区免费| 91欧洲国产成人久久精品网站| 超碰成人人人爽人人爽| 欧美性爱超碰97| 国产精品一区二区三区免费视频| 97天天日| 国产综合久久久麻桃个 | 国产9 9在线 | 亚洲| 精品视频在线观看精品| 国产欧美日本亚洲精品| 国产精品精品系列在线观看| 女人与公拘交酡2020视频| 久久久亚洲熟妇熟女| 日本人妻最新在线中| 日韩99精品视频综合区| 婷婷去俺也去六月色| www.色婷婷色综合| 夜夜肏2021| 97精品久久久久久久| 欧美 亚洲 91| 男人的天堂1024| 亚洲人妻精品一区二区| 91老熟妇| 大香蕉黄色一级片免费看| 操高情无码| 性爱乱伦网址| 长长久久88视频| 色老汉色| 欧美日韩97在线| 性色综合网| 亚洲AV无码乱码| 久久草在线综合视频| 男人的天堂2018东京热啪啪啪| 国产超碰在线一区| 蜜桃午夜视频一区二区 | 91美女在线观看| 亚洲欧美日韩免费电影| 五月婷色| 久妇网| 黄色一区三区| 国内伊人久久久久久网站视频| 欧美日韩97| 国产成人精品日本视频| 丁香五月电影| 97久久久精品| 天天射日日干| 91成人在线免费视频| 精品无码久久久| 人妻人人澡人人爽人人| 性91| 日韩精品永久在线观看| 蜜臀av中字字幕网站| 欧美色吧综合| 嫩草美女久久| 69超碰综合| 麻豆精品天美| 国产女同在线观看视频| 五月丁香激情啪啪| 亚洲男人天堂2012| 中国和日本人色哪个不下载能放| 久久无码成人| 欧洲Au麻豆| 国产97视频| 5278欧美一区二区三区| 久干网| 日本人妻丰满熟妇久久久久久| 精品超碰国产| 美女黄码视频午夜| 中文?日韩?免费?精品| 超碰99在线观看| 国内外毛片在线观看| 国产一区二区三区视频在线看| 人妻天天操天天爽视频免费 | 大香焦A片| 久草视频制服诱惑| 亚洲激情片| 亚洲国男人的天堂| 夜夜欧美| 色色色天美视频| 玖玖爱一区在线| 中文字幕在线免费观看2| 亚洲日产专区| 久久9精品| 久久曰曰| 深喉吞精| 狠狠综合| 天天天肏屄肏屄肏屄欧美欧美| 色爱综合网| 欧美人妖内射| 亚洲午夜AV| 一区二区三区在线日韩影院观看| 殴美在线AⅤ| 蜜桃臀一区二区aV| 国产一级作爱毛片| 男人天堂无码| 99热欧美| 日本色日夜干| 日本在线不卡一二区| 亚洲国产97在线精品一区| 精品区国产区一区二区三区| 精品无码产区一区二| 亚洲第一精品在线视频 | 三级激情网站| 精品无码产区一区二| 中文字幕91页| 欧色性第一页| 超碰成人国产| 亚洲中字慕不卡| 中文字幕日韩综合| 天天看精品动漫视频一区| 久草婷婷| 中字幕人妻一区二区三区| 9久精品视频在线观看| 美女操逼A A| 精品美女久久一二三| 国产人妖的免费的视频| 任我爽在线视频免费观看| 色情五月综合婷婷| dy888午夜老子影视达达兔| 亚洲区限制级| 日本3级一区二区免费| 欧美色图 色综合图| 国产黄色动态精品| 亚洲中文字母在线播放| 国内伊人久久久久久网站视频| 熟女欧美日韩综合婷婷| 国产精品熟女丝袜一区二区| 97亚洲综合| 偷拍片久久| 天天综合在线4| 免费一级特黄特色大片在线观看看| 超碰在线日韩一区| 欧美熟妇精品黑人巨大一二三区| 欧美黑人精品一区二区| 啊啊啊啊啊啊在线| 91日产欧美| 久久久一区二区三区四曲免费听| 无码高清少妇久久| 麻豆天天躁天天揉揉AV| 国产污视频麻豆传媒一区二区| 人人操人人大香蕉| 波多野结衣AV无码一区| 国产精品白丝AV| 欧美最婬乱婬爆婬性视频| 亚洲成A∨人影院在线欢看| 午夜亚洲| 手机久操欧美综合色码| 色色国产| 日日摸夜夜夜夜爽| 欧美性爱第1 页| 黄站在线免费观看| 2019天天操天天爽天天拍| 婷婷综合激情| 岛国免费黄色网址| 欧美97| 天天综合网~91| 啊啊啊啊操死我了| 九九色影院| 狠日操| 亚洲网站一区二区在线| 久超碰这里只有精品| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 中文字幕在线观看第二页| 亚洲精品亚洲人成人网| 日韩黄色一区二区三区| 国产女乱淫真高清免费视频| 国产人妖的免费的视频| 人人看人人插| 国产精品原创巨作?v网站| 牛牛AV人人夜夜澡人人爽| 97超碰欧美| 啪啪综合网| 精品久久久av无码免费| 日本久久女同性恋视频| 久久久久久97| 久草免费在线视频| 免费精品AB| 久久久亚洲熟妇资源| 久久伊人东京热| 日日AAvv| 一区二区影视| 欧美夜夜| 超碰色老头| 一起草高清无码| 2021国产成人精品久久| 97色碰| 手机午夜电影神马久久| 欧洲欧美视频一区二区| 欧美A片中文字幕| 新久久AV| 欧美v亚洲v综合v国产v妖精| 国产精品麻豆成人av| 日本狂喷奶水在线播放212| 激情五月天插| 久久婷婷综合国际产色怕| 久久婷婷伊人| 蜜桃臀av在线观看| 久久久久久性爱视频| 久婷婷一区| 中文字幕78| 欧美97se| 久久色网| 另类亚洲一区二区三区| 国产一区二区a毛片| 爽 好舒服 无码刺激久久| 国产高潮AA片免费看| 国产少妇与亚洲av| 日韩美女,国产传媒,视频一区| 亚洲欧美国产va在线| 国产97av| 成人青青草原伊人| 色视频蜜乳| 亚洲砖码砖专无区2023| 欧美日韩性爱精品| 偷拍亚洲高清图片| 日韩精品一区,二区 九九...老司机| 性九九九九九九| 97超碰色色| 久久久久久国产无码精品| 曰韩无码777| 亚洲永久AV无码精品秋霞| 91痴汉| 亚洲高清视频在线免费观看| 操操逼操操逼操操逼逼| 色欧美天天| 国产高清不卡视频| 999国产精品999久久久久久| 74成人在线| 人妻少妇av在线观看| 欧美日韩国产中文精品字幕自在自线,| 久草在| 久久久中文| 国产精品999zyz| 神马精品视频| 在线电影亚洲色图| 久久永久无码人妻视频| 中文字幕 国产 精品| 国内操逼视频二区| 超碰4A| 熟女五十路一区二区三| 六六久久日韩不卡| 噜噜噜亚洲精品| 五月亭亭六月丁香| 久久激情五月| 国产久久一区二区| …亚洲黄色厕厕女女在线播…| 欧美精品精品一区二区| www.色操逼| 欧美天堂第二区| 亚洲āv网址在线观看| 综合五月婷婷| 激情小说亚洲视频| 亚洲精品三区在线观看| 伊人影院中文字幕| 日韩人妻无码不卡网站| 秋霞免费AV| 欧美狠狠弄| 亚洲色图综合| 亚洲第一页色| 久久久久九九九九九| 伊人激情五月天一区二区| 欧美韩国你懂得在线| 欧美日本成人一区二区| 九九热免费视频| 综合亚州欧美| 国精精品无码一二三区水多多| 久久久网一区| 乱伦a片视频| 九九热免费国产视频婷婷伊人五月 | 欧美亚洲中文| 99人人干| 男人天堂导航| 亚洲人妻AV| 久久9精品网站| 一级久久性爱视频| 婷婷九月丁香| 美国人人操人人操| 久久久久亚洲一区女同性恋中文字幕| 狠狠色伊人亚洲综合网站色| 日本伦理一区二区| 中文字幕后石码四区五区| 超碰97精品在线| 国产毛片片精品天天看视频| 亚洲色图激情小说| 日韩性爱长视频免费| 久久婷婷在线观看视频| 视频一区二区免费在线| 日韩久久超碰色| 人妻丰满熟妇一区二区三| 啊啊啊要高潮了| 伊人久久综合精品欧美| 啊啊啊啊啊舒服| 亚洲av无码成人精品国产| 色97国产69香蕉| 99精品久久| 欧美日本成人一区二区| 亚洲免费精品一区| 久久黄片国产一区二区| 91久久久老司机| 亚洲第一在线视频| 亚洲图片 欧美电影| 欧美日韩性感| 国产一区二区三区白丝| 日本最新免费韩国1区2区视频播放| 天堂无码精品国产久| 久久蜜桃一区二区| 亚洲人成网www| 国产传媒午夜理伦精品| 操老熟女AV| 亚洲色图超碰在线| 囯产精品久久久久久久久久梁医生 | 国产一区自拍欧美日韩| 熟妇精品juliaannAV| av在线不卡一区二区三区| 欧美青青视频| 天天操天天射天天日| 亚州大图综合色图| 久久99久久99精品免视看婷婷| 91亚洲综合在线| 99精品在线观看| 久久精品国产亚洲AV清纯| 60秒免费视频| 久久久久久亚洲精品不卡人乳| 人人操欧美风骚| 亚洲色图第四色| 久久久9品一区二区三区| 婷婷影院入口| 亚洲风情在线观看| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 亚洲中文字幕熟女| 久久久精品中文字幕麻豆| 鲁鲁色综合网| ji熟女.com| 97欧美日韩| 后入式五六区| 久久久久婷婷| 欧美综合娱乐久久| 97操| 欧美色图片色哟哟| 夜夜操av亚洲一区二区| 欧美精品999| 日韩在线一区二区| 成人羞羞视频国产| 加勒比综合a∨| 在线天堂999| 婷婷五月天影院| 国产一级不卡在线观看| 老司机午夜精品视频| 外国免费性情大片| 亚洲综合色在线| 日韩AV中文字幕电影| 蜜臀少妇一区二区| 日韩午夜啪啪视频| 亞洲久久直播| 中国AAAAAA黄色片| 午夜精品久久久久久久久久久久久| 亚洲诱惑天堂 | 激情综合五| www国产天美久久久| 国产精品爱欲| 日韩有码中文字幕女同性恋| 狠狠操狠狠燥| 九九九九精品一区| 天天夜夜久久| 亚洲有码 视频一区| 婷婷香蕉| 色婷视频| 精品少妇人妻av久久免费| 欧美亚洲图片| 亚洲狠| 色色九区| 久干网| 欧美色天堂网在线视频| 天天日天天射天天干| 蜜桃久久久久久久| 色婷婷五月天| 长长久久88视频| 婷婷爱五月| 蜜臀av一区二区三区免费观看| 8050无码八戒| 亚洲第一在线视频| 亚洲天堂久久| 九九色综合| 激情综合婷婷| 九月婷婷久久| 婷婷午夜| 91色综| 蜜桃久久综合视频| 视频二区美腿丝袜制服人妻欧美| 亚洲精品男人的天堂| 大香蕉色十月| 狠狠干狠狠干| 偷拍网站久久男女男| 久jiu久神马影院| 歐美一級亂黃99在綫精品| 天天干一区二区| www.99热在线只有精品| 伦理弟一页|