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

ARTICLE DETAIL

資訊詳情

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

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

Java圖書管理系統(tǒng)實(shí)操:JDBC連接MySQL與核心代碼詳解 不搞花架子直接說項(xiàng)目本身。圖書管理系統(tǒng)是Java入門到進(jìn)階階段出現(xiàn)頻率最高的練手項(xiàng)目同時也是很多計(jì)算機(jī)專業(yè)課程設(shè)計(jì)和畢業(yè)設(shè)計(jì)的首選題目。這個項(xiàng)目題目里有兩個關(guān)鍵詞一是完整代碼實(shí)現(xiàn)二是連接MYSQL數(shù)據(jù)庫。前者說明需要的是能直接運(yùn)行、能看邏輯、能復(fù)現(xiàn)的整套代碼而不是零散的功能片段后者說明整個系統(tǒng)的數(shù)據(jù)落點(diǎn)都在MySQL里所有增刪改查都要經(jīng)過真實(shí)的數(shù)據(jù)庫操作。這篇文章就圍繞這兩件事展開把表結(jié)構(gòu)設(shè)計(jì)、JDBC連接、核心業(yè)務(wù)邏輯、常見坑位全部過一遍適合正在做課設(shè)、準(zhǔn)備Java面試或者想搞清楚數(shù)據(jù)庫連接細(xì)節(jié)的同學(xué)參考。1. 項(xiàng)目整體設(shè)計(jì)與需求拆解1.1 這個系統(tǒng)到底在解決什么問題圖書館的日常運(yùn)營非常依賴借還書登記、圖書庫存盤點(diǎn)、讀者借閱記錄查詢這些操作。傳統(tǒng)手寫登記的方式效率低、容易出錯管理員想查一本書在哪、誰借走了、什么時候該還都極其痛苦。圖書管理系統(tǒng)做的事情本質(zhì)上就是為管理員提供一套數(shù)字化工具讓圖書信息和借閱記錄全部落庫通過程序完成信息的增刪改查。從用戶視角來看最基礎(chǔ)的功能需求包括幾個方面管理員登錄系統(tǒng)身份校驗(yàn)要可靠。圖書信息的錄入、修改、刪除和按條件查詢。借書操作要能校驗(yàn)庫存和借閱狀態(tài)。還書操作要能更新庫存和借閱記錄。借閱記錄的查詢方便追蹤每一本書的去向。標(biāo)題里強(qiáng)調(diào)“連接MYSQL數(shù)據(jù)庫”意味著這些數(shù)據(jù)不能優(yōu)雅地躺在內(nèi)存里——程序一關(guān)就全沒了而是要永久的、結(jié)構(gòu)化的存在MySQL里。這樣才能保證重啟程序后圖書數(shù)據(jù)還在借書記錄也在系統(tǒng)才有真正的使用價值。1.2 技術(shù)選型為什么走JDBC直連而不是直接上框架很多人會問現(xiàn)在都用Spring Boot MyBatis為什么還要用純JDBC手寫連接數(shù)據(jù)庫我用這個項(xiàng)目回答你因?yàn)樘^了JDBC直接學(xué)框架你根本不知道數(shù)據(jù)庫連接背后發(fā)生了什么。JDBC是Java連接數(shù)據(jù)庫的標(biāo)準(zhǔn)接口MyBatis底層也是封裝了JDBC。你把JDBC這套流程——加載驅(qū)動、獲取連接、創(chuàng)建語句、執(zhí)行SQL、處理結(jié)果集、釋放資源——走一遍框架一上手就能看懂它到底在幫你做什么。這個項(xiàng)目我建議采用“純Java控制臺 JDBC MySQL”的經(jīng)典組合而不是上來就套JSP、Servlet或者Spring Boot。原因有三控制臺交互讓注意力集中在SQL語句和業(yè)務(wù)邏輯上不需要分心處理頁面跳轉(zhuǎn)、表單提交這些Web層的東西。JDBC連接數(shù)據(jù)庫的過程清晰暴露連接串怎么配、驅(qū)動怎么加載、PreparedStatement怎么用全部看得見摸得著。代碼量適中適合一個人從零實(shí)現(xiàn)還能在面試時把項(xiàng)目講清楚。這套組合做出來的代碼結(jié)構(gòu)后續(xù)想遷移到Spring Boot版本時DAO層和實(shí)體類幾乎可以原封不動搬過去改動成本很低。1.3 數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計(jì)三張表撐起整個系統(tǒng)數(shù)據(jù)庫設(shè)計(jì)是這個項(xiàng)目的根基。我見過不少同學(xué)代碼寫了一半發(fā)現(xiàn)表結(jié)構(gòu)不合理回頭改表又改代碼非常痛苦。設(shè)計(jì)階段多花十分鐘后面能省下半天時間。整個系統(tǒng)用三張表就夠用戶表usersid主鍵自增用戶唯一標(biāo)識。username用戶名登錄時使用。password密碼落庫時存MD5散列值不存明文。role角色標(biāo)識管理員和普通讀者的權(quán)限區(qū)分。real_name真實(shí)姓名用于顯示借閱人信息。圖書表booksid主鍵自增圖書ID。book_name書名。author作者。publisher出版社。price價格用DECIMAL(10,2)類型避免浮點(diǎn)誤差。stock庫存數(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ù)可追溯。圖書庫存的扣減在借書時同步更新還書時同步恢復(fù)這個業(yè)務(wù)邏輯放在后面講。2. 核心代碼實(shí)現(xiàn)與關(guān)鍵細(xì)節(jié)2.1 數(shù)據(jù)庫連接工具類JDBC連接的全過程不管寫什么功能模塊第一步永遠(yuǎn)是拿到數(shù)據(jù)庫連接。把所有連接邏輯抽到一個工具類里是項(xiàng)目初期就該做好的事。來找JDBC連接的經(jīng)典五步加載驅(qū)動類。定義數(shù)據(jù)庫連接地址URL。DriverManager獲取Connection對象。通過Connection創(chuàng)建Statement或者PreparedStatement。釋放資源。工具類代碼我直接給出一個項(xiàng)目里實(shí)測可用的版本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ù)庫連接地址 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ū)動 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(); } } }這里有幾個細(xì)節(jié)值得說透驅(qū)動類名。MySQL 5.x之前用的是com.mysql.jdbc.DriverMySQL 8.x后驅(qū)動類改成了com.mysql.cj.jdbc.Driver。用錯會直接報ClassNotFoundException這是高頻報錯點(diǎn)。連接串參數(shù)。serverTimezoneAsia/Shanghai解決的是時區(qū)問題MySQL 8及以上版本服務(wù)器跟本機(jī)時區(qū)不一致會報錯。characterEncodingutf8解決中文亂碼。useSSLfalse是關(guān)閉SSL校驗(yàn)本地開發(fā)不需要加密通道不關(guān)可能會報SSL連接錯誤。靜態(tài)代碼塊 vs 每次獲取連接時加載驅(qū)動。Class.forName加載驅(qū)動只需要做一次放進(jìn)static代碼塊里是標(biāo)準(zhǔn)寫法不用每次getConnection都重復(fù)加載。驅(qū)動注冊到DriverManager之后就常駐內(nèi)存了。2.2 用戶登錄模塊密碼校驗(yàn)與SQL注入防護(hù)登錄功能幾乎每個系統(tǒng)都有但我要在這單獨(dú)拉出來講是因?yàn)榈卿浤K最容易暴露安全意識問題。我見過不少項(xiàng)目源碼里用字符串拼接方式執(zhí)行SQL比如String sql SELECT * FROM users WHERE username username AND password password ;這種寫法非常危險。用戶在用戶名輸入框輸入admin OR 11SQL語句會變成SELECT * FROM users WHERE username admin OR 11 AND password OR條件讓整條WHERE語句恒為真直接繞過密碼校驗(yàn)登錄成功。這就是最經(jīng)典的SQL注入攻擊幾乎所有數(shù)據(jù)庫安全類面試題都會問它。正確的做法是用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; }注意兩個細(xì)節(jié)。第一PreparedStatement的參數(shù)用?占位setString傳值時由MySQL驅(qū)動做參數(shù)轉(zhuǎn)義用戶輸入的單引號會被當(dāng)作普通字符處理注入語句就失效了。第二密碼存的是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加密出錯, e); } }密碼散列化之后的好處是即使數(shù)據(jù)庫文件泄露別人看到的也是一串固定長度的32位十六進(jìn)制字符拿不到明文密碼。這讓登錄模塊多了一層安全保障。2.3 圖書管理核心業(yè)務(wù)借書流程和事務(wù)邊界圖書管理系統(tǒng)的核心業(yè)務(wù)流是借書和還書。借書不是簡單插入一條記錄就完事它涉及多張表的數(shù)據(jù)聯(lián)動。以借書為例完整流程是校驗(yàn)用戶存在且角色為讀者。校驗(yàn)圖書存在且?guī)齑娲笥???蹨p圖書表的庫存。插入一條借閱記錄。這四個步驟里任何一步失敗整個操作都必須回滾。比如庫存扣減成功了但借閱記錄插入失敗就會出現(xiàn)庫存跟實(shí)際不相符的情況——書沒借出去庫存沒了。這是典型的事務(wù)場景。public synchronized boolean borrowBook(int bookId, int userId) { Connection conn null; PreparedStatement psUpdateStock null; PreparedStatement psInsertRecord null; try { conn DBUtil.getConnection(); // 關(guān)閉自動提交開啟事務(wù) conn.setAutoCommit(false); // 查詢庫存并鎖定記錄 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(庫存不足借閱失敗); } } else { throw new RuntimeException(圖書不存在); } } } // 扣減庫存 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(); } } }這段代碼有幾個非常關(guān)鍵的細(xì)節(jié)。conn.setAutoCommit(false)關(guān)閉自動提交模式后后續(xù)的SQL不會立刻生效要等commit才真正寫入數(shù)據(jù)庫。rollback是回滾讓之前執(zhí)行的SQL全部作廢。關(guān)于行鎖SELECT ... FOR UPDATE它把查詢到的圖書記錄鎖住避免多線程并發(fā)借書時大家都讀到stock1然后同時扣減變成負(fù)數(shù)。我自己實(shí)際測試過去掉FOR UPDATE的情況下用兩個線程同時借同一本書且?guī)齑嬷皇?本兩個請求都可能成功最終庫存變成-1。加了行鎖之后第二個請求會阻塞等待第一個事務(wù)提交提交后重新讀取庫存發(fā)現(xiàn)已經(jīng)是0直接拋異常這才是正確行為。2.4 還書流程別忽略狀態(tài)校驗(yàn)還書邏輯比借書簡單但有一個很容易踩的坑不校驗(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ù)庫存 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不會出現(xiàn)重復(fù)恢復(fù)庫存的情況。3. 完整實(shí)操從建庫建表到跑通項(xiàng)目3.1 環(huán)境準(zhǔn)備MySQL 8 IDEA 驅(qū)動動手之前先把環(huán)境準(zhǔn)備好。我以本機(jī)開發(fā)為例說明每一步需要做什么。第一步安裝MySQL 8。Windows環(huán)境下直接去MySQL官網(wǎng)下載MySQL Installer只安裝Server和Command Line Client。安裝過程中的用戶名密碼記好默認(rèn)root用戶需要設(shè)置一個自己的密碼。安裝完成后在命令行用mysql -u root -p驗(yàn)證能登錄。第二步安裝Navicat或者直接用MySQL自帶的Workbench。Navicat勝在操作直觀建庫建表看數(shù)據(jù)都方便有條件的話可以用它快速核對數(shù)據(jù)是否寫入成功。第三步IDEA創(chuàng)建Java項(xiàng)目引入連接驅(qū)動。兩種方式任選下載mysql-connector-java的jar包放在項(xiàng)目lib目錄下右鍵選擇Add as Library。這個方式不需要額外的構(gòu)建工具。Maven項(xiàng)目在pom.xml里添加依賴dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency我用的是MySQL 8.0系列所以驅(qū)動版本選8.0.33跟服務(wù)器兼容很穩(wěn)。如果你的MySQL是5.7及以下版本驅(qū)動選5.1.x系列更省事。3.2 建庫建表與初始化數(shù)據(jù)打開Navicat新建數(shù)據(jù)庫library_db字符集選utf8mb4。用以下幾個建表語句直接執(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ù)也一并寫入方便程序啟動后有東西可操作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必知必會, Ben Forta, 人民郵電出版社, 59.00, 8, 數(shù)據(jù)庫), (活著, 余華, 作家出版社, 35.00, 10, 文學(xué));有一點(diǎn)需要提前說清楚MD5(123456)這個函數(shù)在MySQL 8中默認(rèn)是可用的生成的密文存進(jìn)去之后Java代碼里用md5方法對用戶輸入的密碼加密再比對兩邊算法一致才能匹配。我自己踩過初始化數(shù)據(jù)里直接寫明文密碼的坑。初期偷懶把password字段存成123456登錄驗(yàn)證時也拿明文去比較數(shù)據(jù)庫里全是裸奔的用戶密碼。后來項(xiàng)目做完統(tǒng)一改用MD5才把這個問題處理干凈。建議從項(xiàng)目第一版開始就養(yǎng)成不落明文密碼的習(xí)慣。3.3 項(xiàng)目結(jié)構(gòu)搭建分包劃分與實(shí)體類設(shè)計(jì)代碼不是堆在一個類里就能叫完整項(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ù)庫打交道。舉個實(shí)際場景界面層需要顯示“借書成功”但它不應(yīng)該直接寫SQL而是調(diào)用service層的方法service內(nèi)部組織多個DAO方法協(xié)同完成借書流程。這樣改動界面不影響數(shù)據(jù)庫代碼替換數(shù)據(jù)庫連接方式也不影響界面。實(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方法 }價格字段用BigDecimal而不是doubledouble在數(shù)據(jù)庫和Java之間來回轉(zhuǎn)換的時候浮點(diǎn)誤差會讓人抓狂。數(shù)據(jù)庫DECIMAL對應(yīng)Java的BigDecimal這是標(biāo)準(zhǔn)對應(yīng)關(guān)系。3.4 圖書列表查詢分頁與排序?qū)嵅賵D書列表的展示不只是一條SELECT那么簡單。系統(tǒng)里的圖書數(shù)量一旦上到幾十本控制臺一屏打不完前端展示的體驗(yàn)就很差。分頁是必須有的能力。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分頁的標(biāo)準(zhǔn)姿勢。offset的算法是(pageNum - 1) * pageSize第一頁偏移0條第二頁偏移pageSize條很容易理解。LIKE關(guān)鍵字搜索時預(yù)編譯的?參數(shù)值直接拼上%即可搜書名、作者、分類都通用。關(guān)于LIKE查詢有個性能細(xì)節(jié)如果數(shù)據(jù)量大LIKE %關(guān)鍵字%這種前置模糊匹配是走不了索引的全表掃描。但圖書管理系統(tǒng)這種量級的數(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ù)按降序排列得到熱門圖書排行。這個SQL在面試?yán)镆步?jīng)常被問到JOIN和GROUP BY的組合使用。4. 常見問題與排查技巧實(shí)錄4.1 數(shù)據(jù)庫連接失敗驅(qū)動、時區(qū)、權(quán)限三類大坑連接數(shù)據(jù)庫是整套系統(tǒng)最容易出問題的地方而問題基本集中在三個方向第一類是ClassNotFoundException報錯內(nèi)容是ClassNotFoundException: com.mysql.jdbc.Driver。這個100%是驅(qū)動類名或者驅(qū)動jar包的問題。MySQL 8.x的驅(qū)動類名是com.mysql.cj.jdbc.Driver你還在用com.mysql.jdbc.Driver就會報這個錯。另外確認(rèn)引用的jar包版本高版本驅(qū)動確認(rèn)類名寫對了沒。第二類是時區(qū)錯誤報錯一般是The server time zone value й?? is unrecognized。原因是MySQL 8服務(wù)器默認(rèn)使用系統(tǒng)時區(qū)而JDBC連接串沒有指定時區(qū)兩端對不上。解決方式是在URL追加serverTimezoneAsia/Shanghai。第三類是Public Key Retrieval報錯MySQL 8的默認(rèn)認(rèn)證方式是caching_sha2_password客戶端連接時需要從服務(wù)端獲取公鑰做加密JDBC默認(rèn)行為不允許這個操作。URL里加useSSLfalseallowPublicKeyRetrievaltrue即可解決。我自己在項(xiàng)目聯(lián)調(diào)階段把這三類錯誤輪著遇了一遍總結(jié)成一條經(jīng)驗(yàn)連接串務(wù)必一次性寫完整不要遇到一個錯改一處太折騰。4.2 中文亂碼三層設(shè)置缺一不可中文亂碼問題出現(xiàn)得相當(dāng)頻繁而且一亂就是一大片。排查要按三層來檢查第一層數(shù)據(jù)庫。建庫和建表時指定CHARSETutf8mb4就是告訴MySQL這個數(shù)據(jù)庫要存unicode字符中文完全沒問題。忘記指定的可以用ALTER TABLE命令補(bǔ)ALTER TABLE books CONVERT TO CHARACTER SET utf8mb4;第二層JDBC連接串。URL必須帶characterEncodingutf8注意這里跟數(shù)據(jù)庫里character_set_database的配置匹配起來。第三層控制臺輸出。Windows下IDEA的控制臺默認(rèn)編碼可能不是UTF-8在IDEA的Settings里把Global Encoding、Project Encoding、Console的編碼都設(shè)為UTF-8。命令行運(yùn)行時在編譯和運(yùn)行命令加上-Dfile.encodingUTF-8參數(shù)。這三個地方只要有一個不對柜臺就會顯示一排煩人的問號。連續(xù)探查這個問題的經(jīng)驗(yàn)教訓(xùn)是先確認(rèn)數(shù)據(jù)庫存進(jìn)去的中文是不是正常的用Navicat直接看表。庫里是亂的就是數(shù)據(jù)庫建表和連接串的問題庫是正常的但程序顯示亂就是控制臺和JVM編碼的問題。4.3 業(yè)務(wù)邏輯Bug排查事務(wù)沒提交、庫存負(fù)數(shù)、并發(fā)沖突數(shù)據(jù)庫連接層打通之后業(yè)務(wù)層的坑就輪到在運(yùn)行時慢慢暴露了。我整理一下最常遇到的幾個不執(zhí)行commit就斷言數(shù)據(jù)寫進(jìn)去了。忘了setAutoCommit(false)之后一定要手動commit或者寫代碼的時候根本沒意識到事務(wù)已經(jīng)開啟數(shù)據(jù)在另一個連接里死活看不到更新。排查方式確認(rèn)是否有事務(wù)開啟查到commit或rollback了嗎。筆記本還剩0本借書還能成功。這是庫存校驗(yàn)缺失導(dǎo)致的。解決方式在前面borrowBook方法里講過校驗(yàn)和扣減必須在同一事務(wù)里用行鎖保護(hù)絕不能在SELECT和UPDATE之間留出空檔。對了損壞數(shù)據(jù)還可能來自重復(fù)借同一本書。如果借閱表里已經(jīng)有一條status1的同圖書同用戶記錄新借書請求不應(yīng)該再成功。在插入新借閱記錄前查詢該用戶該圖書是否存在借出中的記錄即可。4.4 資源泄漏連接不關(guān)系統(tǒng)遲早卡到死這個問題雖然常見但在新手代碼里幾乎是批量出現(xiàn)。寫完Connection不去close獲取了ResultSet不去close程序跑不了幾個來回就報Too many connections。MySQL默認(rèn)連接上限是100多個連接不釋放就會把連接池占滿。我建議把所有資源關(guān)閉統(tǒng)一放到finally代碼塊里或者直接使用JDK 7引入的try-with-resources語法。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接口就會在try塊結(jié)束后自動關(guān)閉代碼少而且不容易遺漏。如果用的是我前面寫的DBUtilclose方法也要在finally里確保調(diào)用。真實(shí)項(xiàng)目中連接不關(guān)閉屬于那種“今天不出事、明天不出事、上線第三天就出事”的問題。你測試的時候數(shù)據(jù)量小加上連接偶爾被GC回收感受不到嚴(yán)重性。等系統(tǒng)真的被多個人同時用起來連接數(shù)飆升服務(wù)直接就癱了。5. 項(xiàng)目擴(kuò)展方向與面試講解建議這個項(xiàng)目做完能跑通只是第一步。真正讓項(xiàng)目有價值的是你能夠擴(kuò)展它并且在面試時把它講成亮點(diǎn)。我給四個擴(kuò)展方向的思路。第一個方向是加上圖形界面??刂婆_版本的邏輯代碼是完整的只是交互方式比較簡陋??梢杂肑ava Swing或JavaFX做界面把MainMenu替換成登錄窗口和主窗口BookDAO、UserDAO這些類不需要大改。這樣就變成了一個更像“系統(tǒng)”的東西。第二個方向是升級Web版本。把項(xiàng)目改造成Spring Boot MyBatis Vue的前后端分離版本數(shù)據(jù)庫表結(jié)構(gòu)幾乎原封不動DAO層代碼翻譯成MyBatis的Mapper接口。這個升級過程你自然就理解了框架到底幫你做了什么。第三個方向是補(bǔ)充還書逾期和罰款邏輯。在BorrowRecord里加一個shouldReturnDate的字段還書時用當(dāng)前日期跟應(yīng)還日期比較超期天數(shù)乘以每日罰款金額算出一個逾期費(fèi)用記錄這樣業(yè)務(wù)面就比普通的課設(shè)項(xiàng)目完整很多。第四個方向是權(quán)限體系的強(qiáng)化。讀者只能看到自己的借閱記錄管理員可以看全部借書也有容量限制這些都用role字段和SQL條件就能實(shí)現(xiàn)。給面試講項(xiàng)目的時候不要停留在“我寫了一個圖書增刪改查的系統(tǒng)”這種層面。重點(diǎn)講三件事數(shù)據(jù)庫表怎么設(shè)計(jì)的表間關(guān)系是什么JDBC連接MySQL踩過哪些坑怎么定位和解決的借書的庫存扣減和借閱記錄的寫入為什么放在一個事務(wù)里。把這些問題想透了比堆砌功能列表管用得多。我個人在帶項(xiàng)目時最常跟新手說的一句話是能跑通只是代碼的及格線知道自己為什么能跑通才算是學(xué)會。這個項(xiàng)目做完你至少應(yīng)該能回答為什么用PreparedStatement而不是Statement為什么借書要用事務(wù)為什么庫存要加行鎖為什么密碼要加密存儲。能在紙上畫出三張表的關(guān)系能說出連接MySQL的URL各個參數(shù)的含義。這些才是這個項(xiàng)目真正的收獲。最后再分享一個我在調(diào)試階段的小習(xí)慣把SQL語句先在Navicat里跑一遍確認(rèn)結(jié)果集返回正確了再回到Java代碼里聯(lián)調(diào)。數(shù)據(jù)庫查詢這層走通了代碼層的排查范圍瞬間縮小問題定位效率非常高。這個習(xí)慣我用在所有的數(shù)據(jù)庫項(xiàng)目里實(shí)測下來很穩(wěn)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
蜜桃久久久久久久| 婷婷尹人大香蕉免费| 日韩中文9| 天天日日夜夜| 秋霞视频一区二区 | 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 五月婷婷丁香中文字幕| 日韩精品资源专区二区| 人人妻人人爱人人玩| 在线亚洲丝袜视频网站| 91人人爽人人爽| 日韩成人大片一区二区| AA特级绝黄| 乱操乱伦AV| 欧美色综合网| 91亚洲网| 少妇熟女1区2区3区| 91成人无码| 午夜精品久久久99热蜜桃的功能特点 | 欧美美女在线高潮999| 久99| 婷婷五月综合激情| aaa一级黄片| 九月丁香综合网| 三级精品三级在线观看| 国产精品无套内谢| 日韩一级特黄av毛片| 日B操| 色噜噜国产精品视频一区二区| 丝袜美腿射精91| 婷婷伊人一区| av操操不卡| 好吊妞转入那个网| 爱啪精品一区| 亚码人妻| 精品无码一区二区人妻久久蜜桃| 亚洲男人天堂2013| 人妻熟女一区二区三区视频| 91狠狠综合久久| 怡红院成人视频| 久久老熟女| 天天综合麻豆视频| 97超碰伊人| 中韩中文字幕在线观看| 亚洲综合20p| 蜜臀久久99精品久久久久久无删减 | 国产天美欧美| 二对二中文字幕。| 夜夜骑操视频| 91中文字幕在线观看| 欧洲站一级二级三级h| 九九久精品| 国产精品久久久久久久久久久久久久| 96精品久久| 91熟女视频| www.91人妻.com| 亚洲成人一区二区精品| 日本午夜福利影院| 国产青青美女玩逼视频| 99精品无码| 麻豆成人AV| 日本国产欧美一区三区二区 | 欧美丝袜激情| 日韩女模中文造逼| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 超碰97在线中文| 亚洲成人妻日韩在线| 成人天天爽| 男人天堂最新手机版在线青青草| 超碰人妻久久| 日韩激情啪啪| 四虎在线免费视频| 黄视频免费| 天堂无码精品国产久| 夜夜操2028| 久久精品人妻一区二区| 91亚洲人| 国产高清免费不卡av| 90后性网国产欧美| 国产一区二区久久| www国产精品| 国产精品欧美日韩久久| 亚殴在线| 9久9久9久9久视频网站| 91av一区二区在线观看| 女优视频第10页| 精品成人女人久久| 国产福利视频精品视频| 欧美三级一级| 天天干18禁| 欧美黄片免费在线观看视频| 欧美色图私拍91| 美女91网| 五月天丁香婷婷综合网站| 国产精品久久久亚洲一区| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 亚洲色性| 乱伦日本色图AⅤ| 国内精品999| 国产丁香精品露脸视频| 2020视频1区2区3区| 青青草久草AV| 亚洲欧美自拍偷拍| 在线观看A啊啊啊| 欧美日韩在线小说| 国语人妻精彩刺激| 久久久久久性爱免费视频| 人人射人人操人人摸| 青青草十区九区爱夜| 欧美色偷偷| 嗯嗯嗯好爽| 久久男人| 中文啪啪视频| 影音先锋每日最新资源在线观看 | 国产超碰97| 成人亚欧免费视频| 啊啊啊啊啊啊啊在线| 国产精品亚洲一级av第二区| 国产超碰在线一区| 人人看人人爰人人操| 久久亚州高清| 亚洲精品乱码线路中文字幕| 亚洲激情色片| 日韩欧美中文| 人妻人久久精品中文字幕| 熟女人妇一区二区三区| 色777999综合| www久久99| 久久久91| 人妻黑丝袜电影| 日韩精品碰碰| 麻豆天美在线| 99re这里只有精品3| 久久人妻| 老司机午夜精品福利视频一区二区| 国产精品永久免费10000| 欧美激情久久久久| 一区二区三区欧美激情| 九九九九精品视频| 暖暖精品二区三区观看| 国产成人91一区二区三区| 嗯嗯嗯啊啊啊在线免费观看| 国产精品永久免费10000| 亚洲欧美日韩国产丝袜自拍中文| 看日韩操逼| 欧美综合色图网| 色av中文字| www亚洲免费| 欧美天天在线| 亚洲一区深夜| 五月天偷拍| 亚洲欧美不卡线| 97视频7| 欧美精品久久久久久久久88| 欧美劲爆第一页| 用力操死我| 国产91啪| 熟女人妻一区二区三区免费看| 高树玛利亚无码流出| 色官网色综合| 亚洲乱码精品一区二区| 午夜福利一区二区三区四区五区色婷婷| 97最新在线播放视频| 久久只有精品| 天天综合色图| 麻豆区久久久久亚| 性爱欧美五月| 欧美色三级片91| 视频在线观看免费一区二区三区| 中文 人妻 制服| 色九九九综合| 欧美日韩情色一区二区| www超碰| 91成人高清在线观看| 精品熟妇视频一区二区| 1二区9| 国产女人高潮视频| 欧美一级黄色18片免费看| 国产性爱强奸乱伦大全| 精品无码久久久久久久杏吧| 97在线/亚洲| AV在线资源| 国产免费大片| 日本91白丝| 无码 有码 国产18p| 精品国产一区二区三区香蕉欧美| 亚洲自拍偷拍视频在线| 91丝袜美女视频| 99少妇| 久草线上视频免费看| 狠色婷婷久久一区二区三区_| 爱av免费| 99久久久er直播网址| 十八禁啪啪视频| 屁股久久久久久久| 天天日夜干| AV中文字幕三四五| 91色欧美| 欧美劲爆第一页| 97在线日韩中文字幕| 午夜精品久久久久久久| 麻豆精品三区视频| 亚洲精品不卡一二三区| 日本免费一区二区不卡| 很狠操| 亚洲日韩XXX| 日本精品性生活久久久| 久久9999 | 一二三四视频中文字幕在线看| 亚洲色人| 国产精品露脸在线观看| 免费av高清无码| 熟妇xxxxx性春色| 亚洲AV秘无码一区..| 男女日B国产| 久久欲| 成人av影院在线观看| 久久美女国产| 国产97色在线| 久久一二三四五六七八九区区区 | 亚洲色性| 国产高清自拍| 国模少妇一区二区三区| 无码又爽又硬又激情免费视频| 99色综合| 国产性爱欧美性爱在线| 九九九九免费| 欧美日韩亚洲一区二区在线观看| 欧美在线播放aaaa| 四虎国产成人精品免费一女五男| 亚洲天堂人人妻| 色综合99999| 91色夜| 亚洲AV成人精品网站在AV| 久久综合国产精品国产| 免费一级欧美片片线观看| 日本91白丝| 白丝少妇一区二区| 国产精品久久久午夜夜伦鲁鲁| 久久精品超碰| 一区二区三区黄色片a| 欧美少妇性爱网站| 天天综合~91入口| 超碰97网站| 国产v片在线免费观看| 亚洲中文字母在线播放| 性色avv| 欧美 亚洲 综合 制服 另类| 一区二区三| 亚洲精品白浆高清久久久久久| 日本色色色视频| 久久综合日韩亚洲欧美| 97在线亚洲| 欧美gv在线观看| 99热在线观看| 热久久99999| a啊啊啊啊啊啊啊啊一区二区| 亚洲成a人v欧美综合天堂下载| 亚洲欧洲综合成人av一区| 992这里有精品| 啊啊啊在线观看免费视频| 人人妻人人色一区二区三区| 亚洲欧洲综合成人av一区| 亚洲色诱惑| 美美91成人国产精品欧美精品久久久久久久| 男人天堂久久精品不卡| 欧美特大AA级黄片| 欧美毛片在线网| 日韩精品影视| 欧美亚洲第一页| 在线黄页看毛片| 欧美专区17页| 色狠狠 - 百度| 狼人综合婷婷激情四射| 亚洲国产熟妇综合色专区| 欧美日韩国产色图在线| 东京热精品97综合网| 久久婷婷电影网| 精品少妇一区二区三区在线视频| 性欧美第一页| 99色视频| 情色图区| 91精品黄在线观看| 国产丁香精品露脸视频| 香蕉人人操tv| 97视频在线视频| 国产成人自拍视频视频| 人妻在线大香蕉| 久久久一区二区三区三州| 91超碰人人| 91网站18禁| 一本道综合色图| 欧美激情 一区| 亚洲欧美日韩精品久| 五月天亚洲网| 动漫爆乳3D奶水一区在线观看| AV99热18这里只有精品| 国产精品久久久久亚洲av| 蜜桃视频一区二区三区| 成人精品一区二区91毛片不卡| 久久久久久久78| 乱伦熟妇一区二区| 夜夜福利| 91黑人无码激情在线| 老司机福利社视频在线观看| 狼人久草| 日日噜噜夜夜狠狠视频无| 91九九九小逼| 精品少妇一区二区三区在线视频| 日韩9区| 懂色综合久久久| 精品国产av一区二区三区四区入口| 亚洲日产专区| 国产精品蜜臀久久久久无码AV| 人妻人人澡人人爽人人| 91一起操| 亚洲欧洲综合av在线| 超碰碰小说97| 欧美三级一级| 人人妻人射| 性高潮久久久久久久久久久| 中文字幕在线观看AV| 肏逼福利网站| 欧美专区17页| 亚洲天堂另类小说男人| 丰满人妻av一区二区三区 | 99热这里只有精品9| 91美女视频在线观看| 蜜臀亚洲中文| 久久精品国产免费观看99| 久久内射| 色阁阁AV综合网| 开心五月激情网| 97精品久久| 国产乱人妻精品入口| 欧美人人AAA| 啊啊啊草死我| 无码九九| 啊啊啊快操我视频| 99啪啪| 精品美女久久久久| 日韩熟女精一区二区三区不卡| 91殴美大片| 婷婷精品| 333kkkk·亚洲com久久| 日本孕妇一区二区视频操逼免费看 | 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 小情侣高清国产在线视频| 91老女人| 日本综合色图| 人妻人久久精品中文字幕| 东北女人被操| 少妇蜜汁| 大香蕉宗合网在线| 国产亚洲日本精品在线| 第四色奇米影视777| 青青青青青手机视频| 色哟哟1区2区| 欧美一二在线| 91红杏| 亚洲天堂区| 日韩一级片在线看| 岛国网址国产| 26UUU欧美激情一区二区| 亚洲天堂男人天堂网| 久久人妻一区二区三区高清| 大香蕉综合久久| 东京热激情视频一二三区| A片 AV一级在线播放观看免费| 黄色免费网| 超碰97中文| 日本久久久久久久久久| 99999国产| 久久久涩| 99re视频在线播放青草| 欧美最婬乱婬爆婬牲视频| 欧美一区二区三区成人性生活| 自拍视频大全亚洲专媒视频/一区二区三区 | 大香蕉视频一二三区| 久久久久夜夜夜夜| 亚洲日韩人妻中文字幕一区| 久久性爱视频99| 人人爱人人乐人人操| 久久大| 69麻豆天美| 亚洲人天堂| 少妇综合| 成在线人在线观看视频| 国产精品69人妻无码久久久| 日韩欧美午夜视频在线| 色五月综合| 五月激情在线| 久久精品免费| 高清不卡 中文 人妻| 精品欧美日韩在线观看| 蜜臀99久久精品久久久久久| 综合久久97| 亚洲在线网站| 日本 色 导航| 激情综合五月| 综合网久久| 国产精品一级二级在线| 亚洲天堂男| 大肥女高潮bbwbbwhd视频| 麻豆久久精品亚洲精品88 | 99啪啪| 色悠久久久av| 中国少妇啪啪视频| 波多野结衣AV无码一区| 国产剧情AV不卡在线观看| 视频分类 国内精品| 91neishe| 中出20p| 校园春色亚洲| 啪啪资源网| 97色碰| 中文字幕av久久爽Av| 五月天加勒比啪| 91美| 日本一本道A级黄色毛片试看60分钟| 亚洲精品无码少妇久久| 蜜臀AV一区二区三区激情综合| 国产免费久久精品99re韩国| 中文字幕乱妇免费视频| 欧美日本中字另类在线| 日本人体九九九九九九| 综合九九| 国产精品久久天天干| 人人天天干干| 久久、1234| 天堂成人网| 无码操逼网| 人妻天天夜夜爽一区二区| 欧美韩国你懂得在线| 婷婷六月色| 欧美一级A片不卡视频。| 精品国产污一区二区三区| 禁十八久久| 91熟女少妇| 大香蕉伊人一区在线观看| 99久久无色码| 国产日韩欧美亚洲精品95| 亚洲激情在线| 天天影视网综合少妇| 伦在线97| 天天综合网1| 日韩免费中文字幕视频| 黑人精品XXX一区一二区| 国产麻豆一级精品视频| 91在线丝袜视频| 亚洲超碰97| 欧亚乱色熟女一区二区| 日韩懂色网| a级免费在线观看| 激情久久久| 国产成人精品一区| av网页一区二区三区| 香蕉一区二区三区在线视频| 成人怡红院| 人妻久久久| 亚洲欧美综合图片| 五月天婷婷色色| 另类老少妇| 无码人妻丰满热妇又大又粗| 欧美综合网1| 人人 操人人 操人人| 亚洲熟女综合| 天天做天天爱夜夜爽毛片试看| 色色色色色色色色色色色色色色综合| 超碰色97| 欧美熟爽综合| 国产综合日韩伦理| 极品粉嫩一区二区| 少妇熟女1区2区3区| 亚洲 欧美 中文 日韩超碰| 亚洲97超碰| 久久久蜜桃一区二区三区| 精品久久97观看在线视频| 免费观看啪视频| 亚洲狠狠入| 人妻少妇一区二区| 亚州熟女乱伦| 使劲用力艹少妇视频一区二区| 激情五月天插| 天欧美在线| 操操啪| 男人的天堂一区| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | ′ !γ}丶。。久久精品欧美一区二区三区| 中文字幕免费在线观看| 色婷婷六月| 国产老太乱伦一区| 媚薬在线视频麻豆| 色婷婷电影网| 日韩强奸av| 超碰中文字幕人妻草一区| 日韩不卡在线一区二区| 欧美情色亚洲| 欧美日韩精品久久| 丁香六月婷婷综合| 欧美人人操人人插| 日韩精品人妻中文字幕不卡乱码| 欧美成人精品A片免费一区99| 亚洲 暴爽 AV人人爽日日碰| 日韩美女,国产传媒,视频一区| 无码 有码 国产18p| 青青草中文字幕| 天天日天天操VV| 大香蕉520| 中字幕人妻一区二区三区| 久久原创中文| 亚洲男人天堂网久久| 性开放中文AV高清无码免费看| 午夜美女诱惑电源网| 蜜桃在线观看一区二区三区 | 久久久久久久一级黄色打同平台| 自拍偷拍草一草| 久久激情视频| 操死我了嗯嗯嗯| 色色色综合网| 亚洲第2页| V A在线| 久9久9久9久9久9久9| 日日夜夜骚| 人妻激情偷乱视三区频一区二区| 人人弄人人摸| 97超碰9| 免费99精品国产自在在线| 精品妇女一区二区三区| 激情综合网五月婷婷| 色就色综合| 啊啊啊啊啊啊在线观看| 男人的天堂三级| 区二区亚洲婷| 久久亚洲人妻| 婷婷五月天久久精品视频一区二区三区 | 国产性久久久| 日韩欧无码一区二区三区免费不卡 | 大JI巴好深好爽又大又粗视频| 亚洲精品黑丝| 日韩精品大香蕉伊人在线| 在线啊啊啊啊| 黄色网址久久精品欧美喷水| www九九热| 免费a在线播放v| 黄片色区软件| 国产免a费看黄片在线| PMv在线观看| 精品人妻一区二区三区四区不卡在| 久久成人东京热人妻| 中文一区在线日| 久久久久久久久久黄色网 | 国产成人自拍视频视频| 少妇高潮流水av免费| 日韩三级伊人| 亚州熟女乱伦| 成人av福利在线观看| 亚洲 无码 偷拍| 国产强奸乱伦无码视频| 久久狠狠色噜噜狠狠狠狠97| 亚洲精品九九九| 欧美翘臀视频网站一区二区三区| 91爱啪| 国产精品一区二区三区四区五区| 日本媚薬中文字幕在线| 亚洲欧美黄| 欧美色女人| 五月天婷婷在线看| 亚洲精品xxx| 亚洲精品影视老司机| 日韩在线观看字幕精品| 国产精品青草综合久久| 五月婷婷丁香六月| 欧美熟妇视频| 伊人久久久日韩一区| 自拍亚洲综合| 香蕉精品二区二区| 国产日韩精品suv| 尤物网址| 国产AV高清AV无码| 爽爽歪在线视频| 综合网~91综合网| 久久九操在线观看| 2017天天插| 内射老妇BBWX0C0CK| 太久视频| 欧美成人9797| 1000午夜黄色| 伊人麻豆传媒| 国产极品精品美女视频| 午夜一区| 亚洲熟妇熟在线电影视频| 后入式视频国产自| 欧美高清色| 18禁精品网站在线看| 国产伦精品一区二区三区在线观| 久久9久9久99久9久9| 天综合网欧美| 久久久新亚洲AV| 亚洲日韩美女中文字幕乱| 这里只有精品视频| 91精品婷婷国产综合久久竹菊| 日韩欧美麻豆 | 亚洲国产欧美中文永久| 国产人伦精品一区二区三区 | 人妻熟女av国产网站| 18一区二区三区| 狠狠操狠狠燥| 国产福利视频精品视频| 九九色热| 国产91专区| 日韩熟女无码| 熟女精品一区二区三区| 国产AV人人夜夜澡人人爽麻豆| 久久少妇| 九九激情网| 欧美久久久| 在线人成亚洲视频免费观看| 日本三级中国三级99人妇网站| 中文字幕精品乱码| 一本色道综合久久欧美| 天天摸,夜夜摸| 日日日日做夜夜夜夜做无码97| 99久久久久久亚洲精品不卡| 性爱动态120秒| 日韩欧美蜜桃精品久久中文字幕久久| 亚洲男人久久综合天堂| 十八禁网站在线| 久热伊人| 国产一级片| 夜夜嗨一区二区三区三州加勒比| 久操网址| 中文字幕第23区| 色在线综合| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 夂久色| 青女偷拍网| 高清在线偷拍自拍视频| 国产麻豆一区二三区| 亚洲精品国产熟女久久久久久| 午夜啊啊啊| 亚洲天堂五月天国产| 欧美成不卡网| 美国日韩黄片| 狠插 制服 自拍| 妇女性内射冈站HDWWWCOM| 91丝袜美女| 最新日本中文字幕| 欧美色图亚州激情| 午夜福利激情在线视频| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 夜夜高潮夜夜爽夜夜爱爱一区| 亚洲欧美国产日本一区二区三区| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 国产精品久久久久久久久久久久久久久久| 中国AV美女| 搞中出视频在线观看| 性在久久久久久| 欧美人妻一区二区| 能看的av| 黄色成人网久久久久久| 久操在97| 97碰在线视频| 少妇被c 黄 免费观看| 大香伊人在线一区| 粉嫩不卡一区二区性爱 | 激情色色| 亚州熟女乱伦| 99精品人人爽| 婷婷五月色| 蜜臀一区二区三区在线| 亚州日韩97| 久9热| 视频一区二区免费在线| 在线一区| caorenqi shipin| 欧美性生活男人的天堂| 国产av色网| 超碰亚洲97| 草草影院最新网址| 中国少妇啪啪视频| 成人A片男人的天堂| 大香蕉一线视频| 少妇久久久久久| 中文字幕一区二区三四五区日日骚| 国产欧美日韩在线不卡第一页| 中文字幕后石码四区五区| SS久久| 欧美十八禁在线看| 午夜福利1区2区3区| 九九九不卡| 天天α片| 狠狠操狠狠| 一区二区三区黄色片a| 黑人在线91| 日日夜夜草草草| 日韩精品国产精品五码一区二区| 国产一区二区三区白丝| 精品人妻一区二区三区四区| 99蜜桃臀亚洲成人在线观看| 九九AV| 免费伦费视频在线观看| 丁香色狠狠色综合久久小说| 亚洲加勒比色图| 四虎884a| 日韩成人色图| 婷婷久久五月| 日操粉逼逼| 国产精品盗摄 偷窥盗摄| 九九九国产| 男女香蕉一区二区| 亚洲欧美精品久| 久久久999网站| 涩五月婷婷| 成人美女av| 国产又黄又爽又刺激久久久久久| 欧美97在线欧| 性感美女91影视| 日日妻色网| 精品96久久| 欧美亚洲影视| 超碰国产情侣自拍网| 天天日少妇逼AV| 这里都是精品在线观看| 成人性爱美曰韩| 中文字幕奈奈美被公侵犯| 午夜性生活av免费在线看| 9久久久久久| 东京热毛片调教| 97视频一区| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 欧美色图20p| 久久久四区| 天美传媒AV在线| 91精品国产一区三一| 91美女精品| 中文字幕一区二区无码成人| 欧中美三级一区二区三区| 蜜桃传媒视频第一区入口在线看| 97视频在线观看网站| 中文欧丝袜诱惑| 亚洲国产中文字幕| 亚洲熟女少妇免费视频| 精久久久| 99rre在线精品99re8| 欧美亚洲系列| 蜜臀久久99精品久久久久久婷婷| 欧美性爱一区二区三区| 久久人妻熟女一区二区| 东京热天堂网| 久久综合九色综合欧洲98| 91精品国产91久久福利| 内射老妇BBWX0C0CK| 国产女人和拘做爰视频| 亚洲成人一区二区精品| 日本3级一区二区免费| 天天天天操| 九色 人妻 大香蕉| 日产中文字幕2020| 97网址97| 国产欧美另类久久久精品课程| 麻豆成人影音在线| 国产无码精品成人| 国产精品久久久久亚洲av| 成人国产精品三级A片| 色九月| 青青草吊丝| 麻豆国产第一| 青青草原伊人网| 91欧洲国产成人久久精品网站| 中文字幕一区二区三区四区在线视频| 亚洲国产av中文字幕久久| 亚洲日韩美女中文字幕乱| 狠狠干狠狠色| 91欧美美女日韩国产婷婷| 九九免费影片| 黄片www视频免费| 亚洲一曲日韩精品| www.婷婷六月天| 亚洲免费97免费| 欧美最婬乱婬爆婬牲视频| 日本不卡二区| 国产小视频91| 欧美成不卡网| 蜜臀99久久精品久久久久久| 性色AV蜜色av色欲av| Blackedraw视频一区二区| 日本有码影片下载 | 福利操逼| 偷拍欧美综合| 天欧美在线| 日韩免费簧片| 九九色色| 五月天欧美色图| 黄色免费一级在线毛片| 色欲久久综合| 97精品久久久久中文字幕| 国产精品国产精品国产| 免费av大片| 久久亚洲人妻| 91情色| 久草视频分类在线| 97视频www| 人人看黄色视频| 狠狠色色| 久久久久深夜无码| 精品视频免费在线一区| 亚洲国产综合久久久性感熟妇| 91老妇女| 天堂中文资源在线bt| 啊啊啊啊二区好大| 午夜性生活av免费在线看| 亚洲精品亚洲人成人网| 自拍亚洲综合| 日韩av不卡在线看| 久久精品天美| 夜夜草我| 精品久久久久瑟瑟| 91久久青青草原精品| 九热视频| 67914在线兔费成人视频| 欧美日韩国产高清在线一二三区| 操逼精品视频| 久久这里只精品免费福利| 欧美黄页在线| 夜色91| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 亚洲 欧美 中文 日韩超碰| 欧美性爱超碰97| 日本福利二区视频| 欧美,日韩,中文,另类| 国产亚洲日本精品在线| 国产自产22区| www.色婷婷色综合| 91蜜桃传媒精品久久久一区二区| 欧美性巨大╳╳╳╳╳高跟鞋| 国精综合一二三区影视| 无码区蜜乳| 操逼999| 日韩精品1区2区中文字幕| 美女干逼2| 囯产操逼片| 久超碰这里只有精品| 欧美婷婷五月天| 欧美亚洲首页| 亚洲 图片 综合91| 亚洲精品一二牛牛| 美女毛片999| 日本免费专区| 精品无人区麻豆乱码1区2区图片| 99色在线观看| 麻豆天美91| 久久欧洲| 亚洲欧美国产其他二区| 亚欧洲日韩国产精品| 中文字幕黑人大片| 欧美色www亚洲国产阿娇要播| 97超碰色屌| 搡老人老9丨女老熟人| 亚洲AV永久无码精品成人调教 | 97九色| 91高跟美女在线播放| 一级久久久久久久久久久| 外国免费性情大片| www.一本大99| 国产尤物AV尤物在线观看不卡| 一级AAA片一区二区三区| 97午夜剧场日韩| 中文字幕,人妻,日韩| 日夜尻逼网| 猛交交| 日本成人A片免费看| 九九精品网| 久久做97| 色色婷婷五月天| 国产精品不卡一区二区三区av | 亚洲高清无码免费观看视频| 欧美激情一区| 日韩精品影视| 国产又粗又又黄又猛| 中文色综合| 亚洲欧美97√| 久久久中文版| 五月天激情小说| 人人看人人爰人人操| 大香蕉淫人| 精品人妻一区春色| 91爱综合| hd成人一区二区在线| 精品无码秘 人妻一区二区| 欧美激情亚洲情色| 伊人久久国产免费观看视频| 丰满人妻一区二区三区大胸懂色 | 欧美性战999| www九九热| 性色生活片久久毛片婬片免费放女人一级毛片 | 国产精品第一区第一页| 女人天堂网| 色超碰综合| 116美女午夜| 日本岛国黄色网址| 免费公开人人操| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 国产AV人人夜夜澡人人爽麻豆| 四虎影视在线| 91久久久久久久久18| 五月婷网站| 欧美大波激情xxxx| 极品另类| 日韩精品一二三| 97操综合| 龙兴卡官方查询| 97超碰色屌| 后入 亚洲 美女 射| 婷婷色网| 激情综合网五月婷婷| 无码免费精品高清| 超碰在线香蕉| xxxx网站亚洲精品| 少妇一区二区三区精选| 欧美Ⅴ性爱| 电家庭影院午夜69久久夜色精品国产69乱 | 翔田千里无码一区| 精品视频在线观看| 啊啊啊爽爽| 99999久久精| 日比av无码| 国产农村妇女毛片精品久久| 老鸭窝在线视频播放| 怡红院亚洲怡春院av| 国产女人9999| 香蕉大久久久| 亚洲素人综合| 人妻蜜桃臀| 欧美日韩亚洲少妇寂寞影院正在播放| 熟妇激情| 日本97久久| 久啪视频| 操熟女91| 亚洲91在线| 东京热一区二区中文字幕| 久久精品国产亚洲5555| 熟妇乱伦一区二区| 午夜男女爽爽大片免费观看| 天天看天天干| 97在线视频观看网站| 国产精品一区二区校花| 性久久| 操逼视频免费日韩无码| 日韩黄色电影网站| 日本色婷婷| 人妻夜夜爽天天爽麻豆三区网站| 熟女在线视频| 久久久久ab| 狠狠爱AV| 欧美美女视频| 中文AV制服乱伦| 无码国产Av| 国产呦精品一区二区三区下载| 激情五月天视频| 素人播放一区| 久久久久9999妇女| 99国产精品自在自在| 91操熟女视频| 久久婷婷电影网| 日韩精品一区二区日韩| 牛黄色久午久| 按摩中文字幕| 96久久久精品| 78操B| 久久精品国产AV一区二区三区| 天天躁日日躁xxxxx| 国产久久久久久久久一区二区 | 岛国免费视频在线| 思思在线免费视频| 日本91白丝| 国产精品不卡一区二区三区| 97中文字幕一区| 视频国产欧美在线播放| 先锋色眉乱伦资源| 九九九九久久久| 欧洲小说色图视频另类| 欧美性夜| 金莲网址| 狠狠躁AV| 亚洲极品| 国产亚洲日韩欧| 欧美日韩999| 麻豆激情综合| 91五十路| 日本操BAV| 亚洲日韩av一区二区三区百合| 天天爽入口| 香蕉黄色一级视频| 五月天婷婷综合网| 91国精产品| 日韩欧美大片免费高清啪啪| 国产精品熟女乱伦| 热久日综合| 久操视频在线观看| 日本三级日本三级99| 性色av一区二区| 综合久久97| 五月婷久久| 少妇第一页| 十八禁视频一区二区| 亚洲日本成人动漫| 死我十八禁| 国产毛片久久久久久久| 国产有码一区| 超碰97丝袜| 色色激情| 亚洲成人在线资源| 黑人狂躁日本妞一区二区三区| 性色乱AV一区二区| 亚洲精品欧洲色| 9999免费精彩视频| 欧美高潮| 国产精品久久久无码AV网站| 在线视频一区二区传媒| 尤物网站91| 日韩亚洲美女一区久久| 久久丝袜| 激情五月激情综合网| 亚洲91射| 欧美强奸一区二区诱惑| 久久久成人精品| 一区二区三区黄色片a| 日日夜夜国产综合| 操b在线观看| 欧美性区| 人妻丰满熟妇一区二区三| 乱码熟妇人妻久久久| 久久性爱视频99| 丝袜性亚洲| 国产精品久久久久久亚洲色欲| 亚洲男人天堂Av| 激情文学88| 国产熟女少妇一区| 麻豆AV96熟妇人妻| 超碰精品日韩欧美国产| 欧洲中文字幕| 9国产超碰| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 97超碰人人模人人拍人人| 久久久久久久久久久六六| 69一区二区三区| 人妻天天操天天爽视频免费| 日韩在线国产字幕| 亚洲国产综合久久久性感熟妇| 国产无码成人无码| 亚洲av热热色| 欧美性爱日韩性爱| 日本一级不卡一二区| 操逼逼无码| 久久精品区| 高凊专区人人操| 亚洲色图尤物视频| AV久日| 三级三久久线久久99久目本WW| 精精品人妻一区二区三区| 精品夜夜澡人妻无码| 日韩高清黄片| 97视频在线观看网站| 丁香五月天啪啪| 亚洲成人激情小说视频| 青青国产在线拍揄自揄拍| 日韩AV无码中文一区二区| 大香蕉中文网| 97爱欧美| 夜夜影视四色| 97超碰9| 色五月第四色| 去干网最新版| 日韩欧美亚洲自拍偷拍| 激情四射五月天| 六月丁香网| 2018天天日天天日| 97jingpin| 九九精品美女高溯喷水 | 亚洲天堂一区二区| 肥臀熟女福利视频一区二区| 看一级特黄a大一片| 久操免费在线| 久久97超碰香蕉| 久久大香蕉手机高清| 无码免费精品高清| 伊人国产成人av网站| 大屁股熟女一区二区三区| 极品丝袜无码| 一区二区三区欧美激情| 26uuu成人影片| 老熟乱一区二区三区四区| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 日本精品一级二级三级| 熟妇激情| 97国伦国色| 91丨九色丨东北熟女| 精品中文字幕第一页| 一级特级aaaa毛片免费观看| 亚洲成av人片色午夜乱码| 啪啪视频免费在线观看| 男人天堂久久精品不卡| 日韩AV色图| 能看的av| 日韩黄色一区二区三区| 摸奶性爱视频网站在线免费播放| 蜜臀久久99精品久久久久电影| 香蕉久久精品| 免费的av网| 免费精品99| 国产AV超爽| 国产一区二区三区视频在线看| 久热一区二区| 99少妇| 久久久久久九九九九九九| 骚逼一区二区| 美女啊啊啊啊pc| 一区二区三区四区色图| 亚洲一区中文字幕一区| 久干9操| 岛国1区2区3区在线观看| 色婷婷一区二区三区久久| 亚洲欧美校园| 熟女熟妇一区二区三区视频| 久久伦理视频久久大香蕉视频| 中文有码第五页| 中文字幕av色| 久久香蕉国产传媒一区剧情天美| 五月丁香婷婷啪啪| 熟女突然公开看18禁影片 | 欧美无圣光在线| 美女露胸露屁股| 美女尤物福利视频| 水野优香在线观看| 99综合| 99碰碰| 99只有精品| 美女刺激久久国产欧美| 九九亚洲| 国产按摩一区二区三区| 鲁鲁色综合网| 四虎 精品 WWW| 最新一二三区视频| 第四色亚洲色图| 久久久久久久久久久久黄色| 欧美天堂日韩三级国产传媒| 日本一二三高清| 欧美日韩大陆黑人少妇99| 丰满少妇高潮无码| 天天看高清麻豆| 激情五月天校园春色网| 另类专区加勒比| 啊啊啊操死我了| 亚洲男人天堂网站| 97日韩| 91东京热男人的天堂| 不卡一区二区日本视频| 久久久久亚洲Aⅴ无码|