色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

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

Java Swing+JDBC教務(wù)系統(tǒng)開(kāi)發(fā):從分層架構(gòu)到Swing界面實(shí)戰(zhàn)

Java Swing+JDBC教務(wù)系統(tǒng)開(kāi)發(fā):從分層架構(gòu)到Swing界面實(shí)戰(zhàn) 1. 項(xiàng)目概述與核心價(jià)值最近在整理過(guò)往的項(xiàng)目經(jīng)驗(yàn)發(fā)現(xiàn)一個(gè)挺有意思的現(xiàn)象很多計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生或者剛?cè)胄械呐笥言谡n程設(shè)計(jì)或者接一些小型外包時(shí)常常會(huì)被“帶界面的教務(wù)管理系統(tǒng)”這類(lèi)題目難住。難點(diǎn)不在于業(yè)務(wù)邏輯本身而在于如何將Java、數(shù)據(jù)庫(kù)和圖形界面這三者順暢地串聯(lián)起來(lái)形成一個(gè)穩(wěn)定、可用的桌面應(yīng)用。我自己帶過(guò)不少實(shí)習(xí)生也看過(guò)很多課程設(shè)計(jì)的代碼發(fā)現(xiàn)大家容易在幾個(gè)地方卡殼數(shù)據(jù)庫(kù)連接池的管理、Swing界面的事件響應(yīng)與數(shù)據(jù)綁定、以及業(yè)務(wù)邏輯與界面展示的分離。這個(gè)項(xiàng)目看似基礎(chǔ)實(shí)則是一個(gè)檢驗(yàn)Java SE綜合能力的絕佳試金石它涵蓋了面向?qū)ο笤O(shè)計(jì)、JDBC操作、多線程Swing EDT、模塊化分層等核心知識(shí)點(diǎn)。一個(gè)完整的、帶數(shù)據(jù)庫(kù)的Java桌面教務(wù)管理系統(tǒng)絕不僅僅是“能跑通”就行。它的核心價(jià)值在于通過(guò)一個(gè)具體的業(yè)務(wù)場(chǎng)景學(xué)生、課程、成績(jī)、教師管理將Java桌面開(kāi)發(fā)中那些瑣碎但至關(guān)重要的技術(shù)點(diǎn)串聯(lián)起來(lái)形成一套可復(fù)用的工程實(shí)踐。比如如何設(shè)計(jì)一個(gè)健壯的數(shù)據(jù)庫(kù)訪問(wèn)層DAO來(lái)應(yīng)對(duì)各種CRUD操作如何在Swing的表格JTable中優(yōu)雅地展示和編輯從數(shù)據(jù)庫(kù)查詢(xún)出來(lái)的分頁(yè)數(shù)據(jù)又該如何處理用戶登錄、權(quán)限校驗(yàn)這類(lèi)通用功能把這些搞明白了以后無(wú)論是做進(jìn)銷(xiāo)存、客戶關(guān)系管理還是其他任何桌面應(yīng)用你都能快速上手。接下來(lái)我就結(jié)合自己多次重構(gòu)這類(lèi)系統(tǒng)的經(jīng)驗(yàn)從頭到尾拆解一遍重點(diǎn)會(huì)放在那些官方文檔不會(huì)細(xì)講但實(shí)際開(kāi)發(fā)中一定會(huì)遇到的“坑”和最佳實(shí)踐上。2. 技術(shù)棧選型與架構(gòu)設(shè)計(jì)思路2.1 為什么是Swing JDBC MySQL看到這個(gè)組合可能有人會(huì)問(wèn)現(xiàn)在不都流行Spring Boot Vue/React做前后端分離嗎為什么還要用“老掉牙”的Swing和純JDBC這里有兩個(gè)核心考量。第一教學(xué)與原型驗(yàn)證目的。對(duì)于學(xué)習(xí)Java SE和數(shù)據(jù)庫(kù)編程而言Swing和JDBC是最直接、最純粹的技術(shù)組合能讓你清晰地看到從界面點(diǎn)擊到SQL執(zhí)行再到結(jié)果渲染的完整鏈路沒(méi)有任何框架的“黑魔法”干擾。理解了這個(gè)底層過(guò)程未來(lái)學(xué)習(xí)MyBatis、Hibernate乃至Spring Data JPA才會(huì)知其所以然。第二輕量級(jí)桌面應(yīng)用的特定場(chǎng)景。對(duì)于一些內(nèi)部工具、離線操作軟件或者對(duì)安裝部署有極簡(jiǎn)要求的場(chǎng)合一個(gè)打包成可執(zhí)行JAR的Swing應(yīng)用用戶雙擊就能運(yùn)行無(wú)需安裝數(shù)據(jù)庫(kù)客戶端可使用嵌入式數(shù)據(jù)庫(kù)如H2或配置Web服務(wù)器有其不可替代的便利性。當(dāng)然純JDBC操作比較繁瑣所以我們通常會(huì)引入一些輕量級(jí)工具來(lái)提升效率。數(shù)據(jù)庫(kù)方面MySQL社區(qū)版免費(fèi)、普及率高是首選。為了簡(jiǎn)化JDBC編碼我會(huì)使用Apache Commons DbUtils這個(gè)小巧的庫(kù)它封裝了結(jié)果集處理能大大減少模板代碼。連接池則選擇HikariCP它是目前性能最好的JDBC連接池之一對(duì)于桌面應(yīng)用來(lái)說(shuō)也足夠輕量。界面構(gòu)建如果不想手寫(xiě)大量布局代碼可以用WindowBuilder這樣的Eclipse/IDEA插件進(jìn)行可視化拖拽設(shè)計(jì)但我會(huì)建議關(guān)鍵界面還是手寫(xiě)代碼以便更好地控制布局管理和事件監(jiān)聽(tīng)。2.2 分層架構(gòu)設(shè)計(jì)告別“意大利面條”式代碼最忌諱的寫(xiě)法就是把所有代碼——從界面按鈕監(jiān)聽(tīng)器到SQL拼接再到業(yè)務(wù)判斷——全部堆在一個(gè)類(lèi)里。這樣的代碼幾乎無(wú)法維護(hù)和測(cè)試。我們必須采用分層架構(gòu)通常分為四層實(shí)體層Entity 對(duì)應(yīng)數(shù)據(jù)庫(kù)表是簡(jiǎn)單的Java Bean。例如Student類(lèi)包含id、name、studentNumber等屬性及其getter/setter。數(shù)據(jù)訪問(wèn)層DAO 職責(zé)單一只負(fù)責(zé)與數(shù)據(jù)庫(kù)交互執(zhí)行增刪改查。每個(gè)實(shí)體類(lèi)對(duì)應(yīng)一個(gè)DAO接口及其實(shí)現(xiàn)類(lèi)如StudentDao和StudentDaoImpl。這里會(huì)集中處理SQL語(yǔ)句和PreparedStatement使用DbUtils簡(jiǎn)化操作。業(yè)務(wù)邏輯層Service 封裝具體的業(yè)務(wù)規(guī)則。例如“學(xué)生選課”這個(gè)業(yè)務(wù)在Service層里可能會(huì)依次調(diào)用CourseDao檢查課程容量、StudentDao檢查學(xué)生狀態(tài)、SelectionDao插入選課記錄并在此過(guò)程中進(jìn)行事務(wù)控制。它是連接界面層和DAO層的橋梁。表示層View 即Swing界面。它的職責(zé)是接收用戶輸入、展示數(shù)據(jù)并將用戶請(qǐng)求委托給Service層處理。界面層應(yīng)盡可能“笨”不包含業(yè)務(wù)邏輯。此外還需要一些輔助層數(shù)據(jù)庫(kù)連接與配置層 使用單例模式或靜態(tài)工廠方法提供DataSourceHikariCP確保整個(gè)應(yīng)用共用同一個(gè)連接池。工具層 包含一些通用方法如日期格式轉(zhuǎn)換、對(duì)話框彈出、表格模型封裝等。注意 很多新手會(huì)忽略事務(wù)處理。在Service層的一個(gè)方法中如果涉及多次數(shù)據(jù)庫(kù)更新如扣庫(kù)存和生成訂單必須使用事務(wù)來(lái)保證原子性。純JDBC環(huán)境下我們需要手動(dòng)獲取連接、關(guān)閉自動(dòng)提交、在try-catch-finally中處理提交或回滾。這是Service層的核心職責(zé)之一。3. 數(shù)據(jù)庫(kù)設(shè)計(jì)與核心表結(jié)構(gòu)解析數(shù)據(jù)庫(kù)設(shè)計(jì)是系統(tǒng)的基石設(shè)計(jì)不好后期編碼會(huì)處處掣肘。教務(wù)系統(tǒng)的核心實(shí)體通常包括用戶管理員、教師、學(xué)生、課程、班級(jí)、成績(jī)、選課記錄等。這里給出一個(gè)高度簡(jiǎn)化的核心表結(jié)構(gòu)并解釋設(shè)計(jì)用意。3.1 核心表結(jié)構(gòu)設(shè)計(jì)-- 用戶表統(tǒng)一存儲(chǔ)管理員、教師、學(xué)生通過(guò)user_type區(qū)分 CREATE TABLE sys_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL COMMENT 登錄名, password VARCHAR(255) NOT NULL COMMENT 加密后的密碼, real_name VARCHAR(50) NOT NULL COMMENT 真實(shí)姓名, user_type TINYINT NOT NULL COMMENT 用戶類(lèi)型0-管理員1-教師2-學(xué)生, student_number VARCHAR(20) NULL COMMENT 學(xué)號(hào)僅學(xué)生有, teacher_number VARCHAR(20) NULL COMMENT 工號(hào)僅教師有, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) COMMENT系統(tǒng)用戶表; -- 課程表 CREATE TABLE course ( id INT PRIMARY KEY AUTO_INCREMENT, course_code VARCHAR(20) UNIQUE NOT NULL COMMENT 課程代碼, course_name VARCHAR(100) NOT NULL COMMENT 課程名稱(chēng), credit DECIMAL(3,1) NOT NULL COMMENT 學(xué)分, total_hours INT NOT NULL COMMENT 總學(xué)時(shí), teacher_id INT NOT NULL COMMENT 授課教師ID, max_students INT DEFAULT 60 COMMENT 最大選課人數(shù), current_students INT DEFAULT 0 COMMENT 當(dāng)前選課人數(shù), FOREIGN KEY (teacher_id) REFERENCES sys_user(id) ) COMMENT課程信息表; -- 選課記錄表學(xué)生與課程的多對(duì)多關(guān)系 CREATE TABLE course_selection ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, course_id INT NOT NULL, selection_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 選課時(shí)間, status TINYINT DEFAULT 1 COMMENT 狀態(tài)1-已選2-已退選, UNIQUE KEY uk_student_course (student_id, course_id), -- 防止重復(fù)選課 FOREIGN KEY (student_id) REFERENCES sys_user(id), FOREIGN KEY (course_id) REFERENCES course(id) ) COMMENT選課記錄表; -- 成績(jī)表 CREATE TABLE score ( id INT PRIMARY KEY AUTO_INCREMENT, selection_id INT NOT NULL UNIQUE COMMENT 關(guān)聯(lián)的選課記錄ID, usual_score DECIMAL(5,2) COMMENT 平時(shí)成績(jī), exam_score DECIMAL(5,2) COMMENT 考試成績(jī), total_score DECIMAL(5,2) GENERATED ALWAYS AS (COALESCE(usual_score,0)*0.3 COALESCE(exam_score,0)*0.7) STORED COMMENT 總評(píng)成績(jī)生成列, teacher_comment TEXT COMMENT 教師評(píng)語(yǔ), FOREIGN KEY (selection_id) REFERENCES course_selection(id) ) COMMENT成績(jī)表;3.2 設(shè)計(jì)要點(diǎn)與避坑指南密碼存儲(chǔ) 絕對(duì)不要明文存儲(chǔ)密碼password字段使用VARCHAR(255)在Java端使用BCrypt或PBKDF2等強(qiáng)哈希算法進(jìn)行加密后存儲(chǔ)。校驗(yàn)時(shí)比較哈希值。用戶表設(shè)計(jì) 采用單表繼承user_type區(qū)分還是多表student,teacher表這里采用單表好處是查詢(xún)簡(jiǎn)單權(quán)限控制統(tǒng)一。缺點(diǎn)是字段會(huì)有冗余學(xué)生的teacher_number為NULL。對(duì)于中小型系統(tǒng)單表更簡(jiǎn)單高效。外鍵與索引 像course_selection表中的student_id和course_id必須建立外鍵約束以保證數(shù)據(jù)完整性。同時(shí)為它們創(chuàng)建復(fù)合唯一索引uk_student_course這是業(yè)務(wù)邏輯一個(gè)學(xué)生不能重復(fù)選同一門(mén)課在數(shù)據(jù)庫(kù)層的保障。生成列的使用score表中的total_score是一個(gè)“生成列”其值由usual_score和exam_score自動(dòng)計(jì)算得出。這保證了數(shù)據(jù)的一致性避免了在應(yīng)用層重復(fù)計(jì)算可能帶來(lái)的錯(cuò)誤。這是MySQL 5.7和MariaDB提供的實(shí)用特性。數(shù)據(jù)字典 像user_type、status這類(lèi)字段建議在項(xiàng)目?jī)?nèi)維護(hù)一個(gè)常量類(lèi)而不是在代碼中硬編碼數(shù)字。例如public interface UserType { int ADMIN 0; int TEACHER 1; int STUDENT 2; }4. 核心模塊實(shí)現(xiàn)與Swing界面開(kāi)發(fā)實(shí)戰(zhàn)4.1 數(shù)據(jù)庫(kù)連接池與通用DAO封裝首先我們解決數(shù)據(jù)庫(kù)訪問(wèn)的基礎(chǔ)問(wèn)題。使用HikariCP配置連接池。// DatabaseConfig.java public class DatabaseConfig { private static volatile DataSource dataSource; private DatabaseConfig() {} public static DataSource getDataSource() { if (dataSource null) { synchronized (DatabaseConfig.class) { if (dataSource null) { HikariConfig config new HikariConfig(); config.setJdbcUrl(jdbc:mysql://localhost:3306/edu_sys?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai); config.setUsername(your_username); config.setPassword(your_password); config.setMaximumPoolSize(10); // 桌面應(yīng)用10個(gè)連接足夠 config.setMinimumIdle(2); config.setConnectionTimeout(30000); // 30秒 config.setIdleTimeout(600000); // 10分鐘 config.setMaxLifetime(1800000); // 30分鐘 // 其他優(yōu)化配置... dataSource new HikariDataSource(config); } } } return dataSource; } }接著封裝一個(gè)基于DbUtils的通用JdbcTemplate簡(jiǎn)化DAO層的編寫(xiě)。// JdbcTemplate.java (簡(jiǎn)化版) public class JdbcTemplate { private final QueryRunner queryRunner new QueryRunner(DatabaseConfig.getDataSource()); // 查詢(xún)單條記錄 public T T queryForObject(String sql, ResultSetHandlerT rsh, Object... params) throws SQLException { return queryRunner.query(sql, rsh, params); } // 查詢(xún)列表 public T ListT queryForList(String sql, ResultSetHandlerListT rsh, Object... params) throws SQLException { return queryRunner.query(sql, rsh, params); } // 執(zhí)行更新增、刪、改 public int update(String sql, Object... params) throws SQLException { return queryRunner.update(sql, params); } // 在事務(wù)中執(zhí)行操作 public T T executeTransaction(TransactionCallbackT action) throws SQLException { Connection conn null; try { conn DatabaseConfig.getDataSource().getConnection(); conn.setAutoCommit(false); T result action.doInTransaction(conn); conn.commit(); return result; } catch (SQLException e) { if (conn ! null) { conn.rollback(); } throw e; } finally { DbUtils.closeQuietly(conn); } } }有了這個(gè)模板DAO層的實(shí)現(xiàn)就非常清晰了。以StudentDaoImpl為例// StudentDaoImpl.java public class StudentDaoImpl implements StudentDao { private JdbcTemplate jdbcTemplate new JdbcTemplate(); private BeanProcessor beanProcessor new BeanProcessor(); Override public Student findById(int id) throws SQLException { String sql SELECT * FROM sys_user WHERE id ? AND user_type ?; // 使用自定義的ResultSetHandler將結(jié)果集映射為Student對(duì)象 return jdbcTemplate.queryForObject(sql, new ResultSetHandlerStudent() { Override public Student handle(ResultSet rs) throws SQLException { if (rs.next()) { return beanProcessor.toBean(rs, Student.class); } return null; } }, id, UserType.STUDENT); } Override public ListStudent findAll(int page, int size) throws SQLException { String sql SELECT * FROM sys_user WHERE user_type ? LIMIT ?, ?; int offset (page - 1) * size; return jdbcTemplate.queryForList(sql, new BeanListHandler(Student.class), UserType.STUDENT, offset, size); } // ... 其他方法 }4.2 Swing界面開(kāi)發(fā)以學(xué)生信息管理為例Swing開(kāi)發(fā)的核心是理解**事件分發(fā)線程EDT和模型-視圖-控制器MVC**模式。所有UI的創(chuàng)建和更新都必須在EDT上執(zhí)行而耗時(shí)的操作如數(shù)據(jù)庫(kù)查詢(xún)必須放在后臺(tái)線程否則界面會(huì)卡死。我們構(gòu)建一個(gè)學(xué)生信息管理界面包含查詢(xún)表格和表單。// StudentManagementPanel.java - 主面板 public class StudentManagementPanel extends JPanel { private JTable studentTable; private StudentTableModel tableModel; // 自定義的TableModel private JTextField searchField; private JButton searchButton, addButton, editButton, deleteButton; private StudentService studentService new StudentServiceImpl(); public StudentManagementPanel() { initUI(); loadStudentData(1, 20); // 加載第一頁(yè)數(shù)據(jù) } private void initUI() { setLayout(new BorderLayout(10, 10)); // 1. 頂部工具欄 JPanel topPanel new JPanel(new FlowLayout(FlowLayout.LEFT)); searchField new JTextField(20); searchButton new JButton(查詢(xún)); addButton new JButton(新增); editButton new JButton(編輯); deleteButton new JButton(刪除); topPanel.add(new JLabel(姓名:)); topPanel.add(searchField); topPanel.add(searchButton); topPanel.add(Box.createHorizontalStrut(20)); // 添加間距 topPanel.add(addButton); topPanel.add(editButton); topPanel.add(deleteButton); // 2. 中央表格 tableModel new StudentTableModel(); studentTable new JTable(tableModel); studentTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); studentTable.getColumnModel().getColumn(0).setPreferredWidth(60); // ID列寬 studentTable.getColumnModel().getColumn(1).setPreferredWidth(100); // 學(xué)號(hào) studentTable.getColumnModel().getColumn(2).setPreferredWidth(80); // 姓名 JScrollPane scrollPane new JScrollPane(studentTable); // 3. 底部分頁(yè)欄略 // JPanel bottomPanel ... add(topPanel, BorderLayout.NORTH); add(scrollPane, BorderLayout.CENTER); // add(bottomPanel, BorderLayout.SOUTH); // 4. 綁定事件監(jiān)聽(tīng)器 setupEventListeners(); } private void setupEventListeners() { searchButton.addActionListener(e - onSearch()); addButton.addActionListener(e - onAddStudent()); editButton.addActionListener(e - onEditStudent()); deleteButton.addActionListener(e - onDeleteStudent()); } private void loadStudentData(int page, int size) { // 使用SwingWorker在后臺(tái)加載數(shù)據(jù)避免阻塞EDT SwingWorkerListStudent, Void worker new SwingWorker() { Override protected ListStudent doInBackground() throws Exception { // 這里是耗時(shí)操作 return studentService.getStudentsByPage(page, size); } Override protected void done() { try { ListStudent students get(); tableModel.setStudents(students); // 更新表格模型 tableModel.fireTableDataChanged(); // 通知表格刷新 } catch (InterruptedException | ExecutionException e) { JOptionPane.showMessageDialog(StudentManagementPanel.this, 加載數(shù)據(jù)失敗: e.getMessage(), 錯(cuò)誤, JOptionPane.ERROR_MESSAGE); } } }; worker.execute(); } private void onSearch() { String keyword searchField.getText().trim(); // 同樣使用SwingWorker執(zhí)行查詢(xún)... } private void onAddStudent() { // 彈出對(duì)話框使用StudentDialog自定義的對(duì)話框 StudentDialog dialog new StudentDialog((Frame) SwingUtilities.getWindowAncestor(this), 新增學(xué)生); dialog.setVisible(true); if (dialog.isConfirmed()) { Student newStudent dialog.getStudent(); // 調(diào)用Service層保存 try { studentService.addStudent(newStudent); loadStudentData(1, 20); // 重新加載數(shù)據(jù) JOptionPane.showMessageDialog(this, 添加成功); } catch (ServiceException ex) { JOptionPane.showMessageDialog(this, 添加失敗: ex.getMessage(), 錯(cuò)誤, JOptionPane.ERROR_MESSAGE); } } } // ... 其他方法 }自定義TableModel是關(guān)鍵它連接了數(shù)據(jù)和JTable視圖。// StudentTableModel.java public class StudentTableModel extends AbstractTableModel { private ListStudent students new ArrayList(); private String[] columnNames {ID, 學(xué)號(hào), 姓名, 性別, 入學(xué)時(shí)間}; Override public int getRowCount() { return students.size(); } Override public int getColumnCount() { return columnNames.length; } Override public String getColumnName(int column) { return columnNames[column]; } Override public Object getValueAt(int rowIndex, int columnIndex) { Student student students.get(rowIndex); switch (columnIndex) { case 0: return student.getId(); case 1: return student.getStudentNumber(); case 2: return student.getRealName(); case 3: return student.getGender() 1 ? 男 : 女; case 4: return new SimpleDateFormat(yyyy-MM-dd).format(student.getEnrollmentDate()); default: return null; } } public void setStudents(ListStudent students) { this.students students; } public Student getStudentAt(int row) { if (row 0 row students.size()) { return students.get(row); } return null; } }4.3 業(yè)務(wù)邏輯層Service與事務(wù)控制Service層是業(yè)務(wù)規(guī)則的家。以“學(xué)生選課”為例它需要處理多個(gè)DAO操作并保證事務(wù)。// CourseSelectionServiceImpl.java public class CourseSelectionServiceImpl implements CourseSelectionService { private CourseSelectionDao selectionDao new CourseSelectionDaoImpl(); private CourseDao courseDao new CourseDaoImpl(); private JdbcTemplate jdbcTemplate new JdbcTemplate(); Override public void selectCourse(int studentId, int courseId) throws ServiceException { // 使用我們封裝的JdbcTemplate執(zhí)行事務(wù) try { jdbcTemplate.executeTransaction(conn - { // 1. 檢查課程是否存在且未滿 Course course courseDao.findById(courseId, conn); // 需要傳遞連接 if (course null) { throw new SQLException(課程不存在); } if (course.getCurrentStudents() course.getMaxStudents()) { throw new SQLException(課程人數(shù)已滿); } // 2. 檢查學(xué)生是否已選該課程 if (selectionDao.exists(studentId, courseId, conn)) { throw new SQLException(不能重復(fù)選課); } // 3. 插入選課記錄 CourseSelection selection new CourseSelection(); selection.setStudentId(studentId); selection.setCourseId(courseId); selectionDao.insert(selection, conn); // 4. 更新課程當(dāng)前人數(shù) courseDao.incrementCurrentStudents(courseId, conn); return null; // 回調(diào)函數(shù)需要返回值這里返回null即可 }); } catch (SQLException e) { // 將SQLException轉(zhuǎn)換為業(yè)務(wù)異常 throw new ServiceException(選課失敗: e.getMessage(), e); } } }實(shí)操心得 Service層的異常處理很重要。底層DAO拋出的SQLException是技術(shù)細(xì)節(jié)不應(yīng)該直接拋給界面層。我們將其捕獲并轉(zhuǎn)換為自定義的ServiceException一個(gè)運(yùn)行時(shí)異常這樣界面層只需要處理一種業(yè)務(wù)異常代碼更清晰。同時(shí)在事務(wù)回調(diào)中所有DAO方法都需要重載一個(gè)接收Connection參數(shù)的版本以保證它們?cè)谕粋€(gè)事務(wù)連接中執(zhí)行。5. 功能模塊詳解與高級(jí)技巧5.1 用戶登錄與權(quán)限控制一個(gè)完整的系統(tǒng)必須有權(quán)限控制。我們?cè)O(shè)計(jì)一個(gè)簡(jiǎn)單的基于角色的訪問(wèn)控制RBAC。登錄驗(yàn)證 在UserService中根據(jù)用戶名查詢(xún)用戶并使用BCrypt校驗(yàn)密碼。登錄成功后將用戶對(duì)象包含user_type存入一個(gè)全局的SessionContext一個(gè)單例或使用ThreadLocal中。界面權(quán)限 在主界面如MainFrame初始化時(shí)根據(jù)SessionContext中的用戶類(lèi)型動(dòng)態(tài)設(shè)置菜單項(xiàng)和按鈕的可用狀態(tài)setEnabled。例如學(xué)生看不到“課程管理”菜單。數(shù)據(jù)權(quán)限 在Service層的方法中加入權(quán)限校驗(yàn)。例如在TeacherService的submitScore方法里首先要判斷當(dāng)前登錄教師是否是這門(mén)課的授課教師。// 簡(jiǎn)單的Session上下文 public class AppContext { private static final ThreadLocalSysUser currentUser new ThreadLocal(); public static void setCurrentUser(SysUser user) { currentUser.set(user); } public static SysUser getCurrentUser() { return currentUser.get(); } public static void clear() { currentUser.remove(); } } // 在登錄成功后 SysUser user userService.login(username, password); AppContext.setCurrentUser(user);5.2 數(shù)據(jù)導(dǎo)出與報(bào)表生成教務(wù)系統(tǒng)經(jīng)常需要導(dǎo)出學(xué)生名單、成績(jī)單等。我們可以使用Apache POI庫(kù)來(lái)生成Excel文件。// ExportService.java 片段 public void exportStudentList(ListStudent students, String filePath) throws IOException { Workbook workbook new XSSFWorkbook(); // 創(chuàng)建.xlsx格式工作簿 Sheet sheet workbook.createSheet(學(xué)生名單); // 創(chuàng)建標(biāo)題行 Row headerRow sheet.createRow(0); String[] headers {學(xué)號(hào), 姓名, 性別, 學(xué)院, 專(zhuān)業(yè)}; for (int i 0; i headers.length; i) { Cell cell headerRow.createCell(i); cell.setCellValue(headers[i]); // 可以設(shè)置單元格樣式... } // 填充數(shù)據(jù)行 int rowNum 1; for (Student student : students) { Row row sheet.createRow(rowNum); row.createCell(0).setCellValue(student.getStudentNumber()); row.createCell(1).setCellValue(student.getRealName()); row.createCell(2).setCellValue(student.getGender() 1 ? 男 : 女); row.createCell(3).setCellValue(student.getCollege()); row.createCell(4).setCellValue(student.getMajor()); } // 自動(dòng)調(diào)整列寬按內(nèi)容 for (int i 0; i headers.length; i) { sheet.autoSizeColumn(i); } // 寫(xiě)入文件 try (FileOutputStream outputStream new FileOutputStream(filePath)) { workbook.write(outputStream); } finally { workbook.close(); } }在界面上添加一個(gè)“導(dǎo)出”按鈕點(diǎn)擊后彈出文件選擇器JFileChooser選擇保存路徑后調(diào)用上述服務(wù)即可。5.3 使用嵌入式數(shù)據(jù)庫(kù)簡(jiǎn)化部署對(duì)于課程設(shè)計(jì)或演示要求用戶安裝MySQL可能太麻煩。我們可以使用嵌入式數(shù)據(jù)庫(kù)H2它可以將數(shù)據(jù)庫(kù)打包在應(yīng)用內(nèi)。在Maven或Gradle中引入H2依賴(lài)。修改DatabaseConfig中的JDBC URL為內(nèi)存模式或文件模式內(nèi)存模式j(luò)dbc:h2:mem:edu_sys;DB_CLOSE_DELAY-1程序關(guān)閉后數(shù)據(jù)消失。文件模式j(luò)dbc:h2:file:~/.edu_sys/db數(shù)據(jù)持久化到用戶目錄。在應(yīng)用啟動(dòng)時(shí)執(zhí)行初始化SQL腳本schema.sql和data.sql來(lái)創(chuàng)建表和插入基礎(chǔ)數(shù)據(jù)。這樣最終用戶只需要有JRE環(huán)境雙擊JAR包就能運(yùn)行完整系統(tǒng)體驗(yàn)非常好。6. 項(xiàng)目打包、部署與常見(jiàn)問(wèn)題排查6.1 使用Maven Shade Plugin打包可執(zhí)行JAR一個(gè)專(zhuān)業(yè)的項(xiàng)目需要打包成包含所有依賴(lài)的“胖JAR”uber JAR。Maven的maven-shade-plugin可以很好地完成這個(gè)任務(wù)。!-- 在pom.xml中配置 -- build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-shade-plugin/artifactId version3.4.1/version executions execution phasepackage/phase goals goalshade/goal /goals configuration transformers !-- 合并多個(gè)依賴(lài)中的META-INF/services文件 -- transformer implementationorg.apache.maven.plugins.shade.resource.ServicesResourceTransformer/ !-- 指定主類(lèi) -- transformer implementationorg.apache.maven.plugins.shade.resource.ManifestResourceTransformer mainClasscom.yourcompany.edusys.MainApp/mainClass /transformer /transformers filters filter !-- 排除簽名文件避免沖突 -- artifact*:*/artifact excludes excludeMETA-INF/*.SF/exclude excludeMETA-INF/*.DSA/exclude excludeMETA-INF/*.RSA/exclude /excludes /filter /filters /configuration /execution /executions /plugin /plugins /build運(yùn)行mvn clean package后會(huì)在target目錄下生成一個(gè)*-shaded.jar文件直接使用java -jar your-app-shaded.jar命令即可運(yùn)行。6.2 常見(jiàn)問(wèn)題與排查技巧實(shí)錄在開(kāi)發(fā)過(guò)程中你幾乎一定會(huì)遇到下面這些問(wèn)題問(wèn)題1界面卡死無(wú)響應(yīng)現(xiàn)象 點(diǎn)擊查詢(xún)按鈕后整個(gè)程序界面卡住鼠標(biāo)變成等待狀態(tài)直到數(shù)據(jù)庫(kù)查詢(xún)完成才恢復(fù)。原因 在Swing的事件分發(fā)線程EDT中執(zhí)行了耗時(shí)的數(shù)據(jù)庫(kù)操作。解決 必須使用SwingWorker、Thread或ExecutorService將耗時(shí)操作放到后臺(tái)線程。如上面loadStudentData方法所示。記住黃金法則在EDT中只做UI更新所有I/O、網(wǎng)絡(luò)、復(fù)雜計(jì)算都丟到后臺(tái)。問(wèn)題2數(shù)據(jù)庫(kù)連接泄露現(xiàn)象 程序運(yùn)行一段時(shí)間后無(wú)法獲取新的數(shù)據(jù)庫(kù)連接最終導(dǎo)致連接池耗盡。原因 沒(méi)有正確關(guān)閉Connection、Statement或ResultSet。解決使用try-with-resources語(yǔ)法Java 7確保資源自動(dòng)關(guān)閉。使用DbUtils的DbUtils.closeQuietly(...)方法它內(nèi)部處理了null檢查和異常捕獲。在DAO層確保每個(gè)方法在最后都釋放了資源。我們的JdbcTemplate和DbUtils的QueryRunner已經(jīng)幫我們做了這件事。問(wèn)題3中文字符亂碼現(xiàn)象 從數(shù)據(jù)庫(kù)讀出的中文或?qū)懭霐?shù)據(jù)庫(kù)的中文顯示為問(wèn)號(hào)“???”。原因 數(shù)據(jù)庫(kù)連接字符集不匹配。解決 確保三處編碼統(tǒng)一為UTF-8數(shù)據(jù)庫(kù)/表創(chuàng)建時(shí)指定CHARACTER SET utf8mb4MySQL。JDBC連接URL中加入?yún)?shù)?useUnicodetruecharacterEncodingUTF-8。Java源文件本身保存為UTF-8格式。問(wèn)題4表格JTable刷新后數(shù)據(jù)錯(cuò)亂或顯示舊數(shù)據(jù)現(xiàn)象 新增或刪除數(shù)據(jù)后調(diào)用fireTableDataChanged()但表格顯示不對(duì)。原因 直接修改了TableModel背后的數(shù)據(jù)列表但沒(méi)有在修改后立即通知表格。解決在TableModel中提供完整的數(shù)據(jù)操作方法如addRow(Student s)、removeRow(int row)。在這些方法內(nèi)部先更新數(shù)據(jù)列表再調(diào)用對(duì)應(yīng)的fire方法fireTableRowsInserted、fireTableRowsDeleted、fireTableDataChanged。永遠(yuǎn)在EDT中更新表格模型和調(diào)用fire方法。問(wèn)題5程序打包后找不到數(shù)據(jù)庫(kù)驅(qū)動(dòng)或配置文件現(xiàn)象 在IDE里運(yùn)行正常打包成JAR后運(yùn)行報(bào)ClassNotFoundException: com.mysql.cj.jdbc.Driver或找不到config.properties。原因 依賴(lài)的JAR包沒(méi)有被打進(jìn)去或配置文件路徑不對(duì)。解決使用上述的Shade Plugin打包確保所有依賴(lài)都在最終的JAR里。對(duì)于配置文件不要使用絕對(duì)路徑或相對(duì)于當(dāng)前工作目錄的路徑。應(yīng)該將配置文件如config.properties放在src/main/resources目錄下然后使用ClassLoader.getResourceAsStream(“config.properties”)來(lái)讀取。這樣無(wú)論JAR在哪里運(yùn)行都能正確找到資源。問(wèn)題6界面在不同分辨率下布局錯(cuò)亂現(xiàn)象 在自己電腦上布局完美在別人高分辨率屏幕上控件擠在一起或位置偏移。原因 使用了絕對(duì)布局setBounds或固定大小的組件。解決優(yōu)先使用Swing的布局管理器如BorderLayout、GridBagLayout、MigLayout第三方更強(qiáng)大。使用JPanel嵌套來(lái)組合復(fù)雜布局。為組件設(shè)置最小、最大、首選尺寸setMinimumSize,setPreferredSize??紤]使用JFrame.pack()方法讓窗口根據(jù)內(nèi)容自動(dòng)調(diào)整大小。把這個(gè)項(xiàng)目從頭到尾實(shí)現(xiàn)一遍你會(huì)對(duì)Java桌面應(yīng)用開(kāi)發(fā)有一個(gè)非常扎實(shí)和全面的理解。它就像一塊敲門(mén)磚掌握了這些核心模式和技巧無(wú)論是轉(zhuǎn)向Java EE開(kāi)發(fā)還是深入學(xué)習(xí)客戶端框架都會(huì)輕松很多。最關(guān)鍵的是在這個(gè)過(guò)程中培養(yǎng)出來(lái)的分層設(shè)計(jì)、異常處理和問(wèn)題排查能力是任何Java開(kāi)發(fā)者都不可或缺的硬實(shí)力。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩一性一交一A片俄罗斯| 淫荡熟女乱伦网| 97色97好| 99热在线播放| 久久久爆乳翘臀一线天伦理视频| 精品人妻一二三四区视频| 综合网 欧美| 激情综合五| 十八禁电影伊人网| 96久久精品一二三区色欲| 欧美性特| 亚洲无码一区成人免费午夜| 国产中文字幕曰本毛片| 欧美青青视频| 国内毛片无遮挡国产| 日本人体九九九九九九| 97啪啪| 亚洲色啪| 无码人妻一区二区三区四区老鸭窝| 亚洲精品xxx| 大香蕉伊人网WWWn0n| 激情五月综合| 午夜啊啊| 久久秀这里有精品| 96精品在线| 人妻啊啊人妻啊| 啊啊啊啊网站| 久久久久精| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 久久九精品| 黄色av网站在线播放| 日韩影片中文字幕一区二区三区| 日韩欧美亚欧在线视频| 亚洲综合113页| 日韩免费av片高清无码| 精品国产99| 午夜小电影在线插入淫高潮 | 五月天丁香| 78m成人视线| 中文字幕日本久久| 91麻豆天美传媒在线| 色婷婷电影| 激情小说亚洲| 五月天伊人| 囯戸精品高潮呻吟旡码| 无码人妻系列少妇| wwe 天天干.com| 制度丝袜99| 亚洲欧洲久久天堂| 一级久久性爱视频| 91亚洲网站| 伊人五月天青青草婷婷| 最新三级网址| 高颜值美女口爆高潮浪叫| 热久久这里只有精品| 日本大香蕉综合网| 精精夜夜| 自拍偷拍 高清无码| 物业黑人 AV一区| 大香蕉丝袜一级片| 黄色成人网久久久久久| 国产AV人人夜夜澡人人爽麻豆| 欧美麻豆成人同性GⅤ在线| 国产黄色动态精品| 91欧美巨乳| 51一区二区三区| 5252色欧美在线男人的天堂| 日本精品成人无码| 欧洲久久一二线| 中文字幕视频2区| 欧美一区二区日韩三区| 麻豆区久久久久亚| 97天天爽| 国产视频不卡在线观看| 一个色导综合| 色婷婷日韩精品一区二区三区| 啊…啊…操我用力操我| 午夜福利1区2区3区| 久久精品人妻一区二区| 中文字幕乱碼在线| 国产在线精品偷| A 天堂| 97超碰免费生活| 久久香蕉国产传媒一区剧情天美| 超碰到97情色| 东京日日夜夜| 久久久九九网站| 中文字幕日韩电影人妻| 无码粉嫩白虎一线天b区| 国产精品熟妇一区二区三| 天天操天天插| 肉嘟嘟www视频在线观看高清| 大香蕉人妻久久| 亚av顶级裸体一区二区三区四区五区| 欧美夜夜狠| 亚洲国产一区二区入口| 国产区日韩区在线观看| juliaann丝袜| 亚洲精品九九九| 五月天亚洲网| 欲香欲色天天天综合和网| 亚洲天堂区| 亚洲成人福利电影免费| 五码视频在线观看| 天天色欧美| 亚洲精品啪视频| 插插综合网天天影视网| 91国产在线精品| 亚洲AV乱码专区国产噜噜亚洲| 搡老人老9丨女老熟人| 欧美18老人禁| 熟女乱3伦999| 亚洲无码视频免费在线观看网址!| 五月天AV资源| 欧美久久婷婷| 久久久久元码视频| 嗯嗯啊好大| 亚洲有码 视频一区| 日韩激情啪啪| 大伊香蕉在线视频免费| 国产日产精品久久快鸭的功能介绍| 国产sv美女内射| 天堂精品一区| 青青草五月份天| 美女黑人91神马| 99九九久久| 欧美在线官网| 乱色视频中文字幕| 欧美性爱五月天| 操逼网站视频漫画国产| 色丁香久久| 女人高潮抽搐喷水视频网站| a在线视频免费观看| 牛牛aV| 亚洲天堂7777| 久久久九九网站| 乱伦系列一区二区| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 日韩激情啪啪啪| 激情黄色片在线观看| 国产400孕妇孕交群| 久久精品店| 亚洲人综合19| 日韩肏逼视频| 亚洲无码超碰免费| 成年无码动漫av片无尽在线| 亚洲性爱成人| 国产99精品一区二区三区免费| 国产高清吃奶免费视频网站| 狠狠操夜夜| 日韩美女操b| 精品亚洲国产成人精品| 亚洲色诱惑| 欧美拳交在线播放| 欧洲Au麻豆| 嗯啊不要啊啊在线观看视频| 夜夜騷av、一區二區| 99精品伊人| 99热18这里只有精品| 中文字幕版| 大香蕉在线免| 国产日产欧产美韩系列麻豆免费| 99久草| 啊啊啊好多水| 精品中文字幕第一页| 91在线视频观看国产| 少妇滛荡视频| 中文久久96| 日日躁天天躁狠狠躁| 97精| 欧美亚洲尤物久久| 双插在线| 亚洲熟女乱色一区二区三区久久久| 久久爽爽精品| 久久精品国产97欧美精品亚洲 | 96一区二区三区| 欧美精品黑人猛交高潮| 久久超碰国产一区二区三区| 亚洲精品天堂久久A∨51成人漫| 亚洲综合中文字幕有码| 久久极品一区二区| 热热热热日日漂亮永久永久国产日| 亚洲一二三四区在线免费看视频| 欧美色性情| 色综合V| 3p国产色噜噜一区| 久久国产精品91| 狠狠夜色午夜久久综合在线| 可乐操在线| 日本成人在线不卡一区二区三区 | 任我爽视频在线观看| www鬼畜国产男人的天堂| 亚州精品丝袜-不卡成人免费| 亚洲超碰综合网| 91青青草| 在线 制服丝袜中出 人妻| 丝袜狠狠草尤物人妻av91| 亚洲欧美日韩夜夜| 亚洲无无码αⅴ每日更新| 手机在线看片免费人成视频| 国产视频三区四区| 天天综合网视频91| 无码精品久久久天天影视| 色狠狠色| 国产97在线播放| 成人影院永久免费观看网址| 婷婷尹人大香蕉免费| www.男人天堂| 国产亚洲深夜激情| 婷婷激情四射| 久热精品在线| 国产免a费看黄片在线| 男人天堂2019亚洲| 欧美色图片色哟哟| 一本一道vs波多野结衣| 91亚洲欧美色图| 久久丝袜| 天天干天天干天天干| 91欧美丝袜| 一级二级在线观看| 欧美在线干| 美国三级日本三级久久99| 国产午夜福利专区综合| 国产精品91一样| 国产蜜臀精品一区二区尤物| 欧美成人一区二区三区在线播放| 91性高| 精品无码久久久久久久久果冻糖心| 破苞ⅩXXX性无码动漫无码| 亚洲人91| 操迟操逼在巾线Fre看| 中日高清无码操逼视频| 91精品91久久久久77777| 久操网址| 91操人| 可以在线观看的黄色网址| 99国内精品| 国产九月婷婷| 偷拍综合网| 色色热| 天美av在线| 日本在线不卡v二区| 欧美78| 综合激情二| 91最新综合| 亚洲 日本 不卡| 超碰91在线| 欧美日韩亚洲少妇寂寞影院正在播放| 欧美性爱另类综合| 丰满人妻-区二区三区| 91视频国品一二三区| 亚洲AV色图| 激情五月天综合网| 亚洲 无码 偷拍| 久久亚州高清| 黄色av网站在线播放| 宅男91视频在线播放| 亚洲美女AV无码| 岛国AV一区二区电影| 一级一性爱免费视频| 97视频在线免费看| 色黄污美女啪啪啪免费网站| 美国三级日本三级久久99| 伊人五月天激情| 欧美青青草视频| 国产超碰| 天天影视亚洲| 蜜臀av中字字幕网站| 狠狠爱夜夜| 殴美,日韩国产伦精品| 97在线观看| 欧美专区在线| 欧美一区二区观看在线| 日本 情色 1区| 国产少妇肉丝在线观看| AV一区观看| 日韩ab网 | 外国免费性情大片| 91av天美性媒精品视频| 日韩在线一区高清在线| 久久綜合很很很| 亚洲精品中文字幕一区在线视频| 熟妇人妻精品一区二区| 久艹伊人精品综合在线| 极品尤物在线观看| 国产呦精品系列在线观看| 久久一二三四不卡| 亚洲色啪| 日本免费中文字幕在线| 少妇熟女视频一二三区| 欧州色图区| 日本精品无码三级网站| 亚洲丝袜少妇在线| 亚洲男人的天堂网| 久久久国产成人一区二区三区在线| 久久香蕉超碰97国产精品| 97无码视频在线播放| 超碰 av 女人天堂| 色婷婷丁香五月| 永久免费av无码网站国产app| 亚洲天天影视色综合| 99热精品在线播放| 尤物黄色在线观看网站| 98久久| 天天舔天天日天天射| www.狠狠| 操操逼操操逼操操逼逼| 秋霞色色影院| 欧美性性性| 中文字幕人妻色偷偷久久皮| 亚洲一区二区三区久久 亚洲一区二区| 人人干黄色| 青青草一区二区高清无码视频| 96免费视频在线| 国产女人成人精品视频| 日韩激情啪啪啪| 国产传媒日韩欧美| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 日韩资源网| 成年人黄色| 蜜区区视频79 | 精品日韩| 亚洲欧洲色情高清| 日韩在线AB| 亚洲成熟国产精品美女| 为用户提供免费看黄网址在线观看| 午夜啊啊| 视频在线97| 久草男人天堂| 少妇天堂网络| 欧美熟妇乱码在线一区| 热九九精品| 国语av最新自产拍在线观看| 91精品久久久| 操www| 日韩无码极品| 一二三区操逼国产91| 中文字幕一区二区三区四五区| 精品无码一二三四区| 久久手机好看网站| 久热色情精品| 久久国产精品一级二级三级| 人妻少妇久久久| 另类天堂| 91高清无码下载| 久久久久久69国产一区二区| 国产乱伦亚洲色图高清无码| 天天草天天日| 国产精品黑人一区二区三区| 富女玩鸭子一级毛片| 啊啊啊好想要| 久久久久久久强迫| 青青操网| 国产一区在线观看无码AV| 国产在线能看的你懂的| 日本乱人伦片中文三区| 国产精品人人爽人人做可爱福利 | 国产综合久久久麻桃个| 97综合国产| 国产精品日日摸夜夜添骚逼| 亚洲熟女综合网| 青青草中文字幕| 国产男人又猛又粗又爽| ..日韩av毛片精品久久久| 九一国产精品| 亚州欧美在线| 搡老女人老熟女91老熟女综合网| 亚洲精品97久久| 九久精品| 中文字幕天堂在线| 日本成人A片网站| 免费观看国产小粉嫩喷水精品午| 亚洲国产婷婷在线播放| 熟女精品va中文字幕| 18禁网站在线播放| 日本一级性爱| 五月丁香色婷婷| www.狠狠干.coom | 五月婷婷丁香| 精品无人区麻豆乱码久久久| 日韩精品怡红院| 国产精品粉嫩福利在线| 日日骚一区二区三区| 亚洲天天操| 色99999| 国产精品久久久久久高清无码免费看| 欧美精品二区视频在线| 国产亚洲精品农村妇女| 成人av动漫在线观看| 五月开心网| 诱惑人妻欧美一区在线播放| 中文字幕午夜精品久久久| 国产免费小视频| 操老熟女AV| 大香蕉之青青草原| 性色A∨91| 国产多人在线观看视频| 青娱乐国产盛宴视频| 99色热| 最新亚洲风情电影| 九九热午夜欧亚国产视频| 玖玖大干人妻| 免费观看网黄| 国产精品青草综合久久| 麻豆久久久久久久久丝袜 | 特级丰满少妇一级AAAA爱毛片| www.久久久久| 亚州人妻| 久久中文字幕在线观看| 国产东北女人在线视频| 成人婷婷丁香| 日韩久草| 人妻二区| 91美女丝袜诱惑视频| 欧美日韩国产男人| 97综合网| 综合激情婷婷| 色老久久| 国产精品高清2021在线| 婷婷中文网| 青久操| 超碰97COm中文| 久久鲁干| 操淫穴亚洲五月丁香| 老熟女网站| 福利色色| 九九九九九用不成了| 中文字幕后石码三区四区| se吧提供国产乱老熟视频胖女人 | 日本色色网| 中文一区在线日| 亚洲性网| 婷婷久久大香蕉| 国产精品丝袜久久亚洲不卡| 91这里只有精品| 丁香五月激情综合国产| 久久爱超碰网| 久久无码一区二区二三区性色| 久碰视频| 中文字幕欧洲有码| 日韩 欧美 视频 在线 一区| 大香蕉99热| 97精品免费| 亚洲乱熟女一区二区三区大香蕉| 欧美熟妇亚洲版| 黄色成人网久久久久久| 天天综合网国产| 人妻娇喘 激情视频| 蜜臀久久99精品久久久久久婷婷| 麻豆美女丝袜人妻中文| 伊人99热| 97国产精品在线观看| 国产人伦a片信息免费片| 五月天伊人| a'v在线资源| 在线黄页看毛片| 天天欧美| 99热这里是精品| 婷婷精品国产一区二区三区日韩| 国产亚洲性生活视频播放| 熟妇人妻一区二区三区| 国产成人在线观看网址| 欧美三级一级| 好爽视频在线观看视频| 性爱视频久久| 99re99| 亚洲激情综合| 亚洲欧美情色| 亚洲精品三| 天美传媒精品久久视频| 综合色啪| 性色综合网| 欧美不卡在线美女| 超碰精品日韩欧美国产| 91久久18禁| 高清无码在线播放网站| 搡老女人老91妇女熟女| 爱媛媛久久国产福利| 九九九不卡| 成人精品在线观看| 3PAV乱伦视频| 久久男人网| 九九人妻| 欧美性爱91| 亚洲成人妻日韩在线| 免费一级a毛片久久久久久鸭绿欲| 欧美大片天天看| AV免费在线播放一区| 超碰欧美97资源| 精品女人999| 成人性爱免费播放| 亚洲无限观看| 日本片日本片祼观看网站在线看中文版网页在线看 | 好看的久久不射无码影视影院| 淫荡熟女乱伦网| 五月天AV资源| 爱爱动态120秒| 成人无码在线超碰网| 秋霞鲁丝午夜无码一区二区三| 91呆哥人妻| 91成人无码| 国产乱人妻精品入口| 18禁超污无遮挡无码免费网| 97欧美精品| 九九亚洲精品| 亚洲图片欧美在线视频| 亚洲欧美日韩制服另类| 亚洲精品黑丝| 黄色乱论网站| 日韩欧美一级特黄大片| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 韩国久久97| 天天懆天天日| 欧美传媒一区| 欧美久久九九| 99精品久久久久久久婷婷| 九九九久久久W精品| 日韩天堂av电影在线观看| 三级三级三级a级全黄三| 91性情| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 亚洲αv一区二区三区| 另类欧美色| 夜夜嗨AV蜜臀av| 91人妻尻屄视频| 欧美色图片| 精品中文一区二区| 欧美在线伊人色| 日本中文字幕在线视频| 激情 欧美 亚洲 小说| 熟女少妇一区二区三区| 免费久久9999| 亚码激情| 操逼操操操91| 在线无码网站| 欧美1727免费观看视频| A一级色女| 99久久99九九99九九九| 天天懆天天日| 91在线欧美| 97色欧洲| 天天操天天日青青草超碰av| 大稥蕉免费视频这里只有精品| 国产农村妇女精品| 日韩BBN| 久草在| 五月丁香婷婷综合| 欧美成人性爱视频免费观看| 精品国产三级av韩国在线| 天堂性色| 97在线播放| 啊啊啊啊啊啊啊网址在线观看| 国产天天骚| 这里只有精品视频在线| 国产成人精品亚洲日本| 无码日韩人妻av一| 日韩激情毛片一级久久久| 少妇综合| 91天天综合| 超碰美国| 日韩有码专区| 九九九九精品精| 91亚洲丝袜| 狠色婷婷久久一区二区三区_| 欧美第38页| 在线人妻熟女一区二区三区四区五区| 96精品在线| 操久久久久久| 久久天天性久久伊人| 亚洲色啪| 久久精品人体| 五月大香蕉| 超碰在线国产| 黑人中出21连凳花野真衣| 91人妻少妇| 久久精品久久久久久久| 久热最新在线杭州| 欧美少妇高潮| 日韩无码人妻中字久久三区四区| 91精品国产长腿丝袜美女| 四虎免费视频| 人妻激情视频| 97亚洲精品超碰| 好爽视频在线观看视频| 国产精品久久| 伊人网免费视频| 又大又长又粗又爽又黄| 国产三级中文有码在线视频| 国产精品麻豆视频网站| 中文字幕狠狠玩| 日韩人妻一区二区精品| 99精品在线观看| 手机av天堂久久久久| 美女的肌被草喷水视频| 亚洲色丰满少妇高潮| 丝袜天堂网| 怡春院久久| 91黑丝在线| 91一区二匹| 国产无码三级视频在线观看| 18禁看网站一区| 嗯嗯啊啊好疼| 亚洲drav色图| 嗯嗯啊啊啊好爽| 人妻色偷色噜| 操逼片中文| 色一情一乱一乱一区91Av| 日本天天人人狠狠在线日美女 | 不卡九肏| 人妻9117c| 亚洲天堂资源| 日韩三级av片| 亚洲成人精品在线一区| 激情综合网五月婷婷五月天| 五月丁香久久| 亚洲视频一二区| 欧美淫乱视频| 欧美性xxxxx狂欢| 亚洲三区视频| 亚洲成人免费电影| 吉田爱美AV在线| 欧美激情久久久久| 亚洲欧美不卡线| 天天操夜夜操狠很操| 亚洲日韩精品在线播放| 国产有码一区| 91蜜桃传媒精品久久久一区二区| 欧美精品二区视频在线| 亚洲最大网站av| 精品v1区| 偷拍导航视频网站| 日韩在线一区高清在线| 五月天激情小说网| 97在线青| 超碰免费人妻在线| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 日韩丨制服丨中文|在线| 久久久久久久唑| 口爆吞精在线观看| 中文字幕在线观看第二页| 人妻色情天天操| 一级人妻性爱视频| 五月天色色色| 黄色十八禁| 久久亚洲中文字幕视频| 国产色精品午夜大片| 夜夜高潮夜夜爽| 91欧美网| 色爱三区| 新视频sss国产| 91中出视频| 无码精品蜜桃一区二区三区ww| 国厂麻豆77q4| 天堂av最新电影网| av在线播放国产一区| 一起草av| 久久久久婷婷精品av电影| AA级电影三区| 97色插| 欧美日韩大黄片| 日韩少妇一区二区三区| 最新精品久久蜜桃| 丁香色狠狠色综合久久小说| 久久婷婷伊人| 超碰到97情色| 久草国产在线视频| 久久精品视频28| 日韩在线观看三级电影| 长长久久免费视频| 九九精品网| 亚州操逼网| 国产乱子伦一区二区三区免看| 国产亚洲深夜激情| 18一区二区三区| 91n欧美| 99色在线视频| 清纯唯美亚洲另类| 亚洲最大无码中文字幕网站| 久久久久久人| 欧美日韩国产色图在线| 国产AV人人夜夜澡人人爽麻豆| 豆花视频操逼网址| 亚洲综合性感在线| 小说区 图片区色 综合区| 国产精品情侣啪啪| 97色网| 东北黄色电影| 中文操逼字幕| 亚熟在线| WWW啪啪的com| 精品无码久久久| 精品视频一区二区| 九九九九九九九九九九九免费国产| 久久9精品| 亚洲一区二区性爱电影| 9 1超碰九色| 国产原创剧情在线丝袜| 日日骚网站| 久久老子无码午夜伦不卡| 骚熟女AV网| 亚洲日韩一区电影| 97精品网| 亚洲色图欧美色图制服丝袜| 99久久久无码国产精品性啊聊| 五月丁香六月婷| 国产精品视屏| 97干色天堂| 精品中文字幕第一页| 走光一区92下载| 又大又长又粗又爽又黄| 久久人妻少妇| 五月婷丁香| 国产高清亚洲日韩一区| 久草色悠悠在线视频| 久久久久久电影| 欧美高潮| 亚洲日韩一区电影| 亚洲天堂在线怕怕视频| 秋霞鲁丝午夜无码一区二区三| 在线观看黄色电话| 亚洲另类色综合网站| 最新欧洲欧美日本激情网站| 97在线免费观看视频| 91中文精品日韩欧美在线 | 中文字幕 码精品视频网站| 日产精品久久久一区二区| 亚洲性爱高潮影院| 翔田千里一区二区三区奶水| 日本久久久精品电影| 丁香五月天激情网站| 日日摸天天爽夜夜欢| 国产精品久久久777| 无码少妇精品一区二区60岁老人| 欧美91在线| 夜夜 中文视频rt| 五月天色五月| 午夜超爽| 91熟女丨老女人| 99热导航| 在线只有精品| 草草影院最新网址| 青青久久艹| 国产一区二区三区,在线观看观看| 欧美日韩第一页| 欧美啪啪色吧在线| 久久久久网站-538在线视频-欧美永久乱码 | 久操网址| 91亚洲网| 中国熟女91| 丰满人妻一区二区三区在线| 人人干人人搞人人摸| 亚洲91色| 干妹子| 欧美天天拍| av日韩在线观看电影| av网站免费看| 天天干人妻视频| 91熟女综合| 亚洲综合888| 操逼片国产| 搡老女人老91妇女老熟女| 日韩伦理久 久久 清纯| 探花一区在线| 亚洲欧洲综合成人av一区| 大鸡巴久久| 91激情综合| 中文字幕制服欧美久久一区| 亚洲暴力强奸AV| 91视频精品| 熟女熟妇一区二区三四区| 欧美大香蕉97| 东京热激情视频一二三区| 五月天黄色激情视频| 免费a级毛片av无码久久精品中文字幕| www男人天堂| 青青操视频在线| wwe 天天干.com| 情色日播放AV| 激情五月天丁香| 大香蕉黄色一区| 干我久操| 国产综合色精品在线观看| 久久久999国产| 搡老女人老91妇女熟女| 96国产污污污丝袜| 欧美一区二区传媒| 丰满少妇一区二区三区专区| 久久五月天婷婷| www.av在线观看| 亚洲无码?第一页| 欧美性爱日韩性爱| 国产不良强奸视频免费看| 青青草国产欧美非洲黑人| 亚洲成成熟女人综合一区二区| 日本道日本道中文字幕日本道最新日本道在线观看 | 日本五十路熟女一区二区| 国产乱色国产精品免费视| 香港澳门日本三级网站| 国产色图乱伦| 91色综合| 台湾一区国产高清在线| 国产一区在线播放| 日韩一二三区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 青青草好吊色| 久久αⅴ| 精品人妻一区二区三区四区不卡在| 天天情欲宗合网| 日韩综合97P| WWW美腿丝袜香蕉中文| 嗯~啊~快点 死我视频免费看网站| 亚洲色资源| 日本淫穴在线| 97热视频在线观看| 福利五区| 四虎免费视频| 激情综合 婷婷五月 红杏| 欧美亚洲天天| 欧美色另类| 亚洲色图欧美一区二区不卡| 高清国产无码av| 被男人吃奶很爽的毛片| 大学生口爆吞精| 亚洲精品xxx| 国产一国产一级毛片古装| 五月天激情小说| 免费精品福利在线观看| 色九月| 一区二区三区 日韩欧美| 97香蕉碰碰人妻国产欧美| 人妻少妇久久久| 人妻在线臀日韩| 黑人中出21连凳花野真衣| 久久久久久久78| 伊人少妇久久久| 9精品久久久久| 试看60秒 爽| 一级日本牲交大片好爽在线看| 国产综合在线视频网站| 伊人影院综合是一个与深夜成人在线| 国产 v乱码一区二| 九九九九久久久| 大香交伊人网| 九九九九九九成人| 天天综合网亚洲综合网| 久久精品店| 无码精品久久| 性色av婷婷久久一区二区点复制| 欧美激情综合| 国产传媒美日韩av| 久久久久久中文| 欧美999| 国产精品婬乱一级毛片彝族| 婷婷九月| 欧美熟女妇同| 97超碰免费人人性爱| 国产九九九九九九| 九七超碰| 老司机深夜影院18未满| Julia在线播放亚洲久久| 欧美中文狠| 日韩精品三级| 黄色大片视频在线免费看| 精品人妻av在线播放| 婷婷月色| 欧美高清性猛交| 国产自偷| 无码久久亚洲高清,| 中文字幕一二区二三区人妻专区| 久久五月视频| 日韩精品第3页| 97国产精品一区| 黄色在线网站| 日本天天人人狠狠在线日美女| 日日骚 av| 欧美 亚洲精品首页| 无码久久亚洲高清,| www…国产操逼| 亚洲天堂第一页| 亚洲欧美碰碰| 国产不卡免费在线视频| 大香蕉伊人一区在线观看| com 首页 18岁 禁区 女优 免费 精选 同城| 少妇综合网| 日本免费中文字幕在线| 啊啊啊啊啊啊啊国| 亚洲女优有码无码高清| 国产91精品福利在线| 久久这里精品国产99丫e6| 色九九九综合| 精品熟女呻吟久久91| 国内自拍 日韩激情 99| 激情终合网| 亚洲婷婷丁香在线| 综合欧美日本三级| 欧美亚洲AN| 美女天天干| 精品久久一区二区三区四区五区| 中文自拍欧美影视| 黄色不卡视频| 99久久亚洲精品无码毛片潘甜甜| 色婷婷六月| 国产九九九九九九| 国产小黄片在线免费观看| 丁香五月激情五月| 青青草影视蜜久久| 欧美久久人人网| 9精品在线| 国产精品一二三区18| 粉嫩国产精品久久粉嫩| 美女爽到高潮91| 黄色大香焦1级‘′‘| 天堂精品小草| 国产精品第一区第一页| 伊人97色天使| 亚洲色图91| 一区二区三区在线资源| 综合色欧美| 九九色精品| 久久綜合很很很| 国产精品福利资源在线尤物| 91蜜臀熟女| 啊啊啊好想要| 99国内精品| 中国少妇啪啪视频| 五月丁香啪啪啪| 好涩综合| 亚洲高潮少妇| 97 色综合| 蜜桃传媒一区二区亚洲| 亚洲色婷婷久久91| 久久男人网| 日韩综合无码色欲vv| 亚洲宗合网| 国产日本久久免费精品| 亚洲色天堂九9| 人妻丝袜无 码视频专区| 五月婷亚洲精品天堂| 黄页18禁| 中国一级操逼视频| 天天综合网~91入口| 国产久久av| 亚洲天堂日本| 福利在线黄片| 91性网| 午夜婷婷| 日韩大香蕉| 久九九九九九九热| 国产精品点击进入在线影院| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 欧美色综合网| 精品射1999| 中日韩久久久| 天天综合~91| 久热久一区二区三区| 在线日韩日本亚洲国产| 青青草乱入乱欲视频在线观看| 美国日韩黄色片| 亚洲男人在线观看天堂| 色婷婷成人综合| 久久一区二区三区入口| 九九九九九九九九九国产精品| 婷婷色香| av最新免费中文字幕| 婷婷成人久久久精品| 骚货 中文字幕 av| 大奶啊啊好爽| 秋霞免费无码视频日韩A片| 日韩 女同 综合| 97九色人妻| 亚洲 欧美 偷拍 唯美| 97久久久网站| 操亚州| 日韩在线观看中文字幕视频| 天天影视色香欲综合网小说| 亚洲色图a| 六月丁香久久| 亚洲欧洲日韩天堂av| 久久婷婷一区| 大香蕉啪啪啪啪在线| 婷婷丁香六月| 自怕偷自怕亚洲精品| 91欧美色| 校园春色欧美| 91狠婷| 福利在线观看一区二区| 天堂av最新电影网| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 久久人妻视频网| 懂色天天爱天天日天天射天天澡| 日韩99999| 日韩不卡一二三四| 欧美狠狠弄| 国产 码在线成人网站| 黄在线| 麻豆天美传媒毛片| 中文字幕伊人| 熟妇一区二区三区| 蜜臀av一区二区三区免费观看| 日本中文熟女视频| 精精品人妻一区二区三区| 91熟女.com| 大香蕉色网| 午夜天天碰综合视频| 久热99| 操逼视频免费日韩无码| www亚洲免费| 中国AAAAAA黄色片| 日韩精品 欧美激情| 蜜桃臀一区二区三区久久| 亚洲情色在线| 麻豆精品久久久久久久| 激情五月天网| 97人妻碰碰中文无码久热丝袜| 日韩精品人妻一| 搞中出久久| 国产不良强奸视频免费看| 亚州色综合| 亚洲无码日韩电影| 九九九九九九精品| 丝袜色综合| 国产人妻精品一区二区三区秋霞| 97碰碰日本乱偷人妻中文的| 一区二区久久天天干狠狠| 又大又白奶子| 麻豆久久久一区二区| 综合一区中亚洲国产成人综合精品| 欧美人妻久久精品二区三区| 国产女人和拘做爰视频| 欧美日韩大香蕉| 伊人热综合| 囯产精品久久久久久久久久梁医生| 992大香蕉| 日日骚一区二区三区| 色噜噜日韩精品| 国产不卡的视频 | 少妇熟女一区二区三区| 天天操天天干美女网址导航| 日本国产二线女色| 亚洲国产青青| 久草线上视频免费看| 日韩色图 一区二区| 九九热视频这里只有精品| 91成人国产综合久久精品蜜月| 极品少妇99| 好淫网一二三视区| 中文字幕在线观看AV| 91色黑人少妇| 啊操爽品善一区二区三区| 欧美高潮在线| 新视频sss国产| 久久久熟女一区| 热久久无毒不卡| 伊人国产AV| 亚州性色| 国产精品白丝| 久久久久亚洲三级电影| 精品中文字幕第一页| 久久久久人妻二区精品叶可怜| 色婷婷视频| 欧美精品日韩一区二区| 午夜男人一级A片7777| 欧美拳交在线播放| 黄色成品网站| 性欧美另类高清| 第四色亚洲色图| 免费亚洲国产精品久久一区| 亚洲另类色综合网站| 天天综合91入口| 九九九九热| 人妻丰满熟妇一区二区三| 人妻81p| 91chinese在线| 欧美久久婷| 中文字幕综合人妻| 99草精| 日韩成人高清一区二区| 欧美一二三级精品在线| 狼狼色丁香久久婷婷综合五月| 在线观看av区| 91大胆欧美| 91天天综合网,天天综合网| 99re6国产精品99re| 天天干18禁| 亚洲**2021在线观看| 黄片无码在线制服| 久草成人福利导航| 中文97国产| 日本一二三免费久久| 国产精品成久久久久午夜午夜| 操逼操逼视频操逼| 激情五月天婷婷| 久9久9精品| 99999久久精| 日本韩国国产精品一区| 日韩成人精品视频自拍| 五月激情小说| 久久超碰、| 蜜桃午夜视频一区二区 | 欧美色图综合| 日韩人妻免费精品| 久久久久久大| 97在线亚洲| 国产精品懂色tv影视免费观看| 国产色呦呦| 成人网欧美风情| 久久久熟女一区| 国产无吗在线播放| 色色操| 欧美大片天天看| 91黄站| 亚洲精品一区二区三区在线播放| 99久久久无码| 欧美成人国产精品| 色综合一本| 久碰视频| 啊啊啊久久久视频| 国产女人视频三四五区| 综合欧美日本三级| 天天影视射综合网| 啪啪啪男女亚洲中文字幕99| 国内精品a| 九九视品黄色| 91高清欧美| 黄色激情电影在线观看| 99丝袜福利在线播放| 国产自偷| 乱伦图一区| 少妇毛片久久| 60秒不遮不挡| 免费啪啪啪网站18岁| 亚洲 日本 一 二 三| 91九色丰满高潮| 草草影院最新网址| 爱干爱射网啊啊啊| 青女偷拍网| hd成人一区二区在线| 夜草欧美| www.色吧5.com| 中亚精品极乱| 999国产精品999久久久久久| 九九色综合| 欧美日韩国产三级黄色| 嗯嗯啊啊操死我| 97免费在线观看| 国产亚洲在线| 国桃视频产巨乳精品一区二区在线| 2018天天日天天日| 久久天天摸| 91丝袜视频在线观看| 啊啊啊啊啊在线观看网址 | 干干干天天| 91中文精品日韩欧美在线| 狠狠婷婷亚洲中文综合久久| 九九aV| 91天天爽| 国产粉嫩出水在线播放| Aa东京男人的天堂| 亚洲国产精品99久久久|