欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

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
返回資訊列表
激情AV| 亚洲激情.com| 五月综合六月婷婷| 日本色色网站| 99热亚洲精品| 免费视频WWW在线观看网站| 五月婷婷综合在线| 九九XX视频| 91久久18| 激情婷婷丁香五月天小说| 久去色色| 天天干 夜夜爽| 婷婷中文字幕网| 开心五月婷婷| 国色天香成人网| 91呦呦呦| 五月总合激情网| 婷婷开心青青草| 99久久视频| 玖玖爱资源站| 五月色网| 激情婷婷综合五月少妇| 超碰人人超碰| 亚州操操| 91九色超碰| 婷婷综合一二三| 青草网在线观看| 99久久精品网| 丁香久久| 免费99色| 亚洲中文无码成人| 色色色地址| 99热在线播放| Caoporn公开| 婷婷五月六| 五月婷婷之综合激情| 亚洲AV人人操| 色综合综合色| 色婷婷电影网| 99热99| 日本色99| 婷婷五月天手机版视频| 91狠狠色丁香婷婷综合久久| 99热很操老逼| 99在线观看视频免费| www狠狠| 丁香色六月婷婷| 天天躁日日躁狠狠躁日日躁2022年5月9日| 激情婷婷在线中文字幕| 97色色在线视频| 97色色网| 五月婷婷无码| 久久在这里99| 99免费在线| 26UUU精品一区二区| 强辱丰满人妻HD中文字幕| 国产永久一黄| 五月婷色| 26uuu国产| 99色在线视频| 亚洲婷婷丁香五月| 狠狠干青青草| 天天日天天色| 另类天堂| 五月丁香综合中文| 色色丁香婷婷五月天| 九九色图| 欧美日韩成人高清在线| 婷婷久久在线| 色色cOm| h在线看免费版在线看| 色很久综合| 五月天婷婷开心| 9999久久久久| 色情开心五月| 婷婷综合在线观看视频| 五月天婷婷色综合| 九九热中文| 五月天俺去也| 亚洲传媒在线观看| 噜噜噜噜在线| 日本欧美成人片AAAA| a九九热www| 99日韩网站| 婷婷丁香六月| 色色婷婷五月天| 天天综合网站| WWW久| 九月色婷婷综合| 免费精品99| 国产精典视频在线观看| 婷婷五月天Av| 亚洲旡码| 97碰碰视频在线观看| 五月丁香A片| 五月丁香六月激情狠狠| 色色色.COM| 国产人妻777人伦精品HD| 丁香激情网| 在线视频激情网站| 激情四射网| 9九色首页| 精品久久婷婷| 五月激情啪啪啪| 91色吧网| 久久伊人婷婷| 99久久精彩视频。| 婷婷丁香六月天| 国产 码在线成人网站| 干一干xxxx| 免费看片在线观看| 夜夜干天天干| 五月天基地| 欧美色色色| 婷婷久久精品| 亚洲天99| 久久久五月天| 色婷婷内射| 亚洲永久免费| 996er在线观看| 久久ab| 五月色综合| 色婷五月天| 99热日| 色噜噜狠噜噜视频| 欧美婷婷丁香五月社区| 香蕉综合网| 婷婷四月 成人 狠狠干| 亚洲国产精品VA在线看黑人| 五月色婷婷激情| 伊人高清无码| 深爱激情五月网| 婷婷九色| 97人人干| www婷婷色情网| 亚洲人操亚洲人| 99热99这里只有精品| 婷婷丁香五月在线观看91| 婷婷五月美女直播| 久久婷婷五月天| 五月天色导航| 色九九九九| AV九九| 激情深爱综合| 九九久久腿| 少妇综合网| 武则天精品久久| 俺去也婷婷| 狠狠干狠狠干狠狠干狠狠干| 亚洲在线视频321| 五月天激情四射网站| 任你爽视频| 9久热精品在线视频| 久久少妇视频| 熟女色专区| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 超碰成人在线观看| 乱乱av| 天天日天天干天天天| 2016日日夜夜操| 深爱激情五月网| 色综合色综合色综合高潮| 美女婷婷激情亚洲| 天天操加勒比| 五月婷婷丁香在线视频| 综合久| www。久久久久一b。Cc| 久久婷.com| 色婷婷伦理| 天天艹| 大香网伊人久久综合| 狠狠干2007| 激情婷婷22月间| 日韩成人av在线| 五月激激网w'w'w| 黄色毛片精品| 青青青在线视频国产| 五月婷婷丁香在线| www.激情五月天.com| 欧美人人草草| 丁香五月av| 五月激情综| 操操操操操操婷婷五月天| www.亚洲激情.com| 五月丁香激情综合网| 色婷婷狠狠| 人妻操逼视频。| 91久久久久| 六月丁香婷| 亚洲丁香五月| 在线观看熟女少妇| 另类 在线| 欧美性生交XXXXX无码小说| 丁香五月成人社区| 色五月激情综合| 欧美日韩成人在线观看| 色九月综合| 欧美激情综合色综合啪啪五月| www.99成人视频| 五月丁香猫咪久久婷婷综合视频激情四射网入口 | 疯狂做受XXXX高潮A片| 免费观看的av| 精品色色色| 99精品激情| www.99免费视频| 狠狠操天天干| 激情五月丁香五月| 9有码中文| 97好吊操| 天天综合干| 外国碰视频网站97| 高清国产AV| 国产精产国品一二三在观看| 亚洲天堂热| 五月综合视频| 人人干人人操人人摸| 亚洲久久视频| 色婷婷丁香五月| 日韩日比视频| 五月丁香六月婷婷综合| 五月天啪啪网| 色婷青青| 久久A极片| wwwss在线观看| 思思久久99| 婷婷五月综合在线视频| 激情五月综合色婷婷| 9久视频| 久久影视婷婷五月| txt五月激情四射网综合俺也来了| 五月天婷婷基地| 色综合久久天天综合网| 91久久九久久九久久九久久九久久| 丁香五月综合在线播放| 婷婷激情五月天色| 欧美成人热| 99久.| av最新在线| yirenjiqingshiping| 99精品成人无码A片观看金桔| 五月婷婷性爱| 婷婷色综合| 色欧美影院| 五月丁香777| 天天热夜夜操| 丁香五月天的网址。| 四五月婷婷| 久久综合激情五月天| 激情久久久久久| www.综合久久.com| 97婷婷狠狠| 九九亚洲无码| 久久总和99| 久久久27操| 六月婷婷最新网址| 九色无码| 伊人婷婷大香蕉| 超碰资源在线| 另类专区在线| 精品五月视频婷婷在线观看| 午夜色色色极品视频| 婷婷激情伍月网| 激情五月综合| 草美女在线观看视频在线播放| 久久视屏这里只有久久| 六月丁香婷婷色综合| 色婷婷丁香五月丁香| 色综合久久伊伊婷婷五月| 五月色无码| 久久九九99字幕| 天天免费成年人视频| 欧美激情Va| 色播五月丁香婷婷| 国产精品视频久久99| 五月婷婷啪啪网| 五月激情综合深爱| www夜夜操| 人人草人人看| 亚洲操人| 午夜少妇在线观看视频| 五月丁香综合精品欧美| 色原狠狠综合| 欧美色色色色色色色| 色婷婷久久久| 99久久99热| www.夜夜夜| 丁香五月天激情综合网| 久久99网| a网站免费观看| 五月丁香婷婷色| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 拍色综合| 啪啪婷婷五月天激情| 久99视频| 丁香久久五月天视频在线观看| 停停五月天激情网| 免费黄色AV| 丁香五月综合| 大香蕉五月婷婷丁香| 日本操B片| 国产成人在线不卡AV| 成人在线视频网| 五月天六月天| 综合色播| 天天插天天射| 色婷婷狠狠禁久久| 婷婷久久久久| 26UUU精品一区二区c〇m| 狠狠色综合精品视频在线| 五月天激情啪啪| www.五月天婷婷| 色狠狠色噜噜AV天堂五区 | 狠狠干综合| 国产真实乱了老女人视频| 99热黄| 国产.亚洲.欧洲视频在线| 天天做天天视天天谢| 亚洲激情色色| 六月婷婷av| 五月天激情网图片| 六月激情网| 99色天堂| 天天日日夜夜爽。| 五月色婷婷综合| 99精品视频免费观看近期发布| 99热大| 国产精品大香蕉| 东北婷婷五月天| 日日噜噜夜夜狠狠久久丁香五月| 婷婷久久综合| 色色色五月婷| 婷婷五月天人妻| 五月综合激情| 超碰在线网站9| 99久在线精品99re5热视频| 激情五月黄色小说| 色色com| 97人人射| 久久性刺激| 激情网 五月天| 久久激情网| 色色婷婷五月天| 成人在线观看一区| 天天干夜夜b| 六月婷婷啪啪| 久久99大| 久色视频首页| 五月婷婷久久综合| 最新AV在线观看| 丁香婷婷激情五月| 97久久人人| 68热超碰在线| 色色影院aaaav| 99色视频| www超碰com| 蜜臀AV在线成人| 久久九九免费视频| 欧美日韩二区在线| 亚洲综合视频天天精品| 26uuu精品一区二区| 青青草大香| 九九热在线观看6| 日韩1区2区| 亚洲第精品| 亚洲精品99| 亚洲欧洲小视频9| 激情婷婷人妻| 能看的av网站| 一区视频网站| 丁香婷婷情色五月天| 久久一级AV| 日韩成人精品中文字幕| 久久婷婷丁香| 五月叮香啪| 五月天停停基地| 99热在线播放| 丁香五月天欧美成人| 天天综合精品| 美女xx不卡| 另类激情五月| 538在线精品| 成人短视频在线| 天天做天天爱天天玩| 4399无码视频二区| 噜噜噜色噜噜| 屁股翘好撅高迎合跪趴| site:picc-up.com| 99热综合| 亚州激情网| 色狠狠综合| 99精品超在线播放| h在线看免费版在线看| 99色人| 亚洲avjiujiur91| 国产无套精品一区二区| 丁香婷婷久久| 欧美va在线| 一区二区乱码视频| 97色在线观看视频| 九月婷婷激情| 美欧日韩国产成人在战| 久久婷五月综合| 久久婷婷综合五月天| 伊人免费视频9| 久久精品小视频| 成功精品影院| 婷婷色五月天第7色| 五月婷婷在线视频| 五月婷婷六月丁香激情深爱| 天天做夜夜爽| 婷婷五月天激情网址| 思思热精品在线视频| 九九综合九九| 精品乱码久久久久| WWW丁香五月| 激情色色| 色情五月天se| 久久久久久久久久久-久五月天婷婷| 天天在线久久综合 | 久久性爰视频这里只有精品| 亚洲精品第一国产综合亚AV| 国产资源91在线| 99只有精品9| 99热这里只有精品一区| 丁香五月婷婷久久久| 天天综合天综合| 丁香深五月婷婷| 少妇人妻综合色6699| 五月停亭久久电影| 婷婷无码五月天| 成人免费高清在线播放| 丁香大香蕉| 日韩综合网络男女香蕉a片| 99久久9| 天天久久66xxx| www99热| 色婷婷色久综| 在线亚洲综合网| 91丨九色丨国产打屁股| 99爱爱| 亚洲色情免费网| 河北真实伦对白精彩脏话| 色婷五月| www.99精品视频| 人妻AV在线观看| www超碰| 激情开心五月天| www激情网| 99ri视频在线观看| 91天天操天天干天天射| 婷婷丁香第一页| 狠狠婷婷色| 99草在线免费观看视频| 五月天激情亚洲| 色碰碰视频| 丁香五月婷婷激情尤物| 五月天社区婷婷丁香社区| 伊人五月成人| 色播五月丁香| 婷婷婷婷色| 特级片神马电影| 丁香五月深爱五月婷婷| 俺去也在线视频| 狠狠干五月丁香| 婷婷五六月丁香| 久久久久久久丁香五月天婷婷 | 六月激情久久婷婷| 丁香婷婷免费| 亚洲VA在线| 激情五月丁香激情综合网| 狠狠色丁香99| 色综合综合网| 野战毛片三一3| 五月天婷婷激情综合| 亚洲第一第二网站| 99爱在线视频| 五月激情视频| 涩涩五月天| 日日夜夜干| 日本猛少妇色XXXXX猛叫| 少妇高潮呻吟A片免费看软件| 五月色综合| 久久精品99国产精品日本| 成人在线二区| 综合九九中文字幕| 色五月网址| 亚州欧美国产久精国产99综合视频| 婷婷伊在线| 天天 日综合| 人妻精品久久久久久| 色色 亚洲| 蜜臀99精品| 天天日,天天干,天天操| 99re欧美精品| 任我鲁这里有精品视频| 77799热| 玖玖资源天天无码| 人人97碰| 99热国品| www、丁香五月天| 99re在线视频精品,这里只有精品18,| 欧美猛片| 五月天开心色情网| 综合aV在线| 日本123区日韩欧美不卡在线看| 色五月色图| 天天综合.com| 五月激情在线| 久久人妻熟女一区二区| 国产激情在线| 99.色| 日韩色五月| 欧美在线视频99| 精品视频网| 丁香五月天堂| 这里只有精品1| 婷婷深爱五月| 婷婷五月天精品| 久久99激情| 天天舔天天摸| 色五月丁香com| 久操福利| 99热这里只有精品最新网址| 91操人| 热996精品在线观看| 新久久五月天激情| 久热超碰91| 亚洲V国产V欧美V久久久久久| 黄色一级影片| 天天谢天天操| 色婷婷成人做爰A片免费看网站| 激情五月天99色| www.狠狠狠狠| 综合网亚洲| www一起操在线观看| 狠狠干在线视频| 91玖玖| 激情婷婷黄色五月| 色5月婷婷| www久久99| 色狠狠999综合| 九九热国产| 八戒青柠影视剧在线观看| 色欲久久久久久综合网综合网| 五月丁香好婷婷A片网| 婷婷综合在线| 人妻人人操| 久久激情五月| 日本啪啪天堂| 亚洲V国产V欧美V久久久久久| 色婷婷九月| 丁香五月天社区| 欧美性猛交99久久久久99按摩| 无遮挡国产高潮视频免费观看| 日韩成人无码| 潮汕成人AV片在线| 色五月婷婷影院| 99在线热| 九九视频这里是精品五月| 色五月激情五月丁香五月婷婷啪啪综合| 成人超碰AV| 丁香欧美| 9热在线观看| 婷婷五月天影院| 婷婷激情视频欧美视频自拍视频欧美剧| 天天精品视频在线观看视频| 另类综合国产| www一区二区三区| 一本伊人色婷| 99热这里只有精品最新地址获取| 日韩在线五月天婷婷| 日日爽天天| 99re在线这里只有精品视频首页| 99色视频免费在线规看| 九九久久网| 噜噜国产| 国产精品电影网| 婷婷五月电影| 九九黄色网| 夜夜干夜夜操| 婷婷99狠狠躁天天躁| 99热成人| 99热网精品| 五月丁香色停停啪啪啪| 6 9式性爱视频在线播放| 丁香五夜激情四射夜夜夜| 91人人爽人人操| 在线99精品| 色吧婷婷| 日日噜人人人做人| 狠狠色婷婷丁香六月| 激情二色月| 思思久久99热只有频精品66| 欧美成人性爱网| 丁香色五月天| 啪啪激情网| 久9热| 色五月欧美| 涩综合网| 激情五月综合| av高清无码| 99热热热天天人人人超超碰| 操操综合网婷婷| 色色综合网。| 欧美毛卡| 九九av| 综合激情开心五月| 色五月丁香五月激情五月激情| 狠狠色激情在线| 欧美va亚洲va在线播放| 丁香婷婷六月| 亚洲综合激情五月久久| 99ER热精品视频| 伊大人久久| 激情婷婷五月天丁香| 婷婷激情九月| 干亚洲天堂| 99r这里只有精品哦| 婷婷丁香五月噜噜噜| 色婷婷精品| 九色91国产| 激情五月天视频| CHINESE熟女老女人HD视频| 美女婷婷激情亚洲| 五月丁香婷婷啪啪综合| 热九九在线| 天天射影视综合网| 99噜噜| 天天爽天天| 色色五月婷婷狠狠| 琪琪色五月天| 思思视频这里是精品| 九九性视频| 五月天色综合| 免费无码毛片一区二区A片| 在线成人av播放| 婷婷激情综合| 日日日影院| 久大香蕉| 51精品国自产在线| 超级碰碰碰碰视频| 99在线观看精彩视频| www.成人婷婷综合| 丁香六月婷婷综合| 女同在线9| 伊人色综合影院视频| 99热在线免费观看精品| 女人被男人吃奶到高潮| 国产乱子轮XXX农村| 黄页免费一级视频懂色| 久久久久妻| 精品草原久久视频| 99热在线看| 91丁香色五月| 99这里的视频都是精品| 婷婷五月天无码| 120分钟婬片免费看| www.九月婷婷丁香.com| 国产日批视频免费播放| 激情噜噜噜| 极品人妻VIDEOSSS人妻| 97极品在线| 热99久久这里只有精品| 九九色精品| 日韩不卡123| 色综合com| 激情五月,色播五月| 狠狠色噜噜狠狠狠888| 久久五月情| 国产阿姨日皮艹逼内射视频| 久久大香蕉同僚| 香蕉AV777XXX色综合一区| 99riAv1国产在线观看| 色综合日日| 久久久婷| 久re热视频| 婷婷狠狠五月综合| 丁香五月婷婷六月| 亚洲成人AV在线| 深爱激情AV| 亚洲精品99| 色吊操色妞| 色狠狠六月| 婷婷综合网| 微拍92| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 五月色丁香| 九九视频在线观看视频6 | 久久精典| 噜噜吧天天爱| 五月天色色色网| 九热在线这里有精品6| 婷婷午夜激情| 亚洲天堂有码| 五月丁香啪啪激情| 91精品综合久久久久久五月丁香| 五月婷免费视频| 成人丁香婷婷五月天| 色区久久| 久久婷婷五月综合97色一本| 日亚二欧美| 1024你懂的欧美曰韩| 激情五月婷婷伊人| 啪啪激情网| 五月天婷婷情色| 亚洲AV色婷婷人禽五月天| 日韩AV免费电影在线播放| 久久er视频6| 日日噜噜夜夜狠狠久久丁香六月| 午夜免费高清AV片| 欧美va在线| 色婷青青| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 日韩AV片| 99九九在线视频| 久久国产高清| 激情五月,色播五月| 天天插天天射| 5月婷婷6月丁香aV| 丁香五月天激情| 精品视频这里只有精品| 五月天色色色| 激情综合网五月在线播放| 丁香激情四射| 丁香九月综合| 久久98热re| 激情五月婷婷啪啪| 停婷丁五月在线| 亚洲久艹| 99精品在线| 另类国产区| 丁香五月开心亚洲| 婷婷综合影院| 另类A片| 亚洲欧洲国产精品| 色九月| 在线99热| 九九色色| 五月丁香综合| www.99热这里只有精品| 激情五月第四色| 五月婷婷丁香六月| 深爱激情小说五月婷婷| 亚洲精品无码一区二区| 久久机热这里只有 | 九九热这里只有国产精品| 亚洲六月色| 人妻VideOssS人妻| 97久久超级| 五月婷视频| 狠狠色狠狠| 综合激情五月丁香| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 五月婷婷激情性爱| 国产在这里只有精品| 99在线观看亚洲| 大战熟女丰满人妻AV| AⅤ色区| 色五月丁香com| 五月天社区狠狠| 99久久精品亚洲综合| 丁香五月欧美午夜视频| 激情六月丁香| 婷婷五月天av| 伊人婷婷色激情丁香| 在线播放成人| 少妇性按摩无码中文A片| 久久精品99| 五月丁香婷婷综合| 婷婷五月天成人网站| 岛国午夜视频| 9+1视频网址| 九九热只有这里是精品| 激情玖玖综合网| 丁香五月欧美| 久久艹99| 欧美性生交XXXXX无码小说| 99精品久久久久久久婷婷久久| 亚洲婷婷丁香| 99惹在线精品免费观看| 天堂久久丁香| 青青草成人网| 性爱动图国产麻豆一区二区三区| 亚洲精品国产A久久久久久| 五月花在线观看视频| www.maotanji.com| 九九在线视频| 色五月婷婷激情| 99久久99九九九99九他书对| 人妻丰满精品一区二区A片| 丁香成人色情五月天| 午夜丁香综合婷婷| 另类图片五月天| 丁香五月综合在线观看| 日本人妻A片成人免费看片| 无码AV免费精品一区二区三区| 99热九九热| 我爱大香蕉| 狼人伊人天堂| 久久女人天堂| 思思精品久久艹| 婷婷中文字幕网| 欧美大肥婆大肥BBBBB| 热思思| 婷婷丁香社区网| 亚洲中文AV| 婷婷亚洲色| 激情五月天免费视频| 九九99九九99偷拍视频免费看| 色婷婷成人做爰A片免费看网站| 日日色综合| AV伊人青草丁香六月| 久久99免费视频网站| 91人妻PORNY九色大屁股| 亚洲五月情| 91精品久久久久久久| 色婷婷成人色网| 伊人www22综合色| 久久人妻系列| 玖玖综合色| 久久久9久| 激情五月影院| 四色AVwww| WWW,色五月| 99热午夜精品| 亚洲九九夜夜| 夜夜躁爽日日| 六月色狠狠色| 婷婷精品视频| 大香蕉在线观看9| 国产肥白大熟妇BBBB视频| 天天做天天爱天天爽| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 成年人看Va免费视频| www.激情五月天。com| 五月天婷婷色色首页| 九九热精品| 久久狠狠干| 天天日夜夜爽。| 思思视频久久| 婷婷综合在线播放| 亚洲精品第一国产综合亚AV | 四川女人毛多水多A片| 亚洲av成人在线| 天天婷婷色六月| 99热无码精品| 日韩成人无码人妻| 成人精品网站在线观看| 国产又爽又猛又粗的视频A片| 伊人久久大香线蕉av一区| 久热A| www.夜夜操.con| 国产成人av在线播放| 1024久婷| 丁香情色五月| 色播五月网| 亚洲AV综合网| 色婷婷精品| 色情免费视频播放| 伍月婷婷免费视频| 久久曰曰| 青996青| 天花AV无码| 六月成人网| 色色99| 婷婷色在线观看| 亚洲乱码w在线观看| 婷婷五月情色| 色波激情五月天| 9伊人网| 久久五月天丁香花| 国产特级毛片AAAAAAA高清| 99碰超| 激情五月天小说网| 婷婷五月伦理网站| 色5月婷婷| 狠狠久久婷五月综合色| 六月五月丁香五月欧美| 超碰人人艹| 九九re精品视频在线观看| 日本全黄一级999| 国产免费av网站| 91午夜婷婷狠狠久久综合9色| 欧美性生交XXXXX无码小说| 色五月婷婷老师| 五月丁香久久| 超碰chaompinm| 另类专区在线观看| 狼人婷婷综合| 人人干99| 婷婷内射视频在线| 噜噜操操| 婷婷久久精品| 成人综合视频在线| 99爱在线视频| 五月婷婷在线免费观看| 狠狠干五月天| 真实亲子乱子伦高清在线观看| 免费观看欧美成人AA片爱我多深| 爱婷婷久久视频| WWW.99热| 淫荡综合网| 五月丁香花激情综合网| 九九精品在线网| 五月天综合图片| 五月天激情啪啪| 欧美成人性爱网| 婷婷五月无码| 亚洲激情综合| 丁香五月手机在线| 色情久久久| 婷婷久久五月| 天天干天天干天天干天天干天| 五月婷婷香| 色婷婷久久综合中文久久一本| 五月天激情婷婷| 六月婷婷色综合| 亚洲精品V天堂中文字幕| 欧美大片| 色天使久久综合| 久热视频97AV在线观看| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | AA丁香综合激情| 亚洲熟妇AV乱码在线观看| 第四色在线观看| 91av视频| 免费超碰在线| 色婷婷综合亚洲| 粉嫩av懂色av蜜臀av熟妇| 五月丁香久久精品在线观看 | 9热在线视频精品| 日韩成人电影在线播放| 综合大香蕉| 免费AV黄在线播放| 男人综合网| 开心激情网五月| 五月丁香激情综合网| 成人在线视频网| 丁香五月天色婷婷| 白人荫道BBWBBB大荫道| 欧美精品狠狠色丁香婷婷| 婷五月天| 97精品欧美91久久久久久久| 色婷婷五月天激情| 天天操天天日天天爽| 婷婷精品综合| 婷婷五月激情图片| 丁香五月欧美| A片试看120分钟做受图片| www.久操| 91人操| AAAA亚洲| 丁香六月无码播放| 丝袜激情网| 人妻AV在线| 九九九干精品| 91精品久久久久久久久久久久| 99综合免费视频| 青青草婷婷综合五月| 亚洲激情综合| 99热8| 婷婷中文综合网| 色婷婷啪啪啪啪啪啪| 色之综合网| 性色99| 99热青青草| 五月婷综合| 五月丁香婷婷伊人日韩| 97色久| 日日天天操| 噜噜在线| 婷婷六月色| 热婷婷在线视频| 久久九色| 五月开行婷婷色五月| 亚洲激情综合网| 欧美69久成人做爰视频| 免费AV在线| 久久在这里有精品| 激情丁香五月天| 在线99热| 日韩无码乱轮| 婷婷五月天激情在线观看| jizzdr| 婷婷五月天社区| 婷婷五月激情五月丁香五月| 丁香五月色色色色| 婷婷五月无码| 97五月天| 啪啪黄页网| 人妻videos人妻高清| 另类精品视频在线观看| 97caop| 第四色激情网| 深情五月天| 天天干天天干天天干天天干天天干| 在线不卡的视频| 日韩色色小视频| 国产精品久久久海的味道| 丁香五月久久| 99热日| 天天肏天天爽夜夜爽| a在线观看| 五月天丁香啪啪啪啪| 九久久婷婷| 狠狠综合网| 九九这里精品| 色噜噜狠狠一区二区三区| 蜜桃婷婷狠狠久久综合| 久久只有精品| 综合婷婷久久| 丁香啪啪中文字幕| 2025中文在线视频字幕免费观看| 26.uuu丁香五月婷婷| 婷婷色色亚洲| 六月五月丁香五月欧美| 色五月激情五月开心五月| 国产精品第一国产精品| 婷婷久久五月天| 婷婷五月丁香六月| 七月丁香五月婷婷在线| 色五月首页| 五月婷婷综合在线| 中文字幕不卡网站| 色情·com| 女婷久久| 美女xx不卡| 99热只有国产在线精品| 色噜噜综合网| 久久总和99| 激情五月天电影| 中文字幕丰满孑伦无码专区| 五月婷婷在线短视频| www.色色五月天.com| www.夜夜爱.com| 色综合五月婷婷狠狠干| 色婷婷狠狠| 国产精品日日躁夜夜躁| 久色婷婷200| 综合色图婷婷| 成人色情五月天婷婷丁香| 丁香六月婷婷| 五月婷啪| 色爱99| 99综合成人视频在线观看 | 日韩在线99| 开心五月网| 亚洲黄网AV| 夜夜骑日日操| 亚洲激情网| 中文字幕av久久爽一区| 99国产精品久久久久久久久久久| 亚洲中文AV网站| 密乳视频| 亚洲精品久久久无码| 五月天激情综合首页| 五月丁香狠狠爱| 亚洲不卡| 色婷婷国产精品综合在线观看| 国产44页| 亚洲另类噜噜| 色九月丁香婷婷蜜桃在线观看| 丁香五月在线视频黑人| 中字幕视频在线永久在线观看免费| 丁香无五月网| 香蕉综合网| 97在线刺激| www.jiujiujiu| 五月激情射| 激情五月婷黄版| 国产亚洲网站在线| 丁香五月婷婷AV在线| 色色色色色五月| 日日肏天天操| 久久这里只有精品视频15| 天天日天天日天天搞| 色欧美色色色| 五月天婷婷青青草| 九热网站| 这里只有精彩视| 五月色亭丁香| 五月丁香狠狠| 91碰免费视频| 国产日韩亚洲欧美在线观看| 婷婷五月综合中文字幕| 婷婷五月天综合小说网| 新男人天堂人妻| 精品久久久人妻| 伊人五月综合网| 日韩成人AV在线播放 | 丁香五月狠狠在线观看| 思思热久久爱| 免费视频1区| 婷婷五月丁香基地| 免费超碰在线| 97色永久免费视频| 亚洲精品亚洲人成人网| 婷婷激情小说| 在线VA视频| 亚洲激情四谢| 六月狠狠综合| 九月av在线| 日本本土色网第一区| 二色av| 色欲日日躁| 色五月综合| 激情5月天天天| 欧美婷婷综合| 九九热精品| 91啪啪视频| 中文字幕日产A片在线看| 久婷婷久草| 婷婷五月激情在线| 丁香五月AV| 色情五月丁香| 免费看欧美成人A片无码| 天天日天天做天天操| 7777久久亚洲中文字幕| 色播五月综合网| 国在线激情网| 夫妇交换刺激做爰| 五月天婷婷中文字幕在线播放| 伊人玖玖综合| 九九视频这里只有精品| 99re这里只有精品视频6| 99久久婷婷国产综合精品电影| 婷婷五月天在线观看第二页| 五月丁香久久丝袜啪啪| 婷婷99| 色婷婷国色天香综合| 大香伊人婷婷影院| 超碰激情网| AV天堂淫乩| 婷婷六月天| 丁香婷婷久久| 777丁香六月青青草婷婷综合久月 五月丁香综合伦理片 | 东北熟女视频99| 9月色婷婷| 亚洲精品五十一区| 亚洲色区17| 综合另类视频| 深爱婷婷色| 色99免费视频中文| www.久久99| 五月花亭亭| 97在线/亚洲| 丁香五月婷婷基地| 美女天天爽| 久久草人妻| 天天射天天操天天干| 丁香五月91| 天天日天天操天天干| av成人在线播放| 色情婷婷| 色偷偷综合| 天天色天天爱天天爱天天爱y| 97视频.干com| 丁香五月婷婷啪| 亚洲一区二区 成人网站戴套| 思思99久久| 另类图片 五月激情| 99热碰碰| 丁香五月社区| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 黄色AV日韩| 久久精彩视频18| 熟女激情五月天| 91丨熟女丨首页| 99伊人婷婷在线| 婷婷五月天激情网| 五月天婷婷色小说| 99热这里| 婷婷中文综合网| 另类图片天天影视在线观看| 婷婷综合六月| 久久五月婷婷电影| 1024欧美看片| 26uuu欧美| 亚洲va国产va天堂va综合va| 天天综合色丁香| 大香蕉免费9| 狠狠婷婷色| 亚洲精品国产setv| 丁香五月婷婷激情123| 亚洲综合视频网| www.lchjjc.com| 五月丁香婷婷色| 五月开心深爱激情网| 久久婷婷六月| 91丨九色丨老农村| 狠狠精品干练久久久无码中文字幕| 天天综合精品| 五月天激情无码高清| 九九这里只有精品在线视频| 色婷婷丁香社综合| 国产亚洲精品久久久久久郑州| 久草视频一,二三四| 六月婷婷九月丁香亚洲综合| 丁香六月婷婷激情综合| 国产亚洲99久久| 久热99狠| 久久99热这里只频精品6学生| 色婷五月天| 爱婷婷五月| 开心激情色婷婷五月天| 久久久久久久久99精品| Www.se.久久| 久久久99精品免费观看| 碰碰91| 色五月 五月婷婷| 99热在线观看这里只有精品| site:pzdcoin.com| 亚洲色图五月丁香| 五月色丁香婷婷综合| 国产看真人毛片爱做A片| 综合激情婷婷| 九九激情综合| 久xxxx| 丁香性爱在线视频| 激情第四色| 色婷| 丁香婷婷五月天在线视频| 天天天日天天天干| 色婷婷五月基地在线| 久久五月综合| 99碰| 久久综合五月| 婷婷六月久久| 五月丁香色综合| 狠狠五月天| 91久久久久久| 色婷婷中文在线| 99热在线只有精品| 婷婷五月天亚洲丁香| 伊人丁香婷婷东京| 婷婷五月天va| 五月婷婷深深的爱| 三级三久久线久久99久目本WW| WWW.99视频| 欧美操我| 激情综合网站| 激情五月婷婷色色| 国产精品24r| 伊人高清无码| 日本不卡高字幕在线2019| 亚洲乱码日产精品BD在线观看| 五月丁香综合| 91chinese在线| 色欲天天综合网| 在线婷婷| 婷婷激情九月| 色色免费网站| 99自拍视频网站| 91avse| 久久婷婷内射| 久超超碰| 色综合久久88色综合天天99| 久久色五月| 99热精品在线观看| 天天爱天天操| 丁香六月婷婷色播| 丁香五月天中文字幕| 俺也去在线视频| 五月婷婷激情综合网| 婷婷五月天久久| 99热首页|