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

ARTICLE DETAIL

資訊詳情

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

Java圖書(shū)管理系統(tǒng)實(shí)操:JDBC連接MySQL與核心代碼詳解

Java圖書(shū)管理系統(tǒng)實(shí)操:JDBC連接MySQL與核心代碼詳解 不搞花架子直接說(shuō)項(xiàng)目本身。圖書(shū)管理系統(tǒng)是Java入門(mén)到進(jìn)階階段出現(xiàn)頻率最高的練手項(xiàng)目同時(shí)也是很多計(jì)算機(jī)專(zhuān)業(yè)課程設(shè)計(jì)和畢業(yè)設(shè)計(jì)的首選題目。這個(gè)項(xiàng)目題目里有兩個(gè)關(guān)鍵詞一是完整代碼實(shí)現(xiàn)二是連接MYSQL數(shù)據(jù)庫(kù)。前者說(shuō)明需要的是能直接運(yùn)行、能看邏輯、能復(fù)現(xiàn)的整套代碼而不是零散的功能片段后者說(shuō)明整個(gè)系統(tǒng)的數(shù)據(jù)落點(diǎn)都在MySQL里所有增刪改查都要經(jīng)過(guò)真實(shí)的數(shù)據(jù)庫(kù)操作。這篇文章就圍繞這兩件事展開(kāi)把表結(jié)構(gòu)設(shè)計(jì)、JDBC連接、核心業(yè)務(wù)邏輯、常見(jiàn)坑位全部過(guò)一遍適合正在做課設(shè)、準(zhǔn)備Java面試或者想搞清楚數(shù)據(jù)庫(kù)連接細(xì)節(jié)的同學(xué)參考。1. 項(xiàng)目整體設(shè)計(jì)與需求拆解1.1 這個(gè)系統(tǒng)到底在解決什么問(wèn)題圖書(shū)館的日常運(yùn)營(yíng)非常依賴(lài)借還書(shū)登記、圖書(shū)庫(kù)存盤(pán)點(diǎn)、讀者借閱記錄查詢(xún)這些操作。傳統(tǒng)手寫(xiě)登記的方式效率低、容易出錯(cuò)管理員想查一本書(shū)在哪、誰(shuí)借走了、什么時(shí)候該還都極其痛苦。圖書(shū)管理系統(tǒng)做的事情本質(zhì)上就是為管理員提供一套數(shù)字化工具讓圖書(shū)信息和借閱記錄全部落庫(kù)通過(guò)程序完成信息的增刪改查。從用戶(hù)視角來(lái)看最基礎(chǔ)的功能需求包括幾個(gè)方面管理員登錄系統(tǒng)身份校驗(yàn)要可靠。圖書(shū)信息的錄入、修改、刪除和按條件查詢(xún)。借書(shū)操作要能校驗(yàn)庫(kù)存和借閱狀態(tài)。還書(shū)操作要能更新庫(kù)存和借閱記錄。借閱記錄的查詢(xún)方便追蹤每一本書(shū)的去向。標(biāo)題里強(qiáng)調(diào)“連接MYSQL數(shù)據(jù)庫(kù)”意味著這些數(shù)據(jù)不能優(yōu)雅地躺在內(nèi)存里——程序一關(guān)就全沒(méi)了而是要永久的、結(jié)構(gòu)化的存在MySQL里。這樣才能保證重啟程序后圖書(shū)數(shù)據(jù)還在借書(shū)記錄也在系統(tǒng)才有真正的使用價(jià)值。1.2 技術(shù)選型為什么走JDBC直連而不是直接上框架很多人會(huì)問(wèn)現(xiàn)在都用Spring Boot MyBatis為什么還要用純JDBC手寫(xiě)連接數(shù)據(jù)庫(kù)我用這個(gè)項(xiàng)目回答你因?yàn)樘^(guò)了JDBC直接學(xué)框架你根本不知道數(shù)據(jù)庫(kù)連接背后發(fā)生了什么。JDBC是Java連接數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)接口MyBatis底層也是封裝了JDBC。你把JDBC這套流程——加載驅(qū)動(dòng)、獲取連接、創(chuàng)建語(yǔ)句、執(zhí)行SQL、處理結(jié)果集、釋放資源——走一遍框架一上手就能看懂它到底在幫你做什么。這個(gè)項(xiàng)目我建議采用“純Java控制臺(tái) JDBC MySQL”的經(jīng)典組合而不是上來(lái)就套JSP、Servlet或者Spring Boot。原因有三控制臺(tái)交互讓注意力集中在SQL語(yǔ)句和業(yè)務(wù)邏輯上不需要分心處理頁(yè)面跳轉(zhuǎn)、表單提交這些Web層的東西。JDBC連接數(shù)據(jù)庫(kù)的過(guò)程清晰暴露連接串怎么配、驅(qū)動(dòng)怎么加載、PreparedStatement怎么用全部看得見(jiàn)摸得著。代碼量適中適合一個(gè)人從零實(shí)現(xiàn)還能在面試時(shí)把項(xiàng)目講清楚。這套組合做出來(lái)的代碼結(jié)構(gòu)后續(xù)想遷移到Spring Boot版本時(shí)DAO層和實(shí)體類(lèi)幾乎可以原封不動(dòng)搬過(guò)去改動(dòng)成本很低。1.3 數(shù)據(jù)庫(kù)表結(jié)構(gòu)設(shè)計(jì)三張表?yè)纹鹫麄€(gè)系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)是這個(gè)項(xiàng)目的根基。我見(jiàn)過(guò)不少同學(xué)代碼寫(xiě)了一半發(fā)現(xiàn)表結(jié)構(gòu)不合理回頭改表又改代碼非常痛苦。設(shè)計(jì)階段多花十分鐘后面能省下半天時(shí)間。整個(gè)系統(tǒng)用三張表就夠用戶(hù)表usersid主鍵自增用戶(hù)唯一標(biāo)識(shí)。username用戶(hù)名登錄時(shí)使用。password密碼落庫(kù)時(shí)存MD5散列值不存明文。role角色標(biāo)識(shí)管理員和普通讀者的權(quán)限區(qū)分。real_name真實(shí)姓名用于顯示借閱人信息。圖書(shū)表booksid主鍵自增圖書(shū)ID。book_name書(shū)名。author作者。publisher出版社。price價(jià)格用DECIMAL(10,2)類(lèi)型避免浮點(diǎn)誤差。stock庫(kù)存數(shù)量整數(shù)類(lèi)型。category分類(lèi)方便按類(lèi)別篩選。借閱記錄表borrow_recordsid主鍵自增。book_id關(guān)聯(lián)圖書(shū)表主鍵。user_id關(guān)聯(lián)用戶(hù)表主鍵。borrow_date借書(shū)日期。return_date應(yīng)還日期。status借閱狀態(tài)1表示借出中2表示已歸還。外鍵關(guān)系上borrow_records表的book_id和user_id分別指向books和users的主鍵。從表設(shè)計(jì)上保證數(shù)據(jù)可追溯。圖書(shū)庫(kù)存的扣減在借書(shū)時(shí)同步更新還書(shū)時(shí)同步恢復(fù)這個(gè)業(yè)務(wù)邏輯放在后面講。2. 核心代碼實(shí)現(xiàn)與關(guān)鍵細(xì)節(jié)2.1 數(shù)據(jù)庫(kù)連接工具類(lèi)JDBC連接的全過(guò)程不管寫(xiě)什么功能模塊第一步永遠(yuǎn)是拿到數(shù)據(jù)庫(kù)連接。把所有連接邏輯抽到一個(gè)工具類(lèi)里是項(xiàng)目初期就該做好的事。來(lái)找JDBC連接的經(jīng)典五步加載驅(qū)動(dòng)類(lèi)。定義數(shù)據(jù)庫(kù)連接地址URL。DriverManager獲取Connection對(duì)象。通過(guò)Connection創(chuàng)建Statement或者PreparedStatement。釋放資源。工具類(lèi)代碼我直接給出一個(gè)項(xiàng)目里實(shí)測(cè)可用的版本import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBUtil { // 數(shù)據(jù)庫(kù)連接地址 private static final String URL jdbc:mysql://localhost:3306/library_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; private static final String USERNAME root; private static final String PASSWORD 123456; private static Connection conn null; // 靜態(tài)代碼塊只加載一次驅(qū)動(dòng) static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } // 獲取連接 public static Connection getConnection() throws SQLException { if (conn null || conn.isClosed()) { conn DriverManager.getConnection(URL, USERNAME, PASSWORD); } return conn; } // 釋放資源關(guān)閉ResultSet、Statement、Connection public static void close(ResultSet rs, Statement stmt, Connection conn) { try { if (rs ! null) rs.close(); if (stmt ! null) stmt.close(); if (conn ! null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }這里有幾個(gè)細(xì)節(jié)值得說(shuō)透驅(qū)動(dòng)類(lèi)名。MySQL 5.x之前用的是com.mysql.jdbc.DriverMySQL 8.x后驅(qū)動(dòng)類(lèi)改成了com.mysql.cj.jdbc.Driver。用錯(cuò)會(huì)直接報(bào)ClassNotFoundException這是高頻報(bào)錯(cuò)點(diǎn)。連接串參數(shù)。serverTimezoneAsia/Shanghai解決的是時(shí)區(qū)問(wèn)題MySQL 8及以上版本服務(wù)器跟本機(jī)時(shí)區(qū)不一致會(huì)報(bào)錯(cuò)。characterEncodingutf8解決中文亂碼。useSSLfalse是關(guān)閉SSL校驗(yàn)本地開(kāi)發(fā)不需要加密通道不關(guān)可能會(huì)報(bào)SSL連接錯(cuò)誤。靜態(tài)代碼塊 vs 每次獲取連接時(shí)加載驅(qū)動(dòng)。Class.forName加載驅(qū)動(dòng)只需要做一次放進(jìn)static代碼塊里是標(biāo)準(zhǔn)寫(xiě)法不用每次getConnection都重復(fù)加載。驅(qū)動(dòng)注冊(cè)到DriverManager之后就常駐內(nèi)存了。2.2 用戶(hù)登錄模塊密碼校驗(yàn)與SQL注入防護(hù)登錄功能幾乎每個(gè)系統(tǒng)都有但我要在這單獨(dú)拉出來(lái)講是因?yàn)榈卿浤K最容易暴露安全意識(shí)問(wèn)題。我見(jiàn)過(guò)不少項(xiàng)目源碼里用字符串拼接方式執(zhí)行SQL比如String sql SELECT * FROM users WHERE username username AND password password ;這種寫(xiě)法非常危險(xiǎn)。用戶(hù)在用戶(hù)名輸入框輸入admin OR 11SQL語(yǔ)句會(huì)變成SELECT * FROM users WHERE username admin OR 11 AND password OR條件讓整條WHERE語(yǔ)句恒為真直接繞過(guò)密碼校驗(yàn)登錄成功。這就是最經(jīng)典的SQL注入攻擊幾乎所有數(shù)據(jù)庫(kù)安全類(lèi)面試題都會(huì)問(wèn)它。正確的做法是用PreparedStatement預(yù)編譯public User login(String username, String password) { String sql SELECT id, username, password, role, real_name FROM users WHERE username ? AND password ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, md5(password)); try (ResultSet rs ps.executeQuery()) { if (rs.next()) { User user new User(); user.setId(rs.getInt(id)); user.setUsername(rs.getString(username)); user.setPassword(rs.getString(password)); user.setRole(rs.getString(role)); user.setRealName(rs.getString(real_name)); return user; } } } catch (SQLException e) { e.printStackTrace(); } return null; }注意兩個(gè)細(xì)節(jié)。第一PreparedStatement的參數(shù)用?占位setString傳值時(shí)由MySQL驅(qū)動(dòng)做參數(shù)轉(zhuǎn)義用戶(hù)輸入的單引號(hào)會(huì)被當(dāng)作普通字符處理注入語(yǔ)句就失效了。第二密碼存的是MD5散列值md5方法如下private static String md5(String input) { try { MessageDigest md MessageDigest.getInstance(MD5); byte[] bytes md.digest(input.getBytes(UTF-8)); StringBuilder sb new StringBuilder(); for (byte b : bytes) { sb.append(String.format(%02x, b)); } return sb.toString(); } catch (Exception e) { throw new RuntimeException(MD5加密出錯(cuò), e); } }密碼散列化之后的好處是即使數(shù)據(jù)庫(kù)文件泄露別人看到的也是一串固定長(zhǎng)度的32位十六進(jìn)制字符拿不到明文密碼。這讓登錄模塊多了一層安全保障。2.3 圖書(shū)管理核心業(yè)務(wù)借書(shū)流程和事務(wù)邊界圖書(shū)管理系統(tǒng)的核心業(yè)務(wù)流是借書(shū)和還書(shū)。借書(shū)不是簡(jiǎn)單插入一條記錄就完事它涉及多張表的數(shù)據(jù)聯(lián)動(dòng)。以借書(shū)為例完整流程是校驗(yàn)用戶(hù)存在且角色為讀者。校驗(yàn)圖書(shū)存在且?guī)齑娲笥?。扣減圖書(shū)表的庫(kù)存。插入一條借閱記錄。這四個(gè)步驟里任何一步失敗整個(gè)操作都必須回滾。比如庫(kù)存扣減成功了但借閱記錄插入失敗就會(huì)出現(xiàn)庫(kù)存跟實(shí)際不相符的情況——書(shū)沒(méi)借出去庫(kù)存沒(méi)了。這是典型的事務(wù)場(chǎng)景。public synchronized boolean borrowBook(int bookId, int userId) { Connection conn null; PreparedStatement psUpdateStock null; PreparedStatement psInsertRecord null; try { conn DBUtil.getConnection(); // 關(guān)閉自動(dòng)提交開(kāi)啟事務(wù) conn.setAutoCommit(false); // 查詢(xún)庫(kù)存并鎖定記錄 String checkSql SELECT stock FROM books WHERE id ? FOR UPDATE; try (PreparedStatement psCheck conn.prepareStatement(checkSql)) { psCheck.setInt(1, bookId); try (ResultSet rs psCheck.executeQuery()) { if (rs.next()) { int stock rs.getInt(stock); if (stock 0) { throw new RuntimeException(庫(kù)存不足借閱失敗); } } else { throw new RuntimeException(圖書(shū)不存在); } } } // 扣減庫(kù)存 String updateSql UPDATE books SET stock stock - 1 WHERE id ?; psUpdateStock conn.prepareStatement(updateSql); psUpdateStock.setInt(1, bookId); psUpdateStock.executeUpdate(); // 插入借閱記錄 String insertSql INSERT INTO borrow_records(book_id, user_id, borrow_date, return_date, status) VALUES(?, ?, NOW(), DATE_ADD(NOW(), INTERVAL 30 DAY), 1); psInsertRecord conn.prepareStatement(insertSql); psInsertRecord.setInt(1, bookId); psInsertRecord.setInt(2, userId); psInsertRecord.executeUpdate(); // 提交事務(wù) conn.commit(); return true; } catch (Exception e) { try { if (conn ! null) conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); return false; } finally { try { if (conn ! null) { conn.setAutoCommit(true); conn.close(); } } catch (SQLException ex) { ex.printStackTrace(); } } }這段代碼有幾個(gè)非常關(guān)鍵的細(xì)節(jié)。conn.setAutoCommit(false)關(guān)閉自動(dòng)提交模式后后續(xù)的SQL不會(huì)立刻生效要等commit才真正寫(xiě)入數(shù)據(jù)庫(kù)。rollback是回滾讓之前執(zhí)行的SQL全部作廢。關(guān)于行鎖SELECT ... FOR UPDATE它把查詢(xún)到的圖書(shū)記錄鎖住避免多線(xiàn)程并發(fā)借書(shū)時(shí)大家都讀到stock1然后同時(shí)扣減變成負(fù)數(shù)。我自己實(shí)際測(cè)試過(guò)去掉FOR UPDATE的情況下用兩個(gè)線(xiàn)程同時(shí)借同一本書(shū)且?guī)齑嬷皇?本兩個(gè)請(qǐng)求都可能成功最終庫(kù)存變成-1。加了行鎖之后第二個(gè)請(qǐng)求會(huì)阻塞等待第一個(gè)事務(wù)提交提交后重新讀取庫(kù)存發(fā)現(xiàn)已經(jīng)是0直接拋異常這才是正確行為。2.4 還書(shū)流程別忽略狀態(tài)校驗(yàn)還書(shū)邏輯比借書(shū)簡(jiǎn)單但有一個(gè)很容易踩的坑不校驗(yàn)借閱記錄的狀態(tài)就直接更新。public boolean returnBook(int recordId) { String sql UPDATE borrow_records SET status 2 WHERE id ? AND status 1; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, recordId); int rows ps.executeUpdate(); if (rows 0) { // 恢復(fù)庫(kù)存 String updateStockSql UPDATE books b JOIN borrow_records r ON b.id r.book_id SET b.stock b.stock 1 WHERE r.id ?; try (PreparedStatement ps2 conn.prepareStatement(updateStockSql)) { ps2.setInt(1, recordId); ps2.executeUpdate(); } return true; } } catch (SQLException e) { e.printStackTrace(); } return false; }SQL里帶AND status 1確保只有借出中的記錄才能執(zhí)行歸還。如果記錄已經(jīng)是已歸還狀態(tài)UPDATE影響行數(shù)為0不會(huì)出現(xiàn)重復(fù)恢復(fù)庫(kù)存的情況。3. 完整實(shí)操?gòu)慕◣?kù)建表到跑通項(xiàng)目3.1 環(huán)境準(zhǔn)備MySQL 8 IDEA 驅(qū)動(dòng)動(dòng)手之前先把環(huán)境準(zhǔn)備好。我以本機(jī)開(kāi)發(fā)為例說(shuō)明每一步需要做什么。第一步安裝MySQL 8。Windows環(huán)境下直接去MySQL官網(wǎng)下載MySQL Installer只安裝Server和Command Line Client。安裝過(guò)程中的用戶(hù)名密碼記好默認(rèn)root用戶(hù)需要設(shè)置一個(gè)自己的密碼。安裝完成后在命令行用mysql -u root -p驗(yàn)證能登錄。第二步安裝Navicat或者直接用MySQL自帶的Workbench。Navicat勝在操作直觀(guān)建庫(kù)建表看數(shù)據(jù)都方便有條件的話(huà)可以用它快速核對(duì)數(shù)據(jù)是否寫(xiě)入成功。第三步IDEA創(chuàng)建Java項(xiàng)目引入連接驅(qū)動(dòng)。兩種方式任選下載mysql-connector-java的jar包放在項(xiàng)目lib目錄下右鍵選擇Add as Library。這個(gè)方式不需要額外的構(gòu)建工具。Maven項(xiàng)目在pom.xml里添加依賴(lài)dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency我用的是MySQL 8.0系列所以驅(qū)動(dòng)版本選8.0.33跟服務(wù)器兼容很穩(wěn)。如果你的MySQL是5.7及以下版本驅(qū)動(dòng)選5.1.x系列更省事。3.2 建庫(kù)建表與初始化數(shù)據(jù)打開(kāi)Navicat新建數(shù)據(jù)庫(kù)library_db字符集選utf8mb4。用以下幾個(gè)建表語(yǔ)句直接執(zhí)行CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password CHAR(32) NOT NULL, role VARCHAR(10) NOT NULL DEFAULT user, real_name VARCHAR(50) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE books ( id INT AUTO_INCREMENT PRIMARY KEY, book_name VARCHAR(100) NOT NULL, author VARCHAR(50) DEFAULT NULL, publisher VARCHAR(100) DEFAULT NULL, price DECIMAL(10,2) DEFAULT 0.00, stock INT NOT NULL DEFAULT 0, category VARCHAR(50) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE borrow_records ( id INT AUTO_INCREMENT PRIMARY KEY, book_id INT NOT NULL, user_id INT NOT NULL, borrow_date DATETIME NOT NULL, return_date DATETIME DEFAULT NULL, status TINYINT NOT NULL DEFAULT 1, CONSTRAINT fk_book FOREIGN KEY (book_id) REFERENCES books(id), CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;初始化數(shù)據(jù)也一并寫(xiě)入方便程序啟動(dòng)后有東西可操作INSERT INTO users(id, username, password, role, real_name) VALUES (NULL, admin, MD5(123456), admin, 系統(tǒng)管理員), (NULL, zhangsan, MD5(abc123), user, 張三); INSERT INTO books(book_name, author, publisher, price, stock, category) VALUES (Java核心技術(shù)卷I, 凱·S·霍斯特曼, 機(jī)械工業(yè)出版社, 119.00, 5, 計(jì)算機(jī)), (深入理解Java虛擬機(jī), 周志明, 機(jī)械工業(yè)出版社, 129.00, 3, 計(jì)算機(jī)), (MySQL必知必會(huì), Ben Forta, 人民郵電出版社, 59.00, 8, 數(shù)據(jù)庫(kù)), (活著, 余華, 作家出版社, 35.00, 10, 文學(xué));有一點(diǎn)需要提前說(shuō)清楚MD5(123456)這個(gè)函數(shù)在MySQL 8中默認(rèn)是可用的生成的密文存進(jìn)去之后Java代碼里用md5方法對(duì)用戶(hù)輸入的密碼加密再比對(duì)兩邊算法一致才能匹配。我自己踩過(guò)初始化數(shù)據(jù)里直接寫(xiě)明文密碼的坑。初期偷懶把password字段存成123456登錄驗(yàn)證時(shí)也拿明文去比較數(shù)據(jù)庫(kù)里全是裸奔的用戶(hù)密碼。后來(lái)項(xiàng)目做完統(tǒng)一改用MD5才把這個(gè)問(wèn)題處理干凈。建議從項(xiàng)目第一版開(kāi)始就養(yǎng)成不落明文密碼的習(xí)慣。3.3 項(xiàng)目結(jié)構(gòu)搭建分包劃分與實(shí)體類(lèi)設(shè)計(jì)代碼不是堆在一個(gè)類(lèi)里就能叫完整項(xiàng)目。合理的包結(jié)構(gòu)讓代碼后期可維護(hù)也更容易講明白系統(tǒng)架構(gòu)。我建議用以下分包方式com.library ├── entity/ # 實(shí)體類(lèi) │ ├── User.java │ ├── Book.java │ └── BorrowRecord.java ├── util/ # 工具類(lèi) │ └── DBUtil.java ├── dao/ # 數(shù)據(jù)訪(fǎng)問(wèn)層 │ ├── UserDAO.java │ ├── BookDAO.java │ └── BorrowDAO.java ├── service/ # 業(yè)務(wù)邏輯層 │ ├── UserService.java │ ├── BookService.java │ └── BorrowService.java └── ui/ # 界面展示與交互 └── MainMenu.java分層的好處是界面層只負(fù)責(zé)接收輸入和展示結(jié)果業(yè)務(wù)層處理業(yè)務(wù)規(guī)則DAO層只能跟數(shù)據(jù)庫(kù)打交道。舉個(gè)實(shí)際場(chǎng)景界面層需要顯示“借書(shū)成功”但它不應(yīng)該直接寫(xiě)SQL而是調(diào)用service層的方法service內(nèi)部組織多個(gè)DAO方法協(xié)同完成借書(shū)流程。這樣改動(dòng)界面不影響數(shù)據(jù)庫(kù)代碼替換數(shù)據(jù)庫(kù)連接方式也不影響界面。實(shí)體類(lèi)以Book為例public class Book { private int id; private String bookName; private String author; private String publisher; private BigDecimal price; private int stock; private String category; // 省略getter和setter方法 }價(jià)格字段用BigDecimal而不是doubledouble在數(shù)據(jù)庫(kù)和Java之間來(lái)回轉(zhuǎn)換的時(shí)候浮點(diǎn)誤差會(huì)讓人抓狂。數(shù)據(jù)庫(kù)DECIMAL對(duì)應(yīng)Java的BigDecimal這是標(biāo)準(zhǔn)對(duì)應(yīng)關(guān)系。3.4 圖書(shū)列表查詢(xún)分頁(yè)與排序?qū)嵅賵D書(shū)列表的展示不只是一條SELECT那么簡(jiǎn)單。系統(tǒng)里的圖書(shū)數(shù)量一旦上到幾十本控制臺(tái)一屏打不完前端展示的體驗(yàn)就很差。分頁(yè)是必須有的能力。public ListBook queryBooksByPage(int pageNum, int pageSize, String keyword) { ListBook bookList new ArrayList(); int offset (pageNum - 1) * pageSize; String sql SELECT id, book_name, author, publisher, price, stock, category FROM books; // 關(guān)鍵字搜索增強(qiáng)體驗(yàn) if (keyword ! null !keyword.isEmpty()) { sql WHERE book_name LIKE ?; } sql ORDER BY id LIMIT ? OFFSET ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { int paramIndex 1; if (keyword ! null !keyword.isEmpty()) { ps.setString(paramIndex, % keyword %); } ps.setInt(paramIndex, pageSize); ps.setInt(paramIndex, offset); try (ResultSet rs ps.executeQuery()) { while (rs.next()) { Book book new Book(); book.setId(rs.getInt(id)); book.setBookName(rs.getString(book_name)); book.setAuthor(rs.getString(author)); book.setPublisher(rs.getString(publisher)); book.setPrice(rs.getBigDecimal(price)); book.setStock(rs.getInt(stock)); book.setCategory(rs.getString(category)); bookList.add(book); } } } catch (SQLException e) { e.printStackTrace(); } return bookList; }ORDER BY id LIMIT ? OFFSET ?是MySQL分頁(yè)的標(biāo)準(zhǔn)姿勢(shì)。offset的算法是(pageNum - 1) * pageSize第一頁(yè)偏移0條第二頁(yè)偏移pageSize條很容易理解。LIKE關(guān)鍵字搜索時(shí)預(yù)編譯的?參數(shù)值直接拼上%即可搜書(shū)名、作者、分類(lèi)都通用。關(guān)于LIKE查詢(xún)有個(gè)性能細(xì)節(jié)如果數(shù)據(jù)量大LIKE %關(guān)鍵字%這種前置模糊匹配是走不了索引的全表掃描。但圖書(shū)管理系統(tǒng)這種量級(jí)的數(shù)據(jù)完全夠用不需要過(guò)度優(yōu)化。如果想優(yōu)化可以引入Elasticsearch或者M(jìn)ySQL全文索引那是后話(huà)。排序方面同樣用ORDER BY實(shí)現(xiàn)熱門(mén)借閱排名可以這樣查String sql SELECT b.id, b.book_name, COUNT(r.id) AS borrow_count FROM books b LEFT JOIN borrow_records r ON b.id r.book_id GROUP BY b.id, b.book_name ORDER BY borrow_count DESC;LEFT JOIN保證一本都沒(méi)被借過(guò)的圖書(shū)也能出現(xiàn)在列表里借書(shū)次數(shù)為0。COUNT(r.id)統(tǒng)計(jì)每本書(shū)的借閱記錄條數(shù)按降序排列得到熱門(mén)圖書(shū)排行。這個(gè)SQL在面試?yán)镆步?jīng)常被問(wèn)到JOIN和GROUP BY的組合使用。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 數(shù)據(jù)庫(kù)連接失敗驅(qū)動(dòng)、時(shí)區(qū)、權(quán)限三類(lèi)大坑連接數(shù)據(jù)庫(kù)是整套系統(tǒng)最容易出問(wèn)題的地方而問(wèn)題基本集中在三個(gè)方向第一類(lèi)是ClassNotFoundException報(bào)錯(cuò)內(nèi)容是ClassNotFoundException: com.mysql.jdbc.Driver。這個(gè)100%是驅(qū)動(dòng)類(lèi)名或者驅(qū)動(dòng)jar包的問(wèn)題。MySQL 8.x的驅(qū)動(dòng)類(lèi)名是com.mysql.cj.jdbc.Driver你還在用com.mysql.jdbc.Driver就會(huì)報(bào)這個(gè)錯(cuò)。另外確認(rèn)引用的jar包版本高版本驅(qū)動(dòng)確認(rèn)類(lèi)名寫(xiě)對(duì)了沒(méi)。第二類(lèi)是時(shí)區(qū)錯(cuò)誤報(bào)錯(cuò)一般是The server time zone value й?? is unrecognized。原因是MySQL 8服務(wù)器默認(rèn)使用系統(tǒng)時(shí)區(qū)而JDBC連接串沒(méi)有指定時(shí)區(qū)兩端對(duì)不上。解決方式是在URL追加serverTimezoneAsia/Shanghai。第三類(lèi)是Public Key Retrieval報(bào)錯(cuò)MySQL 8的默認(rèn)認(rèn)證方式是caching_sha2_password客戶(hù)端連接時(shí)需要從服務(wù)端獲取公鑰做加密JDBC默認(rèn)行為不允許這個(gè)操作。URL里加useSSLfalseallowPublicKeyRetrievaltrue即可解決。我自己在項(xiàng)目聯(lián)調(diào)階段把這三類(lèi)錯(cuò)誤輪著遇了一遍總結(jié)成一條經(jīng)驗(yàn)連接串務(wù)必一次性寫(xiě)完整不要遇到一個(gè)錯(cuò)改一處太折騰。4.2 中文亂碼三層設(shè)置缺一不可中文亂碼問(wèn)題出現(xiàn)得相當(dāng)頻繁而且一亂就是一大片。排查要按三層來(lái)檢查第一層數(shù)據(jù)庫(kù)。建庫(kù)和建表時(shí)指定CHARSETutf8mb4就是告訴MySQL這個(gè)數(shù)據(jù)庫(kù)要存unicode字符中文完全沒(méi)問(wèn)題。忘記指定的可以用ALTER TABLE命令補(bǔ)ALTER TABLE books CONVERT TO CHARACTER SET utf8mb4;第二層JDBC連接串。URL必須帶characterEncodingutf8注意這里跟數(shù)據(jù)庫(kù)里character_set_database的配置匹配起來(lái)。第三層控制臺(tái)輸出。Windows下IDEA的控制臺(tái)默認(rèn)編碼可能不是UTF-8在IDEA的Settings里把Global Encoding、Project Encoding、Console的編碼都設(shè)為UTF-8。命令行運(yùn)行時(shí)在編譯和運(yùn)行命令加上-Dfile.encodingUTF-8參數(shù)。這三個(gè)地方只要有一個(gè)不對(duì)柜臺(tái)就會(huì)顯示一排煩人的問(wèn)號(hào)。連續(xù)探查這個(gè)問(wèn)題的經(jīng)驗(yàn)教訓(xùn)是先確認(rèn)數(shù)據(jù)庫(kù)存進(jìn)去的中文是不是正常的用Navicat直接看表。庫(kù)里是亂的就是數(shù)據(jù)庫(kù)建表和連接串的問(wèn)題庫(kù)是正常的但程序顯示亂就是控制臺(tái)和JVM編碼的問(wèn)題。4.3 業(yè)務(wù)邏輯Bug排查事務(wù)沒(méi)提交、庫(kù)存負(fù)數(shù)、并發(fā)沖突數(shù)據(jù)庫(kù)連接層打通之后業(yè)務(wù)層的坑就輪到在運(yùn)行時(shí)慢慢暴露了。我整理一下最常遇到的幾個(gè)不執(zhí)行commit就斷言數(shù)據(jù)寫(xiě)進(jìn)去了。忘了setAutoCommit(false)之后一定要手動(dòng)commit或者寫(xiě)代碼的時(shí)候根本沒(méi)意識(shí)到事務(wù)已經(jīng)開(kāi)啟數(shù)據(jù)在另一個(gè)連接里死活看不到更新。排查方式確認(rèn)是否有事務(wù)開(kāi)啟查到commit或rollback了嗎。筆記本還剩0本借書(shū)還能成功。這是庫(kù)存校驗(yàn)缺失導(dǎo)致的。解決方式在前面borrowBook方法里講過(guò)校驗(yàn)和扣減必須在同一事務(wù)里用行鎖保護(hù)絕不能在SELECT和UPDATE之間留出空檔。對(duì)了損壞數(shù)據(jù)還可能來(lái)自重復(fù)借同一本書(shū)。如果借閱表里已經(jīng)有一條status1的同圖書(shū)同用戶(hù)記錄新借書(shū)請(qǐng)求不應(yīng)該再成功。在插入新借閱記錄前查詢(xún)?cè)撚脩?hù)該圖書(shū)是否存在借出中的記錄即可。4.4 資源泄漏連接不關(guān)系統(tǒng)遲早卡到死這個(gè)問(wèn)題雖然常見(jiàn)但在新手代碼里幾乎是批量出現(xiàn)。寫(xiě)完Connection不去close獲取了ResultSet不去close程序跑不了幾個(gè)來(lái)回就報(bào)Too many connections。MySQL默認(rèn)連接上限是100多個(gè)連接不釋放就會(huì)把連接池占滿(mǎn)。我建議把所有資源關(guān)閉統(tǒng)一放到finally代碼塊里或者直接使用JDK 7引入的try-with-resources語(yǔ)法。try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ... } catch (SQLException e) { e.printStackTrace(); }用了try-with-resources之后Connection、Statement、ResultSet只要實(shí)現(xiàn)了AutoCloseable接口就會(huì)在try塊結(jié)束后自動(dòng)關(guān)閉代碼少而且不容易遺漏。如果用的是我前面寫(xiě)的DBUtilclose方法也要在finally里確保調(diào)用。真實(shí)項(xiàng)目中連接不關(guān)閉屬于那種“今天不出事、明天不出事、上線(xiàn)第三天就出事”的問(wèn)題。你測(cè)試的時(shí)候數(shù)據(jù)量小加上連接偶爾被GC回收感受不到嚴(yán)重性。等系統(tǒng)真的被多個(gè)人同時(shí)用起來(lái)連接數(shù)飆升服務(wù)直接就癱了。5. 項(xiàng)目擴(kuò)展方向與面試講解建議這個(gè)項(xiàng)目做完能跑通只是第一步。真正讓項(xiàng)目有價(jià)值的是你能夠擴(kuò)展它并且在面試時(shí)把它講成亮點(diǎn)。我給四個(gè)擴(kuò)展方向的思路。第一個(gè)方向是加上圖形界面??刂婆_(tái)版本的邏輯代碼是完整的只是交互方式比較簡(jiǎn)陋。可以用Java Swing或JavaFX做界面把MainMenu替換成登錄窗口和主窗口BookDAO、UserDAO這些類(lèi)不需要大改。這樣就變成了一個(gè)更像“系統(tǒng)”的東西。第二個(gè)方向是升級(jí)Web版本。把項(xiàng)目改造成Spring Boot MyBatis Vue的前后端分離版本數(shù)據(jù)庫(kù)表結(jié)構(gòu)幾乎原封不動(dòng)DAO層代碼翻譯成MyBatis的Mapper接口。這個(gè)升級(jí)過(guò)程你自然就理解了框架到底幫你做了什么。第三個(gè)方向是補(bǔ)充還書(shū)逾期和罰款邏輯。在BorrowRecord里加一個(gè)shouldReturnDate的字段還書(shū)時(shí)用當(dāng)前日期跟應(yīng)還日期比較超期天數(shù)乘以每日罰款金額算出一個(gè)逾期費(fèi)用記錄這樣業(yè)務(wù)面就比普通的課設(shè)項(xiàng)目完整很多。第四個(gè)方向是權(quán)限體系的強(qiáng)化。讀者只能看到自己的借閱記錄管理員可以看全部借書(shū)也有容量限制這些都用role字段和SQL條件就能實(shí)現(xiàn)。給面試講項(xiàng)目的時(shí)候不要停留在“我寫(xiě)了一個(gè)圖書(shū)增刪改查的系統(tǒng)”這種層面。重點(diǎn)講三件事數(shù)據(jù)庫(kù)表怎么設(shè)計(jì)的表間關(guān)系是什么JDBC連接MySQL踩過(guò)哪些坑怎么定位和解決的借書(shū)的庫(kù)存扣減和借閱記錄的寫(xiě)入為什么放在一個(gè)事務(wù)里。把這些問(wèn)題想透了比堆砌功能列表管用得多。我個(gè)人在帶項(xiàng)目時(shí)最常跟新手說(shuō)的一句話(huà)是能跑通只是代碼的及格線(xiàn)知道自己為什么能跑通才算是學(xué)會(huì)。這個(gè)項(xiàng)目做完你至少應(yīng)該能回答為什么用PreparedStatement而不是Statement為什么借書(shū)要用事務(wù)為什么庫(kù)存要加行鎖為什么密碼要加密存儲(chǔ)。能在紙上畫(huà)出三張表的關(guān)系能說(shuō)出連接MySQL的URL各個(gè)參數(shù)的含義。這些才是這個(gè)項(xiàng)目真正的收獲。最后再分享一個(gè)我在調(diào)試階段的小習(xí)慣把SQL語(yǔ)句先在Navicat里跑一遍確認(rèn)結(jié)果集返回正確了再回到Java代碼里聯(lián)調(diào)。數(shù)據(jù)庫(kù)查詢(xún)這層走通了代碼層的排查范圍瞬間縮小問(wèn)題定位效率非常高。這個(gè)習(xí)慣我用在所有的數(shù)據(jù)庫(kù)項(xiàng)目里實(shí)測(cè)下來(lái)很穩(wěn)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美熟女操屄| 亚洲中文字幕有码视频一区二区三区| 精品国产嫩穴视频| 亚洲天堂日本| 2019天天干天天操| 97免费视频在线观看视频| 懂色av一区二区三区天美传媒| 极品美女福利在线观看| 夜夜国自区| 粉嫩绯色AV一区二区在线| 久久久久久久久久久999| 干超碰碰熟女| 欧美午夜色妇色鬼| 丝袜综合网| 最新国内自拍av免费| 看日韩美女二区三区免费操逼视频| 国产中文福利| 性欧美精| 人人人人人人少妇| 亚洲图片 激情小说| 亚洲欧美情色| 神马久久久久久久久久| 久久男人精品| …中文字幕亚洲乱,97人妻无码费视… | 九九九九精| 成人婷婷丁香| 97人妻免费中文字幕| 国产精品一区二区三区免费视频| 久久超碰亚洲人| 亚洲 无码 偷拍| 亚洲少妇激情视频| 亚洲九月丁香| 国产97在线播放| 中文字幕av乱伦| 91丰满| 男人的天堂2010| av网站免费线看| 日韩美女高潮喷水视频| 久久高清欧美国产| 91亚洲在线| 亭亭在线资源| 91伊人大香蕉| 亚洲色图久久成人| 婷婷情色五月天| 26uuu性| 欧美男人亚洲天堂| 玖玖婷婷五月天| 久久黄黄黄| 五月婷色| 亚洲另类在线观看| 久久久九九网站| 熟女高潮精品一区二区| 97在线欧洲| 美女黄频a美女大全免费皮| 狠狠中文字幕| 97超碰亚洲| 精品无码产区一区二| 99爱爱| 久久久久免费少妇| 久久6热精品99视频| 久久久少妇诱惑精品视频| 91M一社| 欧美一级美片在线观看免费| 日日操天天操| 97欧美色| 伊人久久婷婷| 亚洲污污网站| 少妇一级婬片免费放一级a性色.| 操99| 天操天操夜操夜月操月年年操操| 久艾草在线精品视频在线观看| 欧洲成人性爱视频| 久久久久久久国产| 三级色综合| 日韩乱码Av| 91亚洲黄色网| 夜夜操天| 欧美操逼熟女| 98福利在线视频| 青草草免费网站av| 天天看片麻豆| AAAAAAAAA黄片| 91色图片| 午夜福利免费精品视频| 欧美综合自拍亚洲综合图| 日韩精品人妻一| 亚热日本熟女| 国产成人网| 亚洲 欧美 色图| 99天堂网| 美女视频尤物网在线看| 一区二区三区无卡视频在线观看| 亚洲精品官网在线观看| 国产三级中文字幕粉嫩| 天天干,天天日| 日韩欧美日韩| 亚洲丰满很很操| 伊人91| 久久国产在线一区二区| 999熟女精品| 日本女人操逼| 色色网91| 蜜臀久久久99久久久久 | 综合网亚| 91色久| 国内毛片欧美香蕉精品| 好一吊区二区| 在线亚洲精品久久久| 黄网在线播放| 欧美黄色大片在线观看| 超碰在线一区二区| 中文字幕午夜精品久久久| 五月天激情网站| 久久久久久亚洲中文| 欧美日韩人妻精品系列一区二区三区| 粉嫩国产精品久久久| JIZZJIZZ国产精品喷水| 在线观看无码三级少妇| 色综合一区二区三区| 亚洲人码13| 欧美97日韩| 亚洲精品三| 太久视频| 色成人Www精品永久观看| 久久久久亚洲熟妇熟女| 天天看天天日天天操| 一区二区精品更新提醒| 97精品一区二区视频| 亚洲高清少妇| 特污精品女优骚货黄色视频在线免费观看| 国产熟女二区| 亚洲欧美变态| 久九9精品| 欧美国产精品| 亚洲男人天堂2016| 国产男女边吃边摸视频网站| 色情综合网| 亚洲AV色图| 能看的AV| www.操| 丁香7月婷婷| 精品视频久久| 超碰97人人cao| 亚洲精品啪视频| 国产自产91区13区| 日本黄色裸日本黄色裸体 | 少妇精品久久久| 天天综合站| 好吊色一区| 久久透逼视频| 91日韩| 色999人与兽| 色噜噜综合在线| 久久a久久| 怡红院怡春院| 久久久久幕乱码| 国产9熟妇视频网站| 97综合国产| 天天操人人操狠狠插| 家庭乱伦网站国产| 超碰天天久久79| 亚洲欧洲综合| 日韩欧美中文| 青青草在线视频欧美| 女上位精品在线| 精品人妻一区二区三区在线视频不卡| a一区二区三区乱码在线| 精品国产www久久| 九九九久千久久激情蜜桃在线看 | 五月天婷婷在线看| 国产久久久久久久久一区二区| 97人肏| 色综合加勒比四四季| 日韩91网| 91操人| 国产视频大全| 天堂v无码免费视频| 91人妻尻屄视频| 东北老女人的激情视频| 自拍偷拍第26| 精品人妻一区二区三区-国产精品 一个人在线看的黄色电影网站 | 久久久久久亚洲Av无码| 日韩素人无码一区二区三区三州| 大色网久久| 国产精品69人妻无码久久久| 超碰538| 欧美激情性爱视频网站| 国产美女激情| 日本高清有码网址视频| AV色五月天| 中文字幕一区二区在线日韩精品| 蜜臀99999| 爽极品影院| 国产性爱欧美性爱在线| 久久一级无码精品毛片6| 久久人妻无码毛片A片麻豆| 91丨九色丨国产丨人妻在线| 国产日韩欧美| 亚洲激情网一二三四区| 成人精品在线免费视频| 久久伊人青青草| 操逼无码一区| 一二三区操逼国产91| 青青草吊丝| 99在线免费公开视频| 欧州一区二区三区四区| 激情视屏国产乱伦强奸| 亚洲成人一二三区| 97精品熟女少妇一区| 国产女人视频三四五区| 高清孕妇孕交 交| 美日韩一二三区| 久久久久九九九九九| 久操免费在线| 日韩操逼HD| 99性爱视频| 日韩人妻无码精品系列| 你懂得91| 国内黄色精品| 丝袜美腿操av| 国产av又色又爽又黄| 国产热RE99久久6国产精品首| 天天舔天天| 日韩欧美女求操每天更新| 99夜夜操| 曰韩成人免费视频| 超碰人妻久久人妻中文97| 国产精品午夜精品| 免费看国产曰批40分钟怎么下载| 激情综合亚洲| 亚洲中文字幕一区| 日日夜夜精品| 色婷婷在线视频精品导航| 精品视频一区二区| 亚洲欧美另类少妇精品| 欧美性天天| 亚洲精品骚逼| 欧美亚洲性爱一区二区| 女人 A一级| AV中亚| 欧美黑人与女人91~| 日韩亚洲精品一区二区| 花花AV导航| 后入人妻一区| 综合久久婷婷| 亚洲精品啪视频| 伊人天天久久动态图| 日韩啪啪啪啪啪| 日韩精品人妻系列无码天堂| 日韩激情视频| 99re视频在线播放青草| 亚洲日韩美国人妻| 亚洲欧美性生活| 男人久久天堂| 狠狠操狠狠爱| 亚洲自拍青操视频| 人妻啪| 丁香五月成人| 久久国语| 啪啪免费| 久久超碰大香蕉| 久久伊人最新网址视频| 国产成人+综合亚洲+天堂| 欧美国产有色电影| 色在线综合| 九九九久千久久激情蜜桃在线看 | 探花在线免费观看视频国产一区| 久久久∴| 女同女同恋久久级三级| 久草资源在线视频官方总站日韩丝袜美腿 | 91黑丝美女| 天天色天天干天天爱| 国产精品操| 96久久精品一二三区色欲| 大香蕉中文aV在线| 风月影院十八禁| 操高情无码| 免费看污网站| 777超碰| av无码av无码专区| 亚洲第一精品在线视频| 日韩一级性爱无码| 91色综合色| 九月丁香婷婷色| 综合色好色| 亚洲欧美日韩综合在线尤物 | 九X超碰| 91超级碰| 中文字幕一区日韩精| 伊人丁香五月婷婷| 综合伊人激情| 97在线免费视频| 78精品在线| 日韩97超碰| 99re超碰| 都市激情人妻一区二区青青操视频| 亚洲av综合色区无码一| 97伊人超碰| 超97在线精品视频| 亚洲日韩乱码中文无码蜜桃臀网站| 欧美Ⅴ性爱| 日韩久久三区| 成人免费性爱视视| 国产传媒一区日韩| 亚洲欧美在线观看免费| 欧美在线综合| 中文字幕黄色片| 久九九九九九九九热| 久久人妻视频网| 999综合网| 爆乳免费黄网站| JIZZJIZZ亚洲女人被躁| 五月天色电影| 婷婷综合在线| 人妻少妇久久中文字幕一区二区 麻豆| 天天日天天色| 中文字幕精品免费一区二区| 欧美一区二区传媒| 国产黄色av大片网站| 97久操| 熟妇熟女视频一区二区三区| 无码78| 爱干爱射网啊啊啊| 久久精品店| 天天日天天看| 日本不卡二三区| 久久99亚洲精品久久99果| 强奸乱伦大香蕉| 熟妇高潮二区三区| 欧美成人亚洲精品| 国产美女高潮叫床视频| 91少妇| 欧美人人天天网| 欧美日韩第一页| 翔田千里无码一区| 日韩欧美三级| 午夜福利区| 精品亚洲国产成人AV制服丝袜| 亚洲国产精品无石码久久| 好吊色一区| 国产AV超爽| 性久久久| 亚洲欧美日韩不卡人妻| 四虎在线播放| 亚洲另类久操网| 日韩一级欧美一级在线观看| 国产1024在线播放| 九热久| 欧美超碰人妻97| 国产伦精品一区二区三区视频女| 五月天玖玖资源站| 日韩av免费一级电影| 日本亚欧爱爱| 亚洲无限观看| 亚洲精品欧美专业| 天天操狠狠日夜夜干超碰撸com视频在线观看| 四虎国产精品永久在线囯在线| 欧美手机在线综合| 青久操| 日韩有码免费视频| 免费观看啪视频| 色就色综合| 青娱乐国产剧情av一区| 大香蕉狠狠爱| 九九热只有精品| 东北操逼| 久久久久极品| 91激情国产| 超碰97首页| 亚洲色图国产另类| 激情终合网| 99丝袜福利在线播放| 久热9| 亚洲1区2区三区高清中文字幕| www.亚洲黄色| 国产成人精品必看| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 日韩 欧美 校园一区| 嗯嗯啊操我| 激情第四色| 不卡免费av在线播放| 操操操日本的逼| 影音先锋乱伦资源| 亚洲αv一区二区三区| 观看免费区二区三区二| 久久色人体 | 亚洲诱惑天堂 | 国产小黄片在线免费观看| 乱伦熟女专区| 啪啪视频亚洲第一| 91人妻做a观看视频| 欧美另类综合久久| www.色操逼| a级理论午夜日本| 大香蕉五月天| 日韩一区二区精品视频| 操死我干死我| 91精品国久久久久久无码| 97频视在线| 91色人| 午夜亚洲| 亚洲熟妇一,二,三期| 偷拍综合网| 日韩在线欧美精品一区二区| 成人 日本A片无码8888| 噜噜噜无码AV一级一级久久影院| 熟妇在线视频一区二区| 亚洲精品国产AV天美传媒| 日本久久综合| 91久| 69少妇一区二区| 多乙久久久久久| 久操精品网| 女同亚洲欧美一二三区久久电影| 久草精品一区 | 91亚洲欧美| 精品国产91av一区二区三区| 爆操无码| 800zy一区二区| 色www精品视频在线观看| 色天天野狼综合社区| 丰满少妇一区二区三区免费看| 2017av无码免费无线播| 手机在线视频国内精品| 大香蕉免费中文| 东京成人一区| 免费在线视频97| 尤物网址| 天天综合网国产| 人妻 制服 日韩 中文 在线| 青青草好吊色| 97欧美性爱| 天美精品av| 色天欧美| 在线视频免费观看午夜| 国产av美女被艹的乱叫| 亚洲综合影视| 舔足天天操天天射| 九九色精品| 99蜜桃臀亚洲成人在线观看| 精品人妻一区二区三区四区不卡在| 俄罗斯一区二区视频在线观看| 人妻久久久久久| 天美传媒在线一区| 国产精品福利资源在线尤物| 免费AV播放| 亚洲综合电影| 操操啪| 亚洲精品一区二区免费在线观看| 操逼操2| 婷婷伊人网| 欧美一品道| 你懂的在线观看区国产| 超碰97起碰| 欧美日韩小说| 国产精品青草综合久久| 熟女露脸激情自拍视频| 欧美性爱www免费版| 97天天综合网| 国产精品嫩草影院午夜两性| 国产四虎在线| 国产成年女黄特黄| 九九九综合精品| 亚洲毛片基地专区| 久操大香蕉手机视频在线看 | 99久久综合网| 超碰九九| 色色99| 欧美激情在线观看视频| 狠狠色综合网| 夜夜欧美| 午夜激情床戏激情| 人人操,人人液| 亚州精人品大香蕉| 操逼A∨| 久久久久久久 九九九九九九九| 亚洲天堂男| 久久丁香| 2020久久免费视频| 动漫片子网站3黄| 国产精品国产亚洲区艳妇糸列| 日本天天人人狠狠在线日美女 | 国产成人bd在线观看| 久久骚| 久久99午夜精品一区人妻| 黑人干亚洲| 久久婷色| 亚洲综合另类| 国产久久一区二区| 18禁超污无遮挡无码免费网| 大逼色网站| 亚洲色图超碰在线| 亚洲一区日韩精品| 亚洲少妇激情一区二区三区| 亚洲激情在线| yw尤物av无码点击进入麻豆| 日韩精品9999| 亚洲精品日韩国产欧美| 亚洲有码视频二区| 和协影院中文字幕三区| 国产女人成人精品视频| 久久人妻| 在线观看午夜婷婷久久久久清性观看| 爱我干综合| 亚洲综合另类| 大香蕉92| 亚洲熟女国产综合另类| 伊人久久大香线蕉无码| 欧美日韩小说| 99亚洲人人| 色99在线| 免费的黄片有限公司| 色777999综合| 97爱欧美| 日本色色色| 久久理论字幕视频| 综合久久六月久久婷婷| 国产在线播放成人免费| 天天操天天谢| 色哟哟-国产专区| 国产超碰| AAAAAAAAA黄片| 熟女人妻精品一区二区视频 | 欧美精品日韩久久久九| 中文字幕青青草| 一本一首道人妻少妇免费久久| 狠狠色婷婷7777久| 大香蕉免费乱伦视频| av网站免费线看| 东京热av影院| 国产后入内射| 欧美一区二区传媒| 天堂九九九九九九九九九| 人人潮人人摸| 1769国内精品视频| 9Ⅰ老熟女| 天操天操夜操夜月操月年年操操| 青青草手机在线免费观看| 九月婷婷综合| 亚洲操逼视频网站| 在线中文字幕极品av| 国产真乱mangent| 亚洲欧美999| 亚洲狠狠入| 久久久久婷婷精品av电影| 今日头条成人一区二区三区四虎精品| 久久久久久久 九九九九九九九| 成人国产精品三级A片| 日韩精品碰碰| 亚洲欧美中文一区二区三| 亚洲AV无码乱码| 国产精品人妻无码久久久老鸭窝 | A久久| 99久久网站| 国产AV高清AV无码| 日本午夜久久电影| 91精品久久综合熟女| 操逼片中文| 乱伦av.com| 萌白酱自拍视频| 377p欧洲日本亚洲大胆| 日本Xx性爱| 免费精品福利在线观看| 99久久久99久久91熟女| 另类图片五月天| 男人的天堂2010| 精品夜夜澡人妻无码| 亚洲国产欧美日韩人妻日中文| 999久久久精品国产| 久久极品一区二区| 亚洲影院小综合| 91人妻视频| 9999亚洲精品| 安微少妇操BBB| 91丰满| 黄片www视频免费| 伊人九九| 国产一区在线看| 九九无码久久精品视频| 欧美精品在线观看| 一区,二区,三区视频| 久久久久久久久久久久久久久久9| 99在线视频播放| 午夜精品人妻二区三区| 亚洲精品无码成人久久久99 | AV天堂丝袜| 亚熟在线| 9九九国产| 大香蕉综合网| 亚洲va有码在线天堂| 国产亚洲精品玖玖玖在线观看| 操逼日韩无码 | 久草视频分类在线| 800zy一区二区| 男人的天堂2000| 中文有码9| 日本东京热久久久电影| 自拍偷拍 高清无码| 九九激情网| 宅男午夜在线视频| 久草电影网| 玖玖爱在线视频免费观看| 久久人人爽爽人人爽人人片αV| 午夜色婷婷| 国产SV一线| 天操天操夜操夜月月年年操操| 日韩欧美加勒比| 99久久久er直播网址| A V少妇特黄三级| 91爱欧美| 国产精品久久久久久久电影渣男| 香蕉婷婷| 少妇色综合| 大学生美女口爆| 婷婷影院入口| www.AV有限公司一区| 九久9精品| 乱伦AVxx| 国产美女激情| 国产偷人伦激情在线观看| 国产成人无码网站在线视频| 啊啊啊啊啊啊好湿好爽视频| 国产999精品久久久| 高清成年美女黄网站免费大全| 久操高青| 97在线视频免费观看| 秋霞视频一区二区| 一区超碰一区| av在线一区二区三区| 操B久久| 国产h小视频在线观看免费| 黄片www.| av橘色网站| 亚洲中文字母在线播放| 色麻豆AV| 插穴性爱视频在线观看| 好屌色综合| 人妻一二三区| 欧美亚洲se91| 91人妻素女| 国产后入清纯| 亚洲蜜桃V妇女| 激情久久日韩精品中文字幕麻豆| 国产精品无码av| 国产欧美后入| 成人午夜小视频手机在线看| 97超碰人操| 女人喷水视频在线观看| 丰满人妻一区二区中文| 最新日韩黄片| 久久香蕉国产线看观看亚洲女人 | 伊人影院综合是一个与深夜成人在线 | 午夜福利视频在线一区| 精国久久一区二区三区98| 国产熟女完整版中字| 加勒比av官网在线| 日韩AV一起草| 日韩十八禁| 后入 亚洲 美女 射| av毛片aaaaa免费看| 殴美综合色88| 高清无码 国产精品| 亚洲素人综合| 蜜桃久久综合视频| 国产91亚洲精品一区二区三区| 好看的91视频| 黑丝自慰喷水网站| 婷婷性网| 天堂日本亚洲欧美| 国产AV久久野战精品| 青青草五月份天| 97人肏| 老司机天天操| 欧美96交| 成人网欧美风情| 一区二区三区免费岛国片| 超碰在线日韩一区| 国产精品制服丝袜中文字幕日韩一区二区三区 | ji熟女.com| 97在线播放 | 国产午夜福利电影免费在线观看| 无码操逼天堂| 日韩AV电影网站| 三级特黄60分钟播放| 欧美性爱超碰97| 精品国产99| 超碰人人色| 青青青国产手线观看视频2| 91美女国产在线| AV天天在线观看| 不卡一区二区日本视频| 欧美资源| 夜色97| 9999伦理视频| 久久香蕉网| 国产成人无码啪| 96精品久久久久久久久| 久9爱经典视频| 超碰97资源大奶| 丁香六月婷婷久久综合| 人人操人人干网页| 校园春色综合网| 33044男人的天堂深夜备| 97人人爱人人做人人乐| 婷婷色综合| 亚洲成?V人片在线观看福利| 色色色日本| 97碰碰色| 亚洲极品| 成熟熟女国产精品一区二区| 国内精品不卡无毒99999| 日韩一级欧美一级在线观看| 大香蕉一区二区在线观看.| 舔足天天操天天射| 亚洲日本大香蕉1| 久久一二三四五六七八九区区| 色丁香久久| 色综合久久av| 69XX一中文字幕人妻91| 熟女人妻一区二区三区| yazhououmeizongya| 欧美性爱一区二区三区四区 | 亚洲全色网| 免费国产| 九草九九九| 精品人妻一二三四区视频| 国产AV高清AV无码| 无码WWW免费视频网站| 亚洲精品性爱片| 亚洲欧美国产中文视频| 色五月av| 欧美翘臀视频网站一区二区三区| 欧美色97| 色综91| 97超碰大| 欧美日韩1234| 超碰91在线| 麻豆 美女 丝袜 人妻 中文| 日夜精品| 大香蕉欧美| 校园春色 亚洲| 天天干人妻视频| 九九九九九九精品| 欧美丝袜91| 夜夜国自区| 伊人网在线点播| 特污精品女优骚货黄色视频在线免费观看| 99超碰网| 91综合无码| 麻豆美女丝袜人妻中文| 97精品网| 国内毛片欧美香蕉精品| AV麻豆免费一区| jk白丝没脱就开始啪啪| 久久精品国产亚洲AV片多多| 91精品微拍福利| 日本欧美一区二区三区免费| 伊人久久大香大香线蕉中文| 操逼操逼逼操操逼91| 国产性久久久| 日逼国产| 精品国产精品一区二区| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 91草草草| 青青草导航在线视频| 男人天堂新在线| 欧美性xxxxx狂欢| 美女天天干| 亚洲1区2区三区高清中文字幕| 日韩欧美经典在线观看| 婷婷亚洲天堂| 女人妻一区| 亚洲伊人久久精品影院| 激情小说激情视频| 97香蕉网| 日本视频在线观看污污污| 激情综合五| 欧亚第一综合网| 午夜综合在线| 精品传媒在线一区| 欧美一级久久久久久久大片动画| 国产九九九九九九九九| 旡码电影特区| 中文字幕乱偷人妻久久艾草网| 熟妇人妻精品一区二区| 欧美不卡五十路| 日韩av影片在线观看| 欧美久久草熟女| 九99久久| 欧美男人天堂| 天堂8在线新版官网| 日日日啊啊啊| 欧美性爱超碰97| 欧美一级黄色免费专区| 日本岛国黄色网址| 蜜臀99999| 久热这里| 亚洲导航深夜福利| 蜜臀AV一区二区三区激情综合| 久久成人午夜狠狠| 人人操人人93| 九九黄色网| 青青草无码视频| 以及麻豆国产入口在线观看免费| 丰满人妻一区二区三区大胸懂色| 亚洲高清视频在线观看| 91欧美综合| 亚洲成人性爱在线观看| 久久人妻四季| 熟女人妻一区二区三区| 26uuu国产免费观看| 无码视频一区二区| 无码天堂| 蜜臀久久一区二区| 99热销国产这里有精品| 欧美日韩国产黄色片| 一区二区首页| 神马久久久久久久| 成人欧美一区二区三区黑人一| 天堂射| 亚洲无线码欧洲精品区别| 999久久久九| 欧美 亚洲 在线| 伊人色综合网电影| 91在线一起| 尤物一级在线免费观看| 久久久久久少妇| 国产精品久久天天干| 亚洲一二三精品久久网 | 国产自产91区13区| 午夜男人的天堂| 亚洲第一综合| 亚洲日韩电影| 亚州精人品大香蕉| 91N综合网| 99这里有精品视频| 精品九九九九九九| 夜夜爽爽爽| 日韩性爱网址| 亚洲天堂电影网99999| 久久久国产三级黄色片| 色爱亚洲| 丁香五月婷婷基地| 精品欧美乱码久| 91在线|亚| 在线a亚洲视频播放在线| 97天天摸天天碰| 啪啪性爱免费视频| 中出789在线视频| 美女午夜福利免费视频| 色麻豆AV| 在线播放中文字幕| 亚洲男人天堂AV| 国产av青草| 激情熟女12P| 成熟熟女国产精品一区二区| 午夜欧美女人操逼| 九九热精品视频六| 思思热免费视频观看| 色噜噜狠狠色综无码久久合欧美| 暖暖精品二区三区观看| 国产精品久久久久久久电影渣男| 深爱五月婷婷| 日本中文字幕不卡视频| 国产视频小说| 色色色综合| 快播电影网日韩新片| 乱人伦 国语对白:视频直接看| 亚洲AV成人精品网站在AV| 久9久精品视频| 激情五月婷婷综合| 成年人黄色| 国产精品天干天干综合网麻豆| 国产欧美一区激情交| 人人操人人摸人人骑| 一区二区首页| 操逼操操操91| 日韩人妻一区二区| 欧美日韩亚洲电影| 久久婷婷色| 日日操免费视频| 青女偷拍网| 蜜臀久久在线视频| 天天干天天狼在线视频| 91国产操逼视频| 四虎影视国产精品| 综合网亚| 天天天天干| 性暴力欧美猛交在线直播| 大鸡巴久久| 校园春色宗合网| 你操综合| 日本视频一区二区三区| 欧州一区二区三区四区| 天天性射网| 啊啊好多水| 日韩免费性爱视频在线观看| 国产v片在线免费观看| 久久久亚洲精品中文字幕人妻| 操逼精品视频| www.91色| 精品人妻1区| 男人在线天堂| 国产精品伦理| 日韩中文9| 国产精品久久发布| 色墦五月丁香| 日本一区二区做爱的视频| 亚洲人妻中文在线视频| 99re这里只有精品2| 人妻在线大香蕉| 日本天堂网| 蜜桃久久综合视频| 日本亚洲熟女视频| 熟女乱伦A| 国产狂喷潮在线精品| 91天天综合网| 丰满人妻-区二区三区免费看| 91 丝袜在线观看| 美国久久一二三四| 伊人青青一区成人视频在线观看区| www99热| 久久这里只精品99re66图| 另类小说综合网| 久久国产AⅤ| 91操操操操| 久久一区二区三区四区五区| 免费99精品国产自在在线| 日韩精品9区| 免费网站观看www在线观| 欧美日韩免费专区在线| 日韩伦理视频| 好吊色在线观看| 欧美日韩m| 91久久精品国产| 色香阁在线| 噜噜噜无码AV一级一级久久影院| 十八禁的黄污污免费网站| 无码丰满熟妇一区二区浪潮AV| 翔田千里一区二区三区奶水| 国产精品无码久久久久2025| 亚洲欧美一区二区网址| 一级二级三级黑人无码| 久久天天艹| 影音先锋视频在线| 偷拍自拍在线视频观看| 色嗨嗨在线| 国产a级午夜毛片| 三级三久久线久久99久目本WW| 色情五月丁香| 欧美一级A片在线看视频性色| 久久性爱城| 97chaopenrihan| 亚洲色图 91| 最近二区三区视频大全| 91亚洲网| 欧美 日韩 亚洲 春色| 韩日无码在线观看| 九九热在线视频| 在线啊啊啊啊| 欧美色图私拍91| 天美传媒av 在线| 无码99| 婷婷情色五月天| 婷婷15月天青娱乐| 肉丝中文无码高清| 国产精品操| 免费一级精品啪啪视频| 动漫爆乳3D奶水一区在线观看| 亚州伊人色综台| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 久湿久久| 中文字幕成人乱码熟女精品国50 | 国产丰满少妇久久久精品影院| 亚洲综合大片| 超碰色大香蕉| 无遮挡一级毛片视频免费的| 午夜黄色免费在线观看| 久久久亚洲精品电影免费看| 国产大片精久久久久久| 日韩资源网| 屁股久久久久久| 国产网站在线播放| 麻豆亚洲Av成人无码一区精品| 9久综合网| 青青伊人加勒比海| 一区二区高清视频| 草莓精品视频| 色老汉色| 久久9999| 亚洲一级黄色毛片| 国产AV久久久蜜爱影集| 插老姨肥穴| 午夜一区| 少妇高潮对白在线观看| 丰满人妻一区二区三区四| 内射黑丝袜| а√天堂资源官网在线资源| 免费啪啪啪网站18岁| 天堂九九九九九九九九九| 亚洲日产专区婷婷| 亚洲国产另类在线中文| 在线播放中文字幕| 久久草视频污视频| 殴美性天天| 午夜电影在线观看无码专区| 亚洲妇色| 97国产人人| 丁香六月啪啪| 日韩人人精品| 思思视频免费看网站| 在线观看AV不卡| 97se亚洲综合自| 色一色综合网| 国产精品在线一区二区| 国产精品久久久| 开心五月婷婷激情| 97国产精品久久久久| 福利操逼| 天美传媒在线一区| 97视频在线播放| 日韩三级一区 | 亚洲无码com| 亚洲少妇色| 亚洲熟妇A V黑人| 久操热| 欧美综合1性辶| 丝袜熟女一区二区三区| 97视频在线免费播放| 国产精品999zyz| 亚洲色图欧美色图制服诱惑| 岛国视频一二三区| 最新中文字幕av| 欧州一区二区三区四区| 中文字幕一区二区三区人妻少妇在线| 超碰色综合| 伊人影院在线理论播放| 欧美一级A一级a爱片久久| 91站街按摩店老熟女熟女| 97中文字幕一区| 人妻AV在线| 丰满人妻一区二区三区| 久久欧美1卡2卡3| 日韩大香蕉| 超碰激情808| 久热影视| 囯产精品强| 青娱乐日韩无码| 深喉吞精| 五月激情天| 蜜臀一区二区三区在线| 久久中文色图| 精品亚洲国产成人av网站| AV男人天堂网| 国产熟女免费观看久久| 蜜桃香蕉久草精品在线| 激情六月天| 日产欧美电影一区二区三区| 伊人991| 黄色av一区二区在线| 99超碰网| 日本免费不卡二区| 岛国色情视频在线观看| 色偷偷2020免费视频播放| 91大学精品激情戏| 日本羞羞的视频在线播放| 欧美精品 - 91爱爱| 国产一区在线免费播放| 亚洲天堂2020| 美女天天干| 亚洲日韩熟女人妻高清在线| 亚洲欧美色图片| 美女91在线观看| 97最新在线播放视频| 亚洲欧美天堂| 97在线资源| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 欧美天天综合在线| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 欧美日韩在线国产在线| 老熟乱一区二区三区四区| 嗯嗯嗯,草死我| 91丨熟女丨丰满熟女| 亚洲欧美不卡线| 九九九九九用不成了| 五月丁香| 色网在线视频观看免费| 久久岛国| 午夜精品人妻二区三区| 翘臀vidoes| 天堂无码精品国产久| 久九色| 黑人综合色| 99九九久久| 黄色AV影视| 五月丁香社区婷婷日韩欧美精品影院 | 91天天日| 亚洲AV无码国产精品久久久久| 日韩啊V| 黄色成年| 日日日色色色色色| 亚洲天堂区| 色官网在线| 日韩中文字幕人妻视频| 熟妇乱伦一区二区| 99re99在线视频| 97精选久久| 狠狠躁AV| 丁香五月色| 日韩黄色一区二区三区| 欧美大香蕉久| 狠狠操狠狠操操| 老女人综合| 久久99精品九九久久久婷婷| 91美腿丝袜在线观看| 五月天色图影视| 丁香五月性爱| 日本精品高清一二区一本到| 逼操网站| 欧美热图99| 亚洲 中文 欧美 日韩 在线| 久神马| 日韩丝袜高跟制服在线观看| 国产人伦精品一区二区三区| 精品一区二区3区| 丁香婷婷啪啪| 亚洲国产精品无码AV在线| 操逼逼一区视频| 亚洲A曰本VA欧美VA视频| 中文?日韩?免费?精品| 操东北女人| 成人线上超碰| 鸥美中出| 九九九久| 大屁股国产在线视频| 久久伊人青青草| 日本女厕偷拍| 黄色高清久久无码依人| 欧美无圣光在线| 日本日日色视频| 久久一二三四不卡| 国产精品久久久久久久久久久久久久久久| 欧美 青青草| 欧美一二三区四五区| 欧美美女在线高潮999| 求求你操操我| 亚洲精品一区二区免费在线观看| s片在线观看| 97视频新免费| 极品少妇99| 99抽插| 亚洲性猛| 91亚洲最新在线| 亚洲精品欧洲色| 国产内射爽爽大片| 欧美日韩午夜精品一区二区三区 | 蜜桃久久综合视频| 视频在线观看一二三区| 久久久久久91香蕉国产| 伊人久久蜜月|