免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

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

Java圖書管理系統(tǒng)實(shí)操:JDBC連接MySQL與核心代碼詳解 不搞花架子直接說(shuō)項(xiàng)目本身。圖書管理系統(tǒng)是Java入門到進(jìn)階階段出現(xiàn)頻率最高的練手項(xiàng)目同時(shí)也是很多計(jì)算機(jī)專業(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)過真實(shí)的數(shù)據(jù)庫(kù)操作。這篇文章就圍繞這兩件事展開把表結(jié)構(gòu)設(shè)計(jì)、JDBC連接、核心業(yè)務(wù)邏輯、常見坑位全部過一遍適合正在做課設(shè)、準(zhǔn)備Java面試或者想搞清楚數(shù)據(jù)庫(kù)連接細(xì)節(jié)的同學(xué)參考。1. 項(xiàng)目整體設(shè)計(jì)與需求拆解1.1 這個(gè)系統(tǒng)到底在解決什么問題圖書館的日常運(yùn)營(yíng)非常依賴借還書登記、圖書庫(kù)存盤點(diǎn)、讀者借閱記錄查詢這些操作。傳統(tǒng)手寫登記的方式效率低、容易出錯(cuò)管理員想查一本書在哪、誰(shuí)借走了、什么時(shí)候該還都極其痛苦。圖書管理系統(tǒng)做的事情本質(zhì)上就是為管理員提供一套數(shù)字化工具讓圖書信息和借閱記錄全部落庫(kù)通過程序完成信息的增刪改查。從用戶視角來(lái)看最基礎(chǔ)的功能需求包括幾個(gè)方面管理員登錄系統(tǒng)身份校驗(yàn)要可靠。圖書信息的錄入、修改、刪除和按條件查詢。借書操作要能校驗(yàn)庫(kù)存和借閱狀態(tài)。還書操作要能更新庫(kù)存和借閱記錄。借閱記錄的查詢方便追蹤每一本書的去向。標(biāo)題里強(qiáng)調(diào)“連接MYSQL數(shù)據(jù)庫(kù)”意味著這些數(shù)據(jù)不能優(yōu)雅地躺在內(nèi)存里——程序一關(guān)就全沒了而是要永久的、結(jié)構(gòu)化的存在MySQL里。這樣才能保證重啟程序后圖書數(shù)據(jù)還在借書記錄也在系統(tǒng)才有真正的使用價(jià)值。1.2 技術(shù)選型為什么走JDBC直連而不是直接上框架很多人會(huì)問現(xiàn)在都用Spring Boot MyBatis為什么還要用純JDBC手寫連接數(shù)據(jù)庫(kù)我用這個(gè)項(xiàng)目回答你因?yàn)樘^了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ù)的過程清晰暴露連接串怎么配、驅(qū)動(dòng)怎么加載、PreparedStatement怎么用全部看得見摸得著。代碼量適中適合一個(gè)人從零實(shí)現(xiàn)還能在面試時(shí)把項(xiàng)目講清楚。這套組合做出來(lái)的代碼結(jié)構(gòu)后續(xù)想遷移到Spring Boot版本時(shí)DAO層和實(shí)體類幾乎可以原封不動(dòng)搬過去改動(dòng)成本很低。1.3 數(shù)據(jù)庫(kù)表結(jié)構(gòu)設(shè)計(jì)三張表?yè)纹鹫麄€(gè)系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)是這個(gè)項(xiàng)目的根基。我見過不少同學(xué)代碼寫了一半發(fā)現(xiàn)表結(jié)構(gòu)不合理回頭改表又改代碼非常痛苦。設(shè)計(jì)階段多花十分鐘后面能省下半天時(shí)間。整個(gè)系統(tǒng)用三張表就夠用戶表usersid主鍵自增用戶唯一標(biāo)識(shí)。username用戶名登錄時(shí)使用。password密碼落庫(kù)時(shí)存MD5散列值不存明文。role角色標(biāo)識(shí)管理員和普通讀者的權(quán)限區(qū)分。real_name真實(shí)姓名用于顯示借閱人信息。圖書表booksid主鍵自增圖書ID。book_name書名。author作者。publisher出版社。price價(jià)格用DECIMAL(10,2)類型避免浮點(diǎn)誤差。stock庫(kù)存數(shù)量整數(shù)類型。category分類方便按類別篩選。借閱記錄表borrow_recordsid主鍵自增。book_id關(guān)聯(lián)圖書表主鍵。user_id關(guān)聯(lián)用戶表主鍵。borrow_date借書日期。return_date應(yīng)還日期。status借閱狀態(tài)1表示借出中2表示已歸還。外鍵關(guān)系上borrow_records表的book_id和user_id分別指向books和users的主鍵。從表設(shè)計(jì)上保證數(shù)據(jù)可追溯。圖書庫(kù)存的扣減在借書時(shí)同步更新還書時(shí)同步恢復(fù)這個(gè)業(yè)務(wù)邏輯放在后面講。2. 核心代碼實(shí)現(xiàn)與關(guān)鍵細(xì)節(jié)2.1 數(shù)據(jù)庫(kù)連接工具類JDBC連接的全過程不管寫什么功能模塊第一步永遠(yuǎn)是拿到數(shù)據(jù)庫(kù)連接。把所有連接邏輯抽到一個(gè)工具類里是項(xiàng)目初期就該做好的事。來(lái)找JDBC連接的經(jīng)典五步加載驅(qū)動(dòng)類。定義數(shù)據(jù)庫(kù)連接地址URL。DriverManager獲取Connection對(duì)象。通過Connection創(chuàng)建Statement或者PreparedStatement。釋放資源。工具類代碼我直接給出一個(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)類名。MySQL 5.x之前用的是com.mysql.jdbc.DriverMySQL 8.x后驅(qū)動(dòng)類改成了com.mysql.cj.jdbc.Driver。用錯(cuò)會(huì)直接報(bào)ClassNotFoundException這是高頻報(bào)錯(cuò)點(diǎn)。連接串參數(shù)。serverTimezoneAsia/Shanghai解決的是時(shí)區(qū)問題MySQL 8及以上版本服務(wù)器跟本機(jī)時(shí)區(qū)不一致會(huì)報(bào)錯(cuò)。characterEncodingutf8解決中文亂碼。useSSLfalse是關(guān)閉SSL校驗(yàn)本地開發(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)寫法不用每次getConnection都重復(fù)加載。驅(qū)動(dòng)注冊(cè)到DriverManager之后就常駐內(nèi)存了。2.2 用戶登錄模塊密碼校驗(yàn)與SQL注入防護(hù)登錄功能幾乎每個(gè)系統(tǒng)都有但我要在這單獨(dú)拉出來(lái)講是因?yàn)榈卿浤K最容易暴露安全意識(shí)問題。我見過不少項(xiàng)目源碼里用字符串拼接方式執(zhí)行SQL比如String sql SELECT * FROM users WHERE username username AND password password ;這種寫法非常危險(xiǎn)。用戶在用戶名輸入框輸入admin OR 11SQL語(yǔ)句會(huì)變成SELECT * FROM users WHERE username admin OR 11 AND password OR條件讓整條WHERE語(yǔ)句恒為真直接繞過密碼校驗(yàn)登錄成功。這就是最經(jīng)典的SQL注入攻擊幾乎所有數(shù)據(jù)庫(kù)安全類面試題都會(huì)問它。正確的做法是用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à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 圖書管理核心業(yè)務(wù)借書流程和事務(wù)邊界圖書管理系統(tǒng)的核心業(yè)務(wù)流是借書和還書。借書不是簡(jiǎn)單插入一條記錄就完事它涉及多張表的數(shù)據(jù)聯(lián)動(dòng)。以借書為例完整流程是校驗(yàn)用戶存在且角色為讀者。校驗(yàn)圖書存在且?guī)齑娲笥???蹨p圖書表的庫(kù)存。插入一條借閱記錄。這四個(gè)步驟里任何一步失敗整個(gè)操作都必須回滾。比如庫(kù)存扣減成功了但借閱記錄插入失敗就會(huì)出現(xiàn)庫(kù)存跟實(shí)際不相符的情況——書沒借出去庫(kù)存沒了。這是典型的事務(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)提交開啟事務(wù) conn.setAutoCommit(false); // 查詢庫(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(圖書不存在); } } } // 扣減庫(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才真正寫入數(shù)據(jù)庫(kù)。rollback是回滾讓之前執(zhí)行的SQL全部作廢。關(guān)于行鎖SELECT ... FOR UPDATE它把查詢到的圖書記錄鎖住避免多線程并發(fā)借書時(shí)大家都讀到stock1然后同時(shí)扣減變成負(fù)數(shù)。我自己實(shí)際測(cè)試過去掉FOR UPDATE的情況下用兩個(gè)線程同時(shí)借同一本書且?guī)齑嬷皇?本兩個(gè)請(qǐng)求都可能成功最終庫(kù)存變成-1。加了行鎖之后第二個(gè)請(qǐng)求會(huì)阻塞等待第一個(gè)事務(wù)提交提交后重新讀取庫(kù)存發(fā)現(xiàn)已經(jīng)是0直接拋異常這才是正確行為。2.4 還書流程別忽略狀態(tài)校驗(yàn)還書邏輯比借書簡(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ī)開發(fā)為例說(shuō)明每一步需要做什么。第一步安裝MySQL 8。Windows環(huán)境下直接去MySQL官網(wǎng)下載MySQL Installer只安裝Server和Command Line Client。安裝過程中的用戶名密碼記好默認(rèn)root用戶需要設(shè)置一個(gè)自己的密碼。安裝完成后在命令行用mysql -u root -p驗(yàn)證能登錄。第二步安裝Navicat或者直接用MySQL自帶的Workbench。Navicat勝在操作直觀建庫(kù)建表看數(shù)據(jù)都方便有條件的話可以用它快速核對(duì)數(shù)據(jù)是否寫入成功。第三步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里添加依賴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ù)打開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ù)也一并寫入方便程序啟動(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ì)用戶輸入的密碼加密再比對(duì)兩邊算法一致才能匹配。我自己踩過初始化數(shù)據(jù)里直接寫明文密碼的坑。初期偷懶把password字段存成123456登錄驗(yàn)證時(shí)也拿明文去比較數(shù)據(jù)庫(kù)里全是裸奔的用戶密碼。后來(lái)項(xiàng)目做完統(tǒng)一改用MD5才把這個(gè)問題處理干凈。建議從項(xiàng)目第一版開始就養(yǎng)成不落明文密碼的習(xí)慣。3.3 項(xiàng)目結(jié)構(gòu)搭建分包劃分與實(shí)體類設(shè)計(jì)代碼不是堆在一個(gè)類里就能叫完整項(xiàng)目。合理的包結(jié)構(gòu)讓代碼后期可維護(hù)也更容易講明白系統(tǒng)架構(gòu)。我建議用以下分包方式com.library ├── entity/ # 實(shí)體類 │ ├── User.java │ ├── Book.java │ └── BorrowRecord.java ├── util/ # 工具類 │ └── DBUtil.java ├── dao/ # 數(shù)據(jù)訪問層 │ ├── 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)景界面層需要顯示“借書成功”但它不應(yīng)該直接寫SQL而是調(diào)用service層的方法service內(nèi)部組織多個(gè)DAO方法協(xié)同完成借書流程。這樣改動(dòng)界面不影響數(shù)據(jù)庫(kù)代碼替換數(shù)據(jù)庫(kù)連接方式也不影響界面。實(shí)體類以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 圖書列表查詢分頁(yè)與排序?qū)嵅賵D書列表的展示不只是一條SELECT那么簡(jiǎn)單。系統(tǒng)里的圖書數(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ù)值直接拼上%即可搜書名、作者、分類都通用。關(guān)于LIKE查詢有個(gè)性能細(xì)節(jié)如果數(shù)據(jù)量大LIKE %關(guān)鍵字%這種前置模糊匹配是走不了索引的全表掃描。但圖書管理系統(tǒng)這種量級(jí)的數(shù)據(jù)完全夠用不需要過度優(yōu)化。如果想優(yōu)化可以引入Elasticsearch或者M(jìn)ySQL全文索引那是后話。排序方面同樣用ORDER BY實(shí)現(xià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保證一本都沒被借過的圖書也能出現(xiàn)在列表里借書次數(shù)為0。COUNT(r.id)統(tǒng)計(jì)每本書的借閱記錄條數(shù)按降序排列得到熱門圖書排行。這個(gè)SQL在面試?yán)镆步?jīng)常被問到JOIN和GROUP BY的組合使用。4. 常見問題與排查技巧實(shí)錄4.1 數(shù)據(jù)庫(kù)連接失敗驅(qū)動(dòng)、時(shí)區(qū)、權(quán)限三類大坑連接數(shù)據(jù)庫(kù)是整套系統(tǒng)最容易出問題的地方而問題基本集中在三個(gè)方向第一類是ClassNotFoundException報(bào)錯(cuò)內(nèi)容是ClassNotFoundException: com.mysql.jdbc.Driver。這個(gè)100%是驅(qū)動(dòng)類名或者驅(qū)動(dòng)jar包的問題。MySQL 8.x的驅(qū)動(dòng)類名是com.mysql.cj.jdbc.Driver你還在用com.mysql.jdbc.Driver就會(huì)報(bào)這個(gè)錯(cuò)。另外確認(rèn)引用的jar包版本高版本驅(qū)動(dòng)確認(rèn)類名寫對(duì)了沒。第二類是時(shí)區(qū)錯(cuò)誤報(bào)錯(cuò)一般是The server time zone value й?? is unrecognized。原因是MySQL 8服務(wù)器默認(rèn)使用系統(tǒng)時(shí)區(qū)而JDBC連接串沒有指定時(shí)區(qū)兩端對(duì)不上。解決方式是在URL追加serverTimezoneAsia/Shanghai。第三類是Public Key Retrieval報(bào)錯(cuò)MySQL 8的默認(rèn)認(rèn)證方式是caching_sha2_password客戶端連接時(shí)需要從服務(wù)端獲取公鑰做加密JDBC默認(rèn)行為不允許這個(gè)操作。URL里加useSSLfalseallowPublicKeyRetrievaltrue即可解決。我自己在項(xiàng)目聯(lián)調(diào)階段把這三類錯(cuò)誤輪著遇了一遍總結(jié)成一條經(jīng)驗(yàn)連接串務(wù)必一次性寫完整不要遇到一個(gè)錯(cuò)改一處太折騰。4.2 中文亂碼三層設(shè)置缺一不可中文亂碼問題出現(xiàn)得相當(dāng)頻繁而且一亂就是一大片。排查要按三層來(lái)檢查第一層數(shù)據(jù)庫(kù)。建庫(kù)和建表時(shí)指定CHARSETutf8mb4就是告訴MySQL這個(gè)數(shù)據(jù)庫(kù)要存unicode字符中文完全沒問題。忘記指定的可以用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ì)顯示一排煩人的問號(hào)。連續(xù)探查這個(gè)問題的經(jīng)驗(yàn)教訓(xùn)是先確認(rèn)數(shù)據(jù)庫(kù)存進(jìn)去的中文是不是正常的用Navicat直接看表。庫(kù)里是亂的就是數(shù)據(jù)庫(kù)建表和連接串的問題庫(kù)是正常的但程序顯示亂就是控制臺(tái)和JVM編碼的問題。4.3 業(yè)務(wù)邏輯Bug排查事務(wù)沒提交、庫(kù)存負(fù)數(shù)、并發(fā)沖突數(shù)據(jù)庫(kù)連接層打通之后業(yè)務(wù)層的坑就輪到在運(yùn)行時(shí)慢慢暴露了。我整理一下最常遇到的幾個(gè)不執(zhí)行commit就斷言數(shù)據(jù)寫進(jìn)去了。忘了setAutoCommit(false)之后一定要手動(dòng)commit或者寫代碼的時(shí)候根本沒意識(shí)到事務(wù)已經(jīng)開啟數(shù)據(jù)在另一個(gè)連接里死活看不到更新。排查方式確認(rèn)是否有事務(wù)開啟查到commit或rollback了嗎。筆記本還剩0本借書還能成功。這是庫(kù)存校驗(yàn)缺失導(dǎo)致的。解決方式在前面borrowBook方法里講過校驗(yàn)和扣減必須在同一事務(wù)里用行鎖保護(hù)絕不能在SELECT和UPDATE之間留出空檔。對(duì)了損壞數(shù)據(jù)還可能來(lái)自重復(fù)借同一本書。如果借閱表里已經(jīng)有一條status1的同圖書同用戶記錄新借書請(qǐng)求不應(yīng)該再成功。在插入新借閱記錄前查詢?cè)撚脩粼搱D書是否存在借出中的記錄即可。4.4 資源泄漏連接不關(guān)系統(tǒng)遲早卡到死這個(gè)問題雖然常見但在新手代碼里幾乎是批量出現(xiàn)。寫完Connection不去close獲取了ResultSet不去close程序跑不了幾個(gè)來(lái)回就報(bào)Too many connections。MySQL默認(rèn)連接上限是100多個(gè)連接不釋放就會(huì)把連接池占滿。我建議把所有資源關(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)閉代碼少而且不容易遺漏。如果用的是我前面寫的DBUtilclose方法也要在finally里確保調(diào)用。真實(shí)項(xiàng)目中連接不關(guā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)陋??梢杂肑ava Swing或JavaFX做界面把MainMenu替換成登錄窗口和主窗口BookDAO、UserDAO這些類不需要大改。這樣就變成了一個(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í)過程你自然就理解了框架到底幫你做了什么。第三個(gè)方向是補(bǔ)充還書逾期和罰款邏輯。在BorrowRecord里加一個(gè)shouldReturnDate的字段還書時(shí)用當(dāng)前日期跟應(yīng)還日期比較超期天數(shù)乘以每日罰款金額算出一個(gè)逾期費(fèi)用記錄這樣業(yè)務(wù)面就比普通的課設(shè)項(xiàng)目完整很多。第四個(gè)方向是權(quán)限體系的強(qiáng)化。讀者只能看到自己的借閱記錄管理員可以看全部借書也有容量限制這些都用role字段和SQL條件就能實(shí)現(xiàn)。給面試講項(xiàng)目的時(shí)候不要停留在“我寫了一個(gè)圖書增刪改查的系統(tǒng)”這種層面。重點(diǎn)講三件事數(shù)據(jù)庫(kù)表怎么設(shè)計(jì)的表間關(guān)系是什么JDBC連接MySQL踩過哪些坑怎么定位和解決的借書的庫(kù)存扣減和借閱記錄的寫入為什么放在一個(gè)事務(wù)里。把這些問題想透了比堆砌功能列表管用得多。我個(gè)人在帶項(xiàng)目時(shí)最常跟新手說(shuō)的一句話是能跑通只是代碼的及格線知道自己為什么能跑通才算是學(xué)會(huì)。這個(gè)項(xiàng)目做完你至少應(yīng)該能回答為什么用PreparedStatement而不是Statement為什么借書要用事務(wù)為什么庫(kù)存要加行鎖為什么密碼要加密存儲(chǔ)。能在紙上畫出三張表的關(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ù)查詢這層走通了代碼層的排查范圍瞬間縮小問題定位效率非常高。這個(gè)習(xí)慣我用在所有的數(shù)據(jù)庫(kù)項(xiàng)目里實(shí)測(cè)下來(lái)很穩(wěn)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
超级碰碰99| 深爱激情综合网| 久人操| 亚洲第一成人无码A片| 五月天婷婷一起草| 五月丁香精品| 色播五月丁香综合| 人碰人人人玩91| 99人妻碰碰碰久久久久禁片| 色综合久久五月天| 丁香五月婷久久| 丁香六月色婷婷欧美| 男人天堂AV在线一区二区| 国产精品国产成人国产三级| 六月婷婷中文字幕| 五月婷婷婷婷| 91狠狠综合久久久| www.天天干| 欧美A级网站| 白人荫道BBWBBB大荫道| 天天做夜夜爽| 六月激情婷婷| 九九在线精点品| 亚洲操B| 桃色激情婷婷伊人网| 久艹大香蕉| 五月婷婷操操| 午夜无码熟熟妇丰满人妻 | 狠狠搞狠狠操| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 婷婷在线播放| 五月综合视频| 婷婷综合97| 97色色色色色| 可以看的av网站| 丁香五月另类小说在线阅读| 久色成人| 人人爱人人添| 六月丁香激情| 激情久久久久| 久久九九网| 色婷婷操逼| 99色色网| 丁香五月自拍| 五月激情在线| 丁香六月丁香婷婷激情| 99操不停| 五月天丁香成人| 午夜丁香六月婷| 婷婷情色五月| 超级碰碰91| 九九大香视频| 97丁香花五月天激情小说| 成人网址在线观看| 婷婷亚洲丁香五月| 99久久性爱| 久久婷婷成人综合色怡春院| 亚洲中文字幕AV| 色婷婷电影网| 久久色六月| 20253AV| 亚洲V国产V欧美V久久久久久| 国产人妻777人伦精品HD| 天天日夜夜拍| 97日本在线播放| 色婷婷六月| 玩熟女五十AV一二三区| 停停综合色色| 色色99色色| 99秘 在线| 色大综合| 亚洲综合在线播放| 天天色天天操天天射| 亚洲春色奇米影视| 色色丁香婷婷综合| 激情五月婷婷综合网| 丁香六月亚洲综合| 久久婷婷精品| 色婷婷五月综合色婷婷| 五月天无码| 婷婷国产日本欧美| 久热黄色| 91久女| 色色丁香五月| 色五月aV| 天天狠天天叉| www.com在线操视频免费观看| 日韩三及成人AV片| 开心五月丁香啪| 久久六月天| 婷婷五月激情中文字幕| 99久久新视频| 丁香五月婷婷激情123| 色久丁香五| 噜噜视频| 色五月天丁香婷婷| 99热这里只有精品3| 狠狠做婷婷| 丁香五月天天久久综合小说| 丁香五月性爱| 色噜噜狠噜噜视频| 久久涩视频| 综合大香蕉| 五月天婷爱综合| 大香蕉中文| 亚洲精品V天堂中文字幕| www.久久色.com| 婷婷五月激情四月综合| 五月天色色婷婷| 亚洲爆乳无码精品AAA片蜜桃| 91VIP在线观看| 成人视频一区| WWW免费视频碰碰碰碰| 韩国真做片在线观看| 先锋资源婷婷| 六月婷婷色| 国产精品涩涩涩视频网站| 色色日本欧美| 六月份天丁香婷婷| av五月丁香| 思思99热这里只有精品| 五月婷婷色播| www.maotanji.com| 色99自拍| AV在线大香蕉| 超碰人人超碰| 九九热re99re6在线精品| 激情五月丁香激情综合网| 99自拍视频网站| 午夜在线成人网站免费观看| 亚洲国产成人裸舞| 婷婷99视频全集高清| 欧美A级网站| www.婷婷| 婷婷操久久| WWW,五月| 热久久色| 日韩操人| 婷婷五月综合婷婷| WWW.国产| www.夜夜騎夜夜狠| 99九九这里有免费视频| 天天谢天天操| 性色综合网| 五月婷婷深爱六月| 天天综合区| 五月天堂婷婷| 91av传媒高清在线视频网| 啪啪色激情五月天| 99精品在线播放| 欧美日本VA| 久99| 五月丁香综合久久| 九九九九九九热| 激情综合网 激情五月天| 超碰狠狠操| 婷婷欧美偷拍综合| 密着浓厚中出乚交尾GvG935| 热成人网| 婷婷激情在线| 欧美大肥婆大肥BBBBB| 99热视| 久久综合中文| 天天日天天草| 一起草Av| 99久久66综合| 国产精品美女| 99在线观看亚洲| 五月婷婷啪啪| 天天做 天天爱| 成人精品免费在线观看| 天天爱天天吃狠天天透| 婷婷亚洲天堂| av五月天婷婷丁香| 在线播放中文字幕| 综合久久五月| 日韩人妻无码精品| 国产AV一区二区三区最新精品 | 久9热| 久久久久久久久久久久久久人妻视频| 久久日婷婷| 天天草天天爽| 美女婷婷六月色| 九九色网专区| 丁香五月播播| 狠狠色噜噜色狠狠狠综合久久成人波 | 九九超日本| 激情都市丁香婷婷| ji'qing'luan'ren'lun| 99资源在线视频| 亚洲日日操| 丁香五月天五码婷婷| 97久操| 色婷婷欧美| 开心激情色婷婷五月天| 欧美激情伊人| 超碰只有精品在线| 五月丁香啪啪网| 五月天婷爱综合| 无码A片一区二区免费| 婷婷五月天激情小说| 亚洲天堂AV免费片| 午夜天堂啪啪| 久草丁香婷婷五月天婷| 婷婷五月激情四射手| 丁香 亚洲 久久| 日日操夜夜爽白洁| 欧美va在线观看| 99福利视频导航| 久久99精品视频| 极品五月天| 二色av| 2050人人操免费工开爱 | 亚洲精品国产A久久久久久| 人人人人人人人人人草| 丁香六月久久| 久久五月天免费网站| 91日本在线观看| 婷婷五月六| 99激| wuyuedingxiang99| 九九自拍网| 操精品9| 亚洲操B| 开心激情站| 婷婷色色网| 亚洲激情AV| 97人妻碰碰碰碰碰久久久久久| 99re久久| 99精品无码| 91丨九色丨白浆秘| 久久超级碰碰| 伊人超碰| 日韩在线视频中文字幕| 婷婷五月天激情电影| 亚洲综合色棒| 久久婷婷五月天亚洲欧美| 天天搽天天射| 亚洲综合视频天天精品| 激情婷婷五月天。| 婷婷5月色| 丁香大香蕉| 五月丁香婷婷啪啪网| 以及AA大片看看| 91人在线观看| 99色嘟嘟精品网站| 操草草草| 丁香五月婷婷大香蕉| 99久热视频在线| 亚洲欧美在线观看| 婷婷丁香五月综合网| 亚洲精品国产熟女久久久| 色色色成人网| 国产小精品| 婷婷激情图片| 亚洲日本韩国| av婷婷丁香| 狠狠色噜噜狠| 婷婷丁香综合| 日韩婷婷| 插少妇综合网| 俺也去在线视频 | 五月天激情啪啪| 色婷婷a三区麻| 精品无码久久久久久久久| 婷婷五月天激情网| 99精品偷自拍| 欧美性爱专区| 99九九热视频| 99热 这里只有精品 国产 日韩| 色碰干| 亚韩在线视频| 五月激激网w'w'w| 国产26uuu视频| 狠狠操.COM| 丁香五月天成人| 亚洲日日操| 五月丁香啪啪| 99精品热| 婷婷狠狠爱| 丁乡久久| 六月婷伊人| 婷婷丁香五月天中文字幕| 色色色图| 婷婷五月天成人| 嫩草AV久久伊人妇女超级A| 成人综合视频网址| www.91久久| 久久综合热17c| 99久久综合网| 亚州操操| 五月天丁香婷婷视频网址| 天天爽天天操| 亚洲无码99| 一级片操逼视频| 亚洲色婷婷五月天| 激情综合网亚洲色图| 丁香六月婷婷综合啪啪| 99热精品在线观看| 婷婷五月丁香欧洲| 99综合一区| 天天搞天天色综合| 午夜AV网| 激情综合婷婷五月| 天天噜| 超碰在线99| 婷婷六月天| 五月丁香婷婷色| 婷婷激情丁五月| 久草热在线视频| 91啪啪视频| 91精品综合久久久五月天| 综合色99| 涩婷婷五月天在线精品视频| 99热热热99精品婷婷| 人人干女人| 久久亚洲精品成人无码网站导航| 久久天堂网| 人妻无码视频网| 九九精品99| 五月天婷婷中文字幕在线播放| 人人操97| 骚五月婷婷| 亚洲五月综合色播| 婷婷五月天AV| 激情五月丁香五月| 色婷天天| 丁香五月开心亚洲| 丁香六月婷婷综合欧美| 五月天婷婷综合色| 久久久婷丁香五月| 精品一二三区久久AAA片| 久久9999| 婷婷五月天视频免费在线观看| 国产精品天天狠天天看| 五月激情网五月综合网| 五月丁香激情综合网| www.色色五月天.com| 久久久精品色色色| 婷婷综合国产| 天天综合网亚洲综合网| 婷婷色影音天| 思思精品久久艹| 91啪啪| 九九無碼| 午夜丁香婷婷| 六月丁婷婷| 久久婷五月天| 综合五月草| 99精品久久久| 99久久9| 色五月天丁香婷婷| 天天色天天射天天日| 天天在线XXX| 婷婷WWW久久| 亚洲行行色色| 五月天激情综合网| 在线中文亚洲| 玖玖色综合| 日本久久婷| 婷婷五月丁香久久| 国产亚洲99久久精品| 九九热a| 亚洲综合激情五月久久| 99惹在线精品免费观看| 最新高清无码专区| 国产精品色婷婷AV综合色色| 91色干| 色日本综合| 99人人干人人| 五月天另类激情在线| 91碰碰| 在线99热| 综合激情深爱| 97视频久久| 99热免| 99综合色色色| 久久九九激情五月天| 五月天色婷婷基地| 人人操人人干AV| 激情婷婷色色| 26uuu亚洲色| 1024成人免费看| 丁香五月天AV| 亚洲精品网站色视频| 无码人妻精品一区二区蜜桃色欲| 婷婷亚洲色| av操一操| 婷婷五月成人| 亚洲色热| 婷婷区日本| 五月婷婷婷色| 日韩aaa| 巴基斯坦粉嫰无码视频| 激情图片久久| 欧美三级巜人妻互换| 色色色.COM| 五月天伊人综合| 五月天偷拍| 五月婷婷我| 天天搞天天色综合| 亚韩精品视频1区| 欧洲色色| 五月综合六月婷婷| 激情综合五月激情XXXX| 亚洲av无码影院| 人人操五月天| 色99色| 桃色激情婷婷伊人网| Www.久久| 极品人妻VIDEOSSS人妻| 久久停停超碰| 天天摸人人摸| 五月丁香婷色| 久久综合爱| 在线不卡AC| 国产激情AV| 色五月婷婷啪啪五月| 99九九99九九九视频精彩| 亚洲精品久久久久久久久久吃药 | 久久人人人人妻| 超碰在线观看9| 超碰在线免费观看日韩| 五月天色区| 激情五月丁香五月| 五月丁香色狠狠干大屄| 久久网站观看免费欧洲国产| A1片久久久| 六月婷综合| 色偷偷五月天| 五月丁香久久综合| 婷婷久久综| 亚洲第一色区| 五月天色婷婷基地| sewuyue第四色| 在线五月婷婷小电影| 九九中文字幕九| 丰满少妇猛烈A片免费看观看 | 午夜在线成人网站免费观看| 天天色情站| 色五月婷婷色| 综合色色网| www五月| 国产精品久久久久久五月天加勒比| 久99| 精品婷婷五| 久久99久久99精品免观看粉| 91久久综合亚洲噜噜成人在线| 在线不卡AC| 福利视频在线播放| 亚洲成av人影院| 91精品久久久久久77777| 超碰99在线观看| 操逼六区| 高清视频一区| 99色精品| a网站免费观看| 久久久精品色| 97在线视频观看| 99精品网| 丰满少妇猛烈A片免费看观看| 色情五月丁香| 亚洲无AV在线中文字幕| 成人做爰黄A片免费看直播室男男| 26uuu另类亚洲欧美日本一| 丁香婷婷六月天| 伊人久久大香线蕉av最新| 婷婷久久内射| 色五月天丁香| 婷婷五月天成人五月天| 午夜理论片最新午夜理论剧| 无码中文一区二区三区| 欧洲免费视频色| 狠狠色综合五月| 丁香六月天婷婷开心综合| 伊人婷婷色激情丁香| 色婷激情网| 激情综合色| 婷婷五月天激情五月天深爱五月天| A网在线欧洲| 国产婷婷五月天| 丁香五月成人av| 99热碰碰| 久久综合五月天| 91中文狠狠综合| 日本三级日本黄色| 国産精品| 秋霞电影理论| 五月丁香啪啪网| 激情六月丁香| 丁香五月花| 秋霞网在线免费基地五月婷婷丁香| www.激情com| 91精品久久久久久| 9久热这里只有精品| 色播五月| 久久女婷| 涩 五月 婷婷 狠狠| 爱久综合| 中文字幕久久一区二区三区| 久久久香| 五月丁香婷婷色啪| 久久丁香五月| 激情都市五月天| 日本色五月婷婷| 激情五月天视频| 中文字幕在线人妻| 五月丁香怕啪啪| 久狠日av| 色五月亚洲| 九九偷拍网| 青青操绿aaa一区日v| 丁香涩涩爱| 五月丁香狠狠爱| 婷婷五月色播天| 欧美精品99| 伊人狠狠综合| www激情| 9|在线观看视频| 九九综合色| 狠狠色婷婷777| 超碰狠狠操| 人妻激情视频| 色综合色综合网| 久久五月天婷婷| 成人短视频免费| 激情5月婷婷狠狠干| 日日日日日| 潘金莲AAAAAAAAAA| 日本人妻丁香婷婷久久寝取熟女五月| 日韩欧美成人片| 色色五月婷婷网| 天天骑日日爽| 五月天婷婷基地综合网| 伊人久热91网| 淫水导航| 性无码专区无码| 色色丁香婷婷| 91青娱乐青青草| 五月丁香婷久久| 天堂婷婷五月色| 婷婷五月天久久久| 色欲丁香| 成人在线不卡| 欧美性猛交99久久久99| 激情深爱综合网| 人妻第九页| 激情婷婷五月天网址| 五月天色色色| 婷婷五月综合在线| 超碰人人干| 996精品热视频| 五月婷婷六月丁香色| 日本波多野结衣视频| 婷婷五月免费观看| 色婷婷电影网| 丁香 婷婷五月| 天天干一干| 色婷网| 色婷婷伊人| 91丨九色丨熟女丰满| 色五月婷婷色五月婷婷色五月婷婷| 成人在线观看精品| 99热这里只有精品最新地址获取| 依人大香蕉在钱1| 丁香六月天堂| 99热在线免费观看精品| 色五月天在线| 超碰免费人人肏| 能看的AV网站| 日本三级第一页| 国产精品久久久丁香五月八戒视频| 青草青草视频2免费观看| 亚洲色五月天是什么| 久久久天堂国产精品女人| 99热无码精品| 夜夜嗨一区二区三区直播内容 | 色吧网91| 天天做天天爱天天爽综合网| 五月丁香婷婷成人版| 玖玖五月| 丁香五月综合| 在线中文字幕视频| 91久久99久久91熟女精品| 婷婷五月综合色中文字幕| 色婷婷狠狠| 五月婷婷co.m| 91丨九色丨国产打屁股网站| 五月精品| 五月花综合网| 91黄色五月天视频| 伊人玖玖婷婷| 激情五婷精品网在线观看网址| 综合久久婷婷| 欧美成人精品老美女噜噜噜| www.综合久久.com| 大香蕉人妻| 9999色色色色| 久久人人九| 亚洲精品成人| 欧州色色| 66精品国产成人| 色狠狠色噜噜AV天堂五区 | 婷婷五月激情小说| 亚洲人妻一区二区| 99精品久久久久| 国产成人+综合亚洲+天堂| 九九久久五月天综合伊人| 婷色视频| 最近中文字幕大全免费版在线| 婷婷五月天综合小说网| 婷婷九九| 婷婷丁香色女人| 亚洲午夜av| 激情五月天小说视频| 久久视屏这里只有久久| 丁香六月欧美| 五月欧美色色五月| 日韩另类在线观看| 亚洲春色奇米影视| 成人片在线播放| 日本噜噜色网| 97狠狠色| 五月天婷婷网站| 亚洲精品婷婷| 久久亚洲无码| 中文不卡一二区| 精品婷婷| 玖玖爱导航| 嫩BBB搡BBBB榛BBBB| 婷婷久久免费| 深夜激情网| 日韩抽插操逼| 久久久99久久| 久久九九re热| 五月婷婷香蕉| 97天堂| 玖玖婷婷五月| 婷婷王月天影院| 天天做天天爰天天爽天天无遮挡| 97在线刺激| 色婷婷五月丁香色| 99热热热99精品婷婷| 九九色热| 亚洲成人一区| 天堂综合久久 | 五月婷婷AV| 日日夜夜噜噜爽爽| 开心四月婷婷在线色播播| www,色婷婷| 97操女视频| 久久综合婷婷激情| 国产av天堂| 婷婷狠狠操| 4399在线日本A片| 精品乱码久久久久| 亚洲欧美一区二区三区四区爱爱动图| 人妻久久做| 激情婷婷黄色五月| 亚洲9久久精品| 久久久久久久久久久久久9| 思思99热| 亚洲无码99| 91精品久久久久久77777| 丁香五月天婷婷中文字幕| 99爱这里只有精品免费视频| 色综合久久88色综合天天| 国产精品久久久久久五月天加勒比| 久久五月天激情婷婷| 性色欲情 网站| 五月久久五月激情| 天天拍夜夜撸| 亚洲视频在线观看99| 第二色AⅤ| www.99热最新视频8| 电影蜘蛛女| 丁香五月天天日| 五月丁香狠狠爱婷婷综合| 五月婷婷综合色啪| 亚洲人人操BD| 丁香五月天堂| 色色丁香婷婷综合| 色色射| 思思精品视频| 国产SUV精品一区二区883| 婷婷射图| 天天肏夜夜肏| 99久久极情精品一区| 色色色婷婷五月天| 99精品在线观看视频| 久久婷婷热| 少妇2做爰HD韩国电影| 日本人妻伦在线中文字幕| 色色色com| 亚洲视频在线网| 欧美性猛交99久久久99| 91 九色 熟女| 五月丁香六月合| 激情五月婷婷六月丁香| AV在线观看网站| 激情五月天婷婷| 久草婷婷在线| 99在线资源| 蜜臀A∨在线水帘洞| 五月开心婷婷| 久久婷婷综合国产| 操一区| 成人婷婷色综合| 丁香五月激情月| 久久久这里都是精品| 久久综合伊人综合在线| 五月丁香六月婷婷姐| 久久曰曰| 色婷婷精| 亚洲午夜精品久久久久久人妖| w婷婷五月婷婷w| 婷婷五月俺要去| hd五月婷婷在线| 另类图片五月天| 亚洲综合五月天婷婷丁香| 激情综合丁香| 四色综合网| 婷婷色av| 色婷久久| 五月狠狠| 先锋资源 996| 婷婷99狠狠躁天天| www.韩日视频| 天天综合亚洲综合网天天αⅴ| 成人视频婷婷| 白人荫道BBWBBB大荫道| 婷婷五月综合色拍| 开心五月丁香啪| 狠狠综合久久| 日本在线wwww| 天天综合干| 色五月婷婷中文字幕| tingtingseav| 加勒比色色| 超碰免费人人| 欧美色色日韩| 五月丁香久久综合精品| 九月婷婷综合| 综合一区二区三区| 五月婷婷丁香网| 任你躁XXXXX麻豆精品| 色色婷婷五月天| 思思热视频在线| 欧美性爱丁香五月| 激情五月天之六月婷婷| 日日撸夜夜操| 超碰免费在线| 五日激情综合| 婷婷久久婷婷色五月| tingting五月天亚洲| 激情色色| 婷婷丁香亚洲色综合91| www99热| 狠狠操狠狠色| 天插天啪天啪天啪| 熟女人妻一区二区三区免费看| 亚洲精品国产setv| AA久久| 激情九月天天天天婷婷| 日日天天干| 天啪天啪天啪天啪| 久久人妻伊人| 去色色五月天| 五月天婷久精视频| 中文成人在线| 国产欧洲欧洲精品久久| 日本理论久久| 亚洲婷婷欧美婷婷| 激情六月婷婷啪啪| 五月婷婷日| 丁香五月成人网| 五月婷婷日| 99热综合| 91在线日本| 超碰人人99| 丁香五婷婷| 五月婷婷激情日本| 色综合久久综合中文综合网| 91无码视频| 伊人干综合| 综合激情站| 一夜福利不卡| 草草女人亚洲| 婷婷开心久久| 怡红院91a√| 天天干天天拍| 九九久久五月天| www超碰| 色五月婷婷五月丁香五月激情五月视频 | 五月丁香激情深爱婷婷| 激情婷婷在线| 五月婷婷激情网| 97碰免费视频在线| 色五月综合| 另类小说五月天综合网| 五月天激情日色在线| 久热免费视频| 99热这里只有精品26| 国产乱子轮XXX农村| www,色中色| 九九九九无码| 丁香婷婷久久| 丁香六月色情| 久久久久久18| 久热无码| 亚洲婷婷激情888精品久| 丁香五月天社区婷婷| 人妻激情在线| 日本在线免费中文com.| av一区二区电影免费在线观看| 婷婷在线播放| 99热精在线九九久久保| 情色五月天 网站| 外国碰视频网站97| 四虎婷婷五月天| 天堂网色色| 五月丁香| 色色亚洲| 深爱开心激情网| 综合亚洲AV| 久久婷婷亚洲| 婷婷五月激情视频在线| 久久久激情| www.色色色com| 91超碰在线观看| 无码婷婷五月天| 丁香婷婷五月色成人网站| AA片在线观看视频在线播放| 天天操婷婷| 成人超碰AV| 亚洲成Av人片乱码色第1集| 丁香婷婷激情| 噜啊噜在线| 人人射av| 六月婷婷综合| 激情骚五月| 做爰丰满少妇1313| 99精品久久久| 99视频这里只有精品10| 蜜臀A∨在线水帘洞| 玖玖色资源| 色五月婷婷777| 色欲一区二区三区精品A片| 婷婷色五月丁香六月欧美啪| 婷婷免费成人视频| 色欲色天天香综合| 五月天婷婷丁香人人操91| 亚洲操逼网| 91干视频| 丁香五月六月综合欧美| 日夜夜天天| 成人天天爽| 精品成人在线观看| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 色综合大香蕉| 亚洲无码九九九| 国产人妻777人伦精品HD| 综合色色网| 激情综合一| 天天爽日日爽夜夜爽| 婷婷五月天,影院| 九九色中文| 狠狠色97| 婷婷五月天AV在线| 婷婷色基地在线看 | 色日本综合| 在线五月婷| 欧美性色A片免费免费观看的| 九九热中文| 丁香五月天.com| 亚洲六月婷婷| 五月天色婷婷综合| 五月天婷婷激情在线色图| 99热这里只有精品2024| 97涩涩丁香五月天| 丁香五月第九色| 梁铮版蜘蛛女在线观看| 亚洲性受XXXX五月丁香| 婷婷在线精品| 九九色热| 中文网AV| 亚洲综合激情五月天婷婷| 成人精品在线观看| 色色五月婷| 噜噜狠狠| www.激情五月天.com| 成人操呦av| 综合激情啪啪| 色小说婷婷五月天天天| 五月天堂婷婷| 亚洲激情色色| 免费播放99性爱视频| 五月开心深深爱激情综合| 色五XX| 狠狠综合网| 婷婷性爱网| 九九無妻| 精品国产乱码久久久久夜深人妻| 欧美槡BBBB槡BBB少妇| 久久国产一区二区三区| 9|人妻人人操| 五月婷婷97| 伊人网碰碰| 激情五月综合| 五月亚洲激情| 成人精品99| 开心激情综合| 伦乱天堂| 五月综合久久| www.seqingwuyuetian| 天天日P天天射P| 97色啪| 天天综合情| 五月天全国最大成人网| 最新丁香六月婷婷| 久婷| 亚洲精品V天堂中文字幕| 国内熟女黄色系列| 日本97在线| 丁香色婷婷五月天| 成人婷99最新| 丰满人妻一区二区三区| 婷婷天天五月天| 插逼综合网| 99综合婷婷五月| 九热视频| 99性爱视频| 我淫我色婷婷五月天激情四射| 碰超在线九色| 18av天堂| 婷婷瑟瑟五月天| 亚洲欧美成人在线| 婷婷香草网| 人人性久久| 五月熟妇婷婷久久| 激情五月色婷婷| 丁香婷婷久久| 夜夜AVV| ww亚洲ww在线观看| 噜噜色婷婷| 在线99热| 日韩无码人妻一区二区| 亚州激情在线视频| 国产亚洲色婷婷久久99精品91| 五月婷婷丁香| 久久一级片| 婷婷激情六月中文| 久久精品视频99| 婷婷丁香五月天激情四射| 激情五月天色色网| 婷婷五月天黄色小说| 激情五月天婷婷| 五月花激情网| 99re思思热这里| 开心五月激情网| www.91AV.com| 亚洲熟妇AV综合网五月丁香伊人| 天天干天天操天天射| 狠狠精品干练久久久无码中文字幕| 91婷婷色| 五月丁香在线综合| 99网| 97婷婷色| 九九热在线视频| 丁香五月狠狠在线观看| 九九激情网| 思思热视频在线观看| 99ER热精品视频| 思思热这里只有精品视频666| 日韩九九| 色级停停| 天天做天天爰天天爽天天无遮挡| 超碰成人电影| 国内久久久精品99| 丁香五月欧美激情| 性色做爰片在线观看WW| 婷婷激情小说网| www,色婷婷| 婷婷五月丁香综合桃花色网| 亚洲综合色丁香五月天| 99九九精品| 9色在线| 人妻激情在线| 在线视频激情网站| 日本色色视频| 美女视频图片久久91| 激情黄色小说五月天| 免费看欧美成人A片无码| 婷婷五月成人| 五月天社区| 久热AA| 国产无人区大片| 超碰9在| 九九热在线精品视频| 丁香五月天社区婷婷| 日本成人噜噜| 免费视频1区| 这里只有精品9| 97综合视频在线| 六月婷婷国产| 超碰免费人人肏| 国产色五月| 亚洲综合视频八| 色永久| 殴美97色| 99久久五月婷婷| 亚洲AVDVD| 夜夜操狠狠操| 五月天社区婷婷丁香社区| 欧美Va婷色| 久久视频婷婷| 五月天丁香成人社| AV五月丁香| 婷婷综合久久| 五月丁香久久网| 大战熟女丰满人妻AV| 热99久久这里只有精品| 热99色| 婷婷六月丁香欧美视频在线| 伊人久久综合| 99操久久| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 婷婷色色播五月天| 久久ri精品| 日婷婷久久开心| 欧美色色色色色色色色色色| 狠狠综合网| 亚洲欧洲色色| 亚洲精品第一国产综合亚AV | 91在线视频综合| 99久久婷婷| 丁香六月亚洲| 99久久国产综合精品五月天喷水\| 色婷婷小说| 任你日视频| 婷婷五月天成人| 精品,99| www久久艹| 久久色情| 婷婷激情社区| 亚洲视频五区| 伊人在线视频| 五月婷婷在线免费观看| 超碰在线国产| 日韩综合成人| 亚洲婷婷基地| 色欲五月天| 色色丁香五月天社区| 91久久99久久91熟女精品| 精品综合久久久久久五月天| 字母不卡码人逼| 91久久久久久久久18| 婷婷操逼网| 97干综合网| 成人国产欧美大片一区| 婷婷五月天国产在线播放| 桃色Av色哟哟| 婷婷五月丁香综合桃花色网| 天天天干夜夜夜操| 五月婷婷综合精品| 色婷婷丁香五月天| 久草 tingting| 激情五月婷婷五月| 亚洲亚洲亚洲AAAAAA| 亚洲操人| 超碰京东热av男人的天堂| 这里只有精品1| 99热在线观看精品| 久热2025无码| 9有码中文| 久久桃花网色婷婷| 亚州色色色| 天天干天干| 五月丁香六月婷婷在线小说视频| 色婷久| 五月天天丁香婷婷| 五月天色社区| 天天爽天天操| 亚洲婷婷成人五月天| AV色五月婷婷| 操人精品| 99视频在线9| 丁香五月影院| 色噜噜五月天| 综合激情网激情五月。| 综合五月草| 久9精品视频| 97干资源在线观看| 国产精品涩涩涩视频网站| 色婷婷伊人| 天天日天天干天天爽| 天天色综合色| 26UUU一区二区| 婷婷激情视频| 丁香婷婷五月人体| 五月桃花网综合| 天天综合精品| 五月婷婷片| 殴美激情综合网| 久久a热| 五月婷婷免费看| 伊人五月网| 国产六月婷婷| 免费国产VA国产免费| 99日本黄站| 99亚洲精品视频| 92久操视频| 色五月天 丁香| 蜜臀久久99精品久久久久久酒店| 日韩无码成人电影| 欧美25p| 91九色精品熟女内射| 色婷婷久久| 婷婷国产成人| 99这里只有精品|v| 五月天,激情四射,婷婷频道| 婷婷日日天天| 天天色色婷婷| 色大综合| 久久婷婷五月草视频| 99亚洲大片精品永久在线观看| jiujiu无码五区| 日本精品。999| 婷婷五月天,影院| 精品综合久久久久久五月天| 丁香五月天人体| 人色五月天婷婷| 五月天综合区| 26uuu亚洲欧美| 婷婷五月天激情综合深爱激情| 婷婷香五月综合激情| 天天操综合网站| 人人草开心五月天| 色五月婷婷九月| 大香线蕉伊人| 色色色999| AV操操操| 中文字幕日产A片在线看| 在线看的免费网站| 六月五月天婷婷涩播在线| 久久婷婷一级片| 绿色小导航AV| 久久婷婷色综合| www.日本久久videos| 日日操夜夜爽白洁| 天天干夜夜b| 五月天社区狠狠| 天天影院色| 丁香花色色网| 人妻久久久| 久久涩视频| 婷婷五月丁香香蕉| 婷婷五月av| 就爱操www com| 在线1青婷| 99自拍视频网站| 丁香六月啪| 99热在线中出| 五月天婷婷色色网| 大香蕉久久伊人婷婷五月丁香| 色国产五月| 骚。com| 日本久久高清| 少妇高潮呻吟A片免费看软件| 国产操B| 五月丁香久久呀| A一级操| 思思热高清在线观看| 超碰操网| 逼特逼在线免费播放| 亚洲成Av人片乱码色第1集| 伊人久久99| www激情网| 国产精品国产| 久久久婷| 五月丁香婷色| 婷婷五月在线综合| 婷婷五月无码| 亚洲六月色| 丁香操逼| 99视频在线| 国产婷婷五月天| 五月丁香天堂网| 久久五月丁香综合| 国产 码在线成人网站| 可以直接看的AV网站| 九九激情综合| WWW、99热| 欧美婷婷六月丁香综合色| 色丁香婷婷| 五月婷婷开心网| txt五月激情四射网综合俺也来了 五月天婷婷丁香人人操91 | 天天天天做夜夜夜夜做| 色婷婷成人网| 97色精品视频| 午夜婷婷丁香| 亭亭五月丁香五月天激情| 国产亚洲在线观看| 91丨九色|PRNY熟妇| 天天干-天天日| 婷婷激情六月| 婷婷久久草| 97干在线| 99色五月| 色婷婷先锋| 人人播| 97日本在线| 五月色婷婷AV| 色色色成人网| 四月婷婷五月丁香| 99热只有这里才是精品| www.99视频| 热99在线精品| 五月婷婷福利| 99精品偷自拍| 九九色综合| www99在线观看视频| 一区操| 五月婷婷精品视频| 日韩aaa| 在线你懂的亚洲欧| 可以看的AV| 先锋影音男人的天堂AV| 婷婷丁香午夜综合影视| 婷婷九月色| 成人网在线视频| 婷婷五月天视频亚洲| 9热超碰| 丰满人妻一区三区三区| 色情五月综合婷婷| 欧洲亚洲免费视频9| 五月丁香六月激情综合| 婷婷丁香五月视频| 久99久热只有精品国产99| 一起草av| 五月婷六月综合在线观看| 国产激情久久久| 性欧美日本| 99九九在线精品热动漫| 六月色婷婷综合影视| 99热这里只有免费精品| 婷婷丁香五月天激情四射| 婷婷五月丁香色情| 国产做爰视频免费播放| 日本va欧美va精品发布视频| 五月丁香影视| 五月婷五月婷伊人伊人五月婷| 五月丁香色色| 超碰97人人操| 秋霞性爱AV| 久久久婷婷婷| 夜夜撸夜夜骑| 五月丁香综合啪啪啪啪啪| 亚州操人在线视频| 91婷婷丁香五月天免费视频网站| 狠狠色综合网| 伊人网欧美在线男人天堂五月丁香 | 日本久久网| 激情丁香婷婷六月天| a久久| 丁香五月第四色88|