久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码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
返回資訊列表
欧美性爱一区二区三区| 九九内射在线| 色图综合网| 激情综合网一盗摄| 97se综合网| 激情接吻视频久久久久久| 亚洲天堂精品日韩电影| 色色青青久久| 久久精品99久久久久久| jiujiujiujingpin| 国产精品第二页| 狠狠色丁香| 国产精品激情久久久久久久| 欧美不卡五十路| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 少妇xx精品| 思思热在线视频免费| 久久久久96| 久久亚洲天天做| 五月天社区| 日本中文字幕在线电影| 97人人超| 簧片免费看视频| 日韩无码黄色片| 婷婷伊人五月| 成人精品久久久午夜福利| 97超碰中文在线| 视频黄站| 久九9精品| 在线观看午夜婷婷久久久久清性观看| 诱惑人妻欧美一区在线播放| 韩日男人的天堂| 人妻熟女字幕一区二区| 91校园春色长篇| 99久热| 无码伊人久久大杳蕉中文无码| 色官网色综合| 久久鲁干| 99只有精品| 91久热| 在线观看av区| 99久久99久久综合| 女人爽到高潮久久久| 夜夜操2028| 国产不卡精品91| 中文字幕乱码人妻一区二区三区,99精品| 麻豆黄色五月天| 久久这里精品国产99丫e6| 91暧暧| 少妇诱惑视频| 色婷婷一区二区三区久久午夜成人不| 综合亚洲网| 欧美亚洲图片| 性久久| 啊视频在线| 91久久久久免| 一区,二区,三区视频| 天天内射| 精品无码秘 人妻一区二区 | 熟女网站最新| 男人的天堂1024| 97日韩| 乱伦一二三区| 日本高清久久| 亚洲欧美中日韩| 亚洲男人的天堂在线看| 天美传媒精品久久视频| 大香蕉综合网| 大学生口爆吞精| 国产麻豆一级精品视频| 韩国轻伦国内自拍一区| 日日干夜夜欢| 色欲天天综合久久久无码网中文| 久操网线| 黄色二级片网站| 久久AV色| 免费AV中文网在线观看| 日韩亚洲中文有码视频| 99国内精品| 日本黄色天堂| 久久午夜鲁丝片| 在线精品福利免费播放| 香蕉免费一区二区三区不读 | 91天堂色男人的天堂| 国产原创自拍| 色香网| 超碰97人人cao| 欧美日韩性爱无码| 色爱综合网欧美| 少妇精品久久久八区九区| 欧美性xxxxx狂欢| 91人妻Pr| 91精品操美女| 日韩国产欧美伦理在线| 欧美老妇女内射网址| 天天爱天天操| 欧美制服网站美腿丝袜| 久草电影网| 97爱爱| 人妻嗯啊啊在线播放| 性欧美| 欧美欧美啪啪视频| 丁香五月大香蕉| 偷拍综合亚洲| 免费观看性欧美一级| 五月天激情网图片| 人妻天天爽夜夜爽2| 亚洲 日本 国产 综合| 天堂蜜桃无码视频一区二区| 毛片99-全集电影手机免费观看完整-B029AV | 国产成人啪一区二区| 强被迫伦姧在线观看无码网站| 国产精品视频精品一二| 久久久久极品| 国产欧美日韩精品中文| 东京热熟女亚洲视频网站| 狠狠久久手机视频精品| 日日橹狠狠爱欧美超碰| 天天综合~91| 色牛牛AV| 97超碰影音| 欧美综合娱乐久久| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 国产强奸乱伦无码视频| 91精品国产综合久久久蜜臀| 日本视频在线中文字幕| 欧美熟爽综合| 欧美Ⅴ性爱| 亚洲情色1区| 中文字幕人妻资源在线| 躁躁日曰躁2020| 香蕉国产精品麻豆亚洲欧美日韩| 国产欧美成人精品| 无遮挡h肉动漫在线观看| 人妻熟妇久草在线| 91精品丝袜在线观看| 久久久草草精品| 欧美日韩岛国大片在线观看| www欧美91| 色婷婷狠狠| 亚洲欧美色图片| 久草久热| 东北丰满熟女国产一区| 亚洲97网站| 99视频在线| 免费精品国偷自产在线在线| 五十路人妻在线| 韩日无码在线观看| 超碰人妻久久| 久久久久密臀一区二区| 国产999精品久久久久久| 蜜桃狠狠色伊人亚洲综合网站| 伊人成人情色综合| 日韩精品1区2区中文字幕| 无码九九九九| 97超碰天天| 久久美女国产| 视频国产欧美在线播放| 在线中文AV| 综合色图亚洲欧美| 久久久久9999| 日熟女| 亚洲丝袜少妇在线| 青草伊人网| 真实高潮91| 亚洲成A∨人影院在线欢看| 高潮9999外国| 操老熟女AV| 淮穴色AV| 久久婷婷色| J?P?NESEHD熟女熟妇伦| 色亚洲欧美| 久草视频制服诱惑| 精品久久99| AV和黑人在线播放| gogogo免费高清看中国国语| 易易A毛视频| 丝袜天堂| 97干com| 婷婷五月天影院| 国产综合网站在线播放| 九九九精品成人免费视频小说| 208天天久久九九九| 久久欧美1卡2卡3| 五月婷婷性爱| 久久性爱城| jizzjizz欧美| 亚洲,日韩,欧美,成人播放| 99re这里只有精品9| 亚洲影视第一页| 久草婷婷| 嫩草影院永久在线制服丝袜| 操死我了嗯嗯嗯| 精品国产72| 美女露胸露屁股| 婷婷亚洲色| 亚洲砖码砖专无区2023| 成人精品在线| 日韩一999精品| 婷婷五月天AV| 色区久久| 日日狠狠久久偷偷色综合免费| 四虎视频在线观看| 国产精品国产精品国产| 亚洲中文字幕av| 久久9精品网站| 98超碰日本| 加勒比AV网| 人人色人人射人人妻| 九九碰九九爱97| 92午夜免费福利视频| 淫荡少妇免费| 欧美强奸一区二区诱惑| 五月天婷精品激情| 国产67194| 97天堂| 久久人妻视频| 91欧美偷拍| 97爱亚洲综合色| 97硬碰| 一本一首道人妻少妇免费久久| 蜜臀AV成人精品蜜臀AV久久| 一区二区视频你懂的| 日日妻色网| 天天情欲宗合网| 亚洲色棕合| 欧美日韩中文字幕不卡| A片大香蕉在线| 无码人妻一区二区三区色欲aⅴ | 夜色五月天| 欧洲综合视频| 国模不卡一本二本三电影| 日本蜜桃| 性生活性生大爱77AV国产| 99re久久| 99视频这有这里有精品| 久久精彩免费视频| 亚洲另类色图片| 老女人碰碰在线碰碰视频| 欧美天天在线| 欧美亚洲图片| 色综合婷婷| 欧美美女自慰一区二区三区| 婷婷15月天青娱乐| 国产v亚洲v日韩v欧美v片另类| 久久亚洲欧美中文字幕国语| 天综合中文| av麻豆啪啪| 亚洲蜜臀精品视频久久| 大学生美女口爆| 五月婷网站| 91neishe| 一二区在线观看视频| 欧美影院一区二区三区| 久久无码电影| 亚洲少妇诱惑| 78m成人视线| 香蕉国产精品麻豆亚洲欧美日韩| 熟女六十路| 顶级少妇BT天堂| 肉丝中文无码高清| 久久男人的天堂| 国产成人在线观看综合| 国产精品欧美激在线| 99re欧美| 天天综合欧美黑人| 伊人网免费视频| 91色久| 欧美伦乱爱| 屁股久久久久久| 成人免费在线网站| 国产精品色哟哟| 色色97爱| 激情久久av一区av二区av| 精品国产网站| 97在线免费| 日本99久久| 国产成人主播| 思思热在线视频免费| 麻豆久久久一区二区| 四季av一区二区凹凸精品小说| 色综合加勒比| 精品国产一区二区三区av在线资源| 久久草视频污视频| 91成人久久| 亚洲一二三| 91色人妻| 日本淫穴在线| 中国AV美女| 熟妇女人妻呻吟久久AV| 天天日天天操天天射河南省| 色性荡荡荡荡视频| 69麻豆天美| 99精品无码| 亚洲人妻爽爽爽| 综合色色网| 九9热伊人| 欧亚韩国999| 天美国产精品| 精品亚洲| 欧色综合| 一区二区三区探花在线观看| 啊啊啊啊在线播放| 91黑人无码激情在线| 亚洲网污污污污| 99老司机精品视频在线观看| 少妇特黄一区二区三区| 东京热免费视频| 欧美九九九九九| 99热| 妇女性内射冈站HDWWWCOM| 国产性感骚丝袜在线| 欧美精品宗合| 天天享受天天看| 天天日天天搞天天干| 欧美韩国你懂得在线| 秋霞成人一级在线观看| 久久天堂网| 久久xx| 国产精品福利视频| 无码人妻精品一区二区三区九九| 日韩一性一交一A片俄罗斯| 校园春色家庭伦理欧美激情| 婷婷香蕉欧美在线一区二区三区| 国产精品免费日韩| 中文字幕人妻丝袜乱一区三区| 操少妇很爽av| 久久性爱免费送| 玖玖久久久| 情色av电影| a天堂视频| 久久久久99999| 亚州乱码中文字幕综合久久久| 国产亚洲精品美女久久久久久2021| 国产精品乱码久久久、久久| 精品国产少妇高潮视频| 99在线免费公开视频| 日本免费二区三区| 麻豆激情综合| 啊啊啊啊啊啊在线看| 91午夜无码| 暴力av在线| 午夜欧美J进J出白浆流出久久久| 日本日皮视频逼| 97视频网站| 干妹子| 物尤视频一区二区| 久操大香蕉手机视频在线看| 国产视频一区二区免费| 男女做爰猛烈动高潮A片免费应用| 亚洲综合色在线| 欧美内射少妇| 国产欧美美女免费观看视频| 中文字幕在线观看视频www| 激情五月天插| 影音先锋日本乱伦| 男人的天堂va| 综合亚洲网| 亚洲吊色| 91av天美性媒精品视频| 中文字幕精品一区二区精品| 欧美久久伊人| 麻花豆传媒剧国产MV出差| 超碰九区| 国产熟女无套内射| 日韩猛交| 国产伊人精品在线| 91老熟女91老女人| 精品久久九| 和协无码影院| 中文字幕av久久爽Av| www.婷婷六月天| 99热最新| 亚洲 日韩 欧美 国产综合体| 国产69精品久久久久99尤物| 久久精视频美日韩在线视频| 乱伦av麻豆| 91影库| 色屁屁影院www国产| av天堂电影网| 久操97| 999久久久九九九九| 蜜桃午夜视频一区二区 | 超碰98综合网| 老熟女中文字幕高清| 亚洲精品骚逼| 久久人爽| 久久久精品视频欧州站| 青青草中出视频 | 亚洲AV永久无码一区仙野| 久久夜黄色无码A级大片| 自拍偷拍第26| 欧美综合娱乐久久| 免费观看的黄色的网站| 少妇干B| 8050无码八戒| 色五月婷婷网| 国产AV天美| 日日A∨| 天美传媒av一区二区| 国产视频大全| 欧美色图99| 男人精品区| 亚洲色图欧美一区二区不卡| 亚洲性爱乱操x| 亚洲国产欧美一区二区潘金莲| 天天插夜夜操| 五月婷婷AV| 综合色图亚洲欧美| 欧美日韩国产男人| 职场同事知名国产国产精品久久欧美日韩| 国产精品久久久午夜夜伦鲁鲁| 熟人人妻少妇精品久久| www.亚洲黄色| 熟女突然公开看18禁影片| 丁香五月激情网| 欧美少妇第一页| 操淫穴亚洲五月丁香| 999色欧美中文字幕| 91东北熟女| 欧美国产欧美在线观看| 色吧综合网| 国产suv精品一区二区四区999| 国产美女激情| 久久春色| 93人人操人人| 超碰超碰95| 欧美亚州色的图| 熟女精品日韩一区二区三区| 国产成年女人免费视频播放a| 性爱av在线免费观看| 99热色这里只有精品| 黑人与人妻| 久久久久久久唑| 91艹B视频| 婷婷色一区| 热的中文 热的有码 热的国产| 91精品丝袜久久久久久| 久久九九视频九九视频| 99自拍B亚洲 | 精品网站9999| 四虎免费在线播放| AAAAAAAAA黄片| 九色97| 欧美日本视频一区| 2020中文在线一区二区三区| 亚洲国产精品乱码在线观看| 快播久久人人aV| 成人性爱av| 日韩人体偷拍| 国产免费内射视频| 乱伦系列一区二区| 久久久专区| 欧美性爱精品七区| 东北黄色电影| 日日躁夜夜躁狠狠躁超爽| 丝袜剧情| 亚洲综合贴图91 | av婷婷色网| 亚洲人综合19| 超碰av在线| 日本五区不卡| 人人看人人摸人人色| www. 男人天堂成人在线| 亚洲天堂在线怕怕视频| 久草色悠悠在线视频| 天天综合97| 中文字幕第页| 国产精品福利资源在线尤物| 亚洲aw毛茸茸在线 | 啊啊啊好舒服好爽啊啊啊视频| 久久9久| 亚洲色图大香| 清纯唯美亚洲| 99爱久久视频频| 亚洲精品自拍| 一直超碰| 日本肉体xxxx裸交| 78精品| 欧美夜夜狠| 男人的天堂网页| 久久手机好看网站| 免费的黄片有限公司| 久久久中文版| 欧美精品久久久久久久久88| 国产激情在线| 九九精品美女高溯喷水 | 亚洲色资源| 国产精品欧美日韩久久| 夜夜爽夜夜摸夜夜操免费视频| 国产三级日产三级韩国三级 | 自拍鲍鱼一区在线高清观看免费| 天天欧美| 欧亚不卡| 操逼网免费无码视频| 97人人夜| 亚洲天堂另类小说男人| 18禁中文字幕| 噜噜噜噜久久久精品免费| 亚洲激情网一二三四区| 国产真乱mangent| 久久久久9999精品九九九| 亚洲图片欧洲图片aⅴ| 国产日韩怡红院| 丰满少妇人妻久久久久久| 欧美精品一区二区少妇免费A片| 中国黄色特级精品一区二区三区片| 欧美日韩国产色图在线| 91性色| 国产欧美后入| 偷拍 精品 另类 四区| 隔壁邻居波多野结衣中文字幕 | 免费一级黄色录像影片| 97人人爱人人乐| 日韩99神马视频播放| 美国aaaaa一级黄片| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 亚洲免费97免费| a在线观看| 妇女性内射冈站HDWWWCOM| 一摸二插三插| 97色97好| 国产欧美精品日韩区二区麻豆天美| 精品久久久久久无码| 97网站在线观看 | 国产家庭乱伦网址| 亚洲精品自拍| 97色综合中文网| 五月开心久久AV官网| 日韩AV电影网站| 首页中文字幕中文字幕免费| 日本爽爽爽爽爽爽免费视频| 加勒比海人人操超碰在线| 欧美夜色| 嫩草 人人网精品| 日韩精品99999| 激情综合网五月婷婷五月天| 妇女性内射冈站HDWWWCOM| 97超碰大| 78精品| 色天使AV天堂| 午夜精品久久999热蜜桃介男人用| 久久免费中文字幕在线观看| 婷婷亚洲综合| 久久亚洲婷婷| 柠檬AV导航| 性爱乱伦网址| 免费观看啪视频| 影音先锋少妇| 亚洲乱色熟女一区| 超碰调教97| 成年女人18级毛片毛片免费观看| 久久成人午夜精品影院| 淫荡少妇免费| 国产天美传媒精品| 麻豆性爱视频在线播放| 97人人中文网| 成人无码专区精品视频| 打av高清| 神马久久久久| 成人影 天天操 亚洲| 五月天偷拍| 狠狠爱综合| 九九99精品视频在线观看| 撸无码不卡免费视频| 永久免费av无码网站国产app| 欧美美女视频| 亚洲美女av无码| 国产一国产一级毛片古装| 超碰欧美97| 玖草在线视频| 高清无码久操视频| 超碰无码加勒比| 国产日产精品久久快鸭的功能介绍| 亚洲av国产av综合av卡| 强奸乱伦大香蕉| 国内毛片婷婷六月色| 亚欧无码在线| 日本在线一二| 亚洲激情 欧美色图| 亚洲中文电影| 18精品一二区| 精品人妻一二三| 亚洲一卡二卡在线免费| 制度丝袜99| 日本精品第一视频在'| 天堂种子在线www网资源| 99精品免费| 九九热五区| 日日干夜夜欢| 91 丝袜在线播放| 99re国产精品视频| 久久伊人大香蕉| 亚洲最大的黄色电影网站。| 亚洲性少妇| 九九九国产| 激情 欧美 亚洲 小说| 黄色大香焦1级‘′‘| 亚洲一区二区麻豆影院| 成人五月天色网| 麻豆熟妇乱妇熟色A片在线看| 九九九久久久| 国产av美女被艹的乱叫| 亚洲国产综合久久天堂| 色踪合AV| 超碰精品日韩欧美国产| 日本精品成人无码| 久久av网| 欧美色性情| 天天操天天干一区二区| 9/A片 | 超碰91在线| 中文字幕奈奈美被公侵犯| 99久久综合| 欧美 亚洲 91| 黄片视频观看| 色综合色色| 韩日巨乳美女免费视频在线观看| 97免费在线观看| 日本欧美亚洲高清在线看| 精品无码一区二区| 97精品在线视频| 国产精品蜜乳AV| 日韩99神马视频播放| 96一区二区| 国产亚洲色婷婷久久99精品91葵花宝典| 搡老女人老妇女老妇老熟女怎么读| 精品久操| 亚洲日韩精品一区视频在线| 欧美精品丝袜久久久中文字幕| 91国产丝袜白虎| 乱伦日本色图AⅤ| 污污污8888| 偷拍 欧美 日韩| A V少妇特黄三级| 素人伊尹大香蕉免费下载视频| 亚洲无码太久| 亚州色站 日韩电影| 97亚洲精品| 色五月婷婷麻豆在| 97日亚洲欧美| 天堂岛av| 日日摸天天爽夜夜欢| 任你艹| 久久久女人| 国产欧美亚洲精品a第2页| 色激情综合网站| 97天堂| www.婷婷| 日韩欧美女求操每天更新| 久久男女激情视频网站| 蜜臀在线网站| 97人人模人人爽人人| 五月天AV资源| 色婷婷色99国产综合精品| 黄久久| 日韩av乱伦| 中国熟妇| 人妻久热在线| 天天躁日日躁成人字幕aⅴ| 日本 免费 一区二区三区 久久香蕉| 中文字幕一区二区视频在线观看| 国产精品久久久视频| 日韩欧美性吧婷婷乱伦大香蕉| 九一亚洲国产免费| 九九精品无码专区免费| 天天日天天操VV| 一区二区三区四区免费视频| 91天天综合在线| av优播| 最新av网站在线观看| h色99999| 免费黄色片子| 日本孕妇一区二区视频操逼免费看| 亚洲AO在线| 园内精品自拍视频在线播放| 1204人成网站色www| 大香蕉综合网| 99e久久国产精品| 91精品免费| 日韩精品99999| 亚洲国产成人精品久久久国产成人一区二区 | 中文字幕精品丝袜| 美国人人操人人操| 国产超碰97| 久九干| 人人爱人人操人人性| 日本大香蕉综合网| 日本最新免费韩国1区2区视频播放| 国产精品香蕉热久久新品| 三级色影综合网| 久久精9| 天天爱天天操| 涩涩涩综合| 色图四区| 色呦色呦色精品| 91蜜臀熟女| 强奸乱伦日韩AV| 操国产高清| 中文熟女五十乱码在线| 97综合在线观看| 亚洲Av无码成人精品国产| 热99这里有精品综合久久 | 9美女超碰在线免费观看| 欧美色图亚洲色图成人在在线| 日韩成人精品视频自拍| 久久的免费性爱视频| 久久久精品九| 天天干人妻| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 久久受www免费人成| 1024精品在线| 精品无码产区一区二| 色哟哟-国产专区| 99操逼| 中文字幕狠狠玩| 日韩三A大片在线观看| 97免费在线观看| 亚洲欧美激情小说| 夜夜操一区二区| 美女在线H91| 天天插天天射| 亚洲色诱惑| 综合操逼| 精品久久久久av影院| 老司机午夜精品视频| 综合色91| 亚洲午夜精品久久久中文影院| 熟女精品一区二区三区| jazzjazz国产精品麻豆| 国内精品久9| 亚洲熟久久| 天天夜躁日日躁狠狠2002| 久久久久久少妇| 色色综合97| 伊人久久大香蕉线AV五月天| 中文字幕在线观看AV| 97操| 久久久啊啊啊| AV女资源| 91天美免费| 亚洲图片视频小说| 97网站在线观看| 欧美日韩国产色五月综合在线| 久久久久久久六六| 无码人妻精品一区二区三区九九 | 97干在线视频| 国产乱子伦一区二区三区在线观看| 亚洲中文sv| 51国产午夜精品视频| 免费看污网站| 蜜臀av中字字幕网站| 伊人久久亚洲中文字幕| 啊啊啊用力在线观看| 中文字幕91综合| 日本天天人人狠狠在线日美女| 欧插网站| 欧美色图私拍91| 欧美精品偷拍| 欧洲精品久久| 少妇特黄一区二区三区| 大香蕉一人| 亚洲狠| av三级电影在线播放| 黄片免费视频2019| 东京热男人的天堂精品| 欧美性爱在线无码| 色色色综合| 夜夜高潮夜夜爽| 久久久久久久久久久久久久久久9| 亚洲性少妇| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 校园春色欧美色图| 五十路人妻在线| 国产免费内射视频| 欧美片第一页| 黄片aaaaa一区| www.99热| 久久久久亚洲一区女同性恋中文字幕| 亚洲人精品午夜不卡| 一本久道久久综合狠狠爱一密臀精| 大学生美女口爆| 久久夜黄色无码A级大片| 色婷婷香蕉| 欧美五区| 亚洲图片欧美偷拍| 一级@啪啪视频| 婷婷天堂站| 殴洲老熟女| 女优大全 - 91n| 欧美亚洲色图另类国产| 久久人妻办公室视频| 夜精品久无码| 亚州一区二区| 久草免费在线一区二区| 三级片大波波| 超碰精品97| 免费αⅴ在线观看| 亚洲天堂性爱| 欧美女同在线| 久久av无码| 五月综合激情| 91N综合网在线| 亚洲黄片免费在线播放| 五月天激情四射| 精品人妻一区二区三区夜夜| 狠狠超| 97国产成人精品免费视频| 免费成人自拍视频在线| 欧美99999| 精品性爱一二三区| 91在线色| 亚洲欧美电影| www超碰| 欧美一区二区三区黄色影视| 欧美激情性久久久久久| 无码人妻丰满熟妇区毛片| 国产精品白丝在线播放| 久久人妻视频网| 欲色啪| 亚洲伊人a线观看视频| 人人妻人人操人人乐| 欧美色图校园春色| 欧美特大黄一级片片免费| 老熟妇一区二区三区啪啪| 三男一女不戴套的A片| av天天在线观看| 蜜臀久久99精品久久久久久成人小说| 18禁精品网站在线看| 亚洲狼狼干综合1| 无码一区免费在线不卡| 日本人妻中文字幕精品| 东京热91| 亚洲精品a人片在线观看视| 岛国人妻少妇av在线观看| 国产强奸乱伦第1页| 五月婷婷六月色| 久久免费老司机精品| 啊啊啊久久久视频| 欧美日韩不卡a片| 樱花草社区www中国| 国产乱伦视频污| 精品网站9999| 亚洲丝袜二区在线| 免费看久久久性性| 欧美最婬乱婬爆婬牲视频| 青青操轻轻| 久久黄黄黄| 丰满人妻-区二区三区免费| 91精品91久久久中77777| 91久久久久免| 操国产高清| 夜夜操av亚洲一区二区| 强奸乱伦免费网站| 欧美天堂第二区| 伊人色综合网电影| 欧美色综合网| 日韩三四五区| 国产精品免费1区2区视频| 牛牛久久国产精品视频一二三 | 欧美成人都市人妻| 中文字幕欧美日韩三级| 久久欧洲| 最新啪啪视频| 清纯唯美亚洲综合| 美女高潮视频91| 色综合天天| 超碰色大香蕉| 涩爱AV在线| 亚洲最大成人a毛毛片| 人伦四五区| 久久国产精品一级二级三级| 先锋激情∨在线视频播放| 夜夜夜夜爽| 国产91美女高潮| 亚洲图片色图欧美另类| 久久9精品网站| 天堂蜜桃无码视频一区二区| 国产精品爱欲| 国产9熟妇视频网站| 91丝袜美腿网站| 女人喷水视频在线观看| 欧美天天综合在线| laoshunv91| 日日操天天操| 免费又黄又裸乳的视频| 91美女片在线| 中文字幕超碰CAO| 五月天婷婷色| 久操网视频| 丰满人妻一区二区三区免费 | 人妻夜夜爽天天爽三区麻豆AV网站| 清清草影| 中文字幕二区日韩天堂| 日本精品无码三级网站| 欧美天天综合| 婷婷激情五月综合| 亚洲欧美另类少妇精品| 开心五月婷婷激情| 韩国一级AAA| 欧美色欧美| 密臀国产在线| 综合色拍| 免费农村成人少妇人妻Aa一区二区视频| 女人喷水视频在线观看| 精品人妻免费观看| 久久久久女教师免费一区| 性色av一区二区| 日韩pv中文| 丁香五月性爱| 色乱二区| 人人操人人操人人操人人操人人操人人人11.CM | 久久亚码| 宗合情欲网| 在线观看AV不卡| 操人91| 国产亚州高清国产拍精| 久久性爱精品一区| 国产乱伦视频污| 久久精品久久久久久久| 限制级中的三级片中的黑粗大屌屌日人妻熟女 | 夜夜夜夜爽| 日韩美女高潮喷水视频| 亚洲高清内射| 少妇被玩视频二三区| 成人情色一区二区| 色婷婷av在线观看| 无码自拍SM| 久久久成人国产精品无码| 国产精品久久99日日| 亚洲一区二区三区不卡国产欧美| 日韩强奸av| 日本黄大片在线观看视频| 一区二区乱码福利| 久久精品国产亚洲5555| 热99这里有精品综合久久| 精品在线蜜臀| 久久春色| 国产激情视频一区区三区| 综合第一页| 国产精品播放| 风月影院十八禁| 亚洲色欧美| 欧州一区二区三区四区| 免费家庭乱伦视频| 国产探花日韩援交| 国产成人自拍视频视频| 亚洲 自拍偷拍 欧美| 亚洲欧美日韩免费电影| 国产精品无套内谢| www国产天美久久久| 欧美成人一区二区三区在线播放| 蜜桃av综合网发布| 色婷婷99| 人人妻人人操人人乐| 色女网日韩| 欧美另类自拍 | 国产精品白领在线观看| 国产精品嫩草影院午夜两性| 日韩欧美大力操| 国产AV无码AV| 五月丁香啪啪| 日本九九久久99播| 黑人与人妻| 91天天综合在线观看| 欧综合网| 手机在线免费看的av| 上海一级黄片| www.久久久久| 顶级少妇BT天堂| 亚洲熟女乱综合一区二区三区| 天天影视之亚洲综合网| 欧美性性性| 中国AV美女| 亚洲精品乱码久久久久久蜜桃麻豆 | 少妇69中文| av 模特一区了| 99热伊人| 国产一级内射无挡观看| 欧美十八禁在线看| 天色综合网| 国产成人啪一区二区| 91欧美在线| 高清无码 国产精品| 开心婷婷五月| 91美女在线看| 黄页| 久草网站免费在线观看| 超踫中文字幕| 天堂亚洲精品久久老牛| 久久久蜜桃臀无码视频| 美国一区二区三区视频| 长长久久88视频| 9久精品视频在线观看| 天天色欧美| 日本成人电影资源网| 97超碰美国| 午夜精品久久久久久久| 精品国产三级av韩国在线| 日亚韩精品视频二区三| 精品国产91久久久久久一区黄无| 亚洲不卡一| 岛国大片国产| 欧美专区第一页| 99热线麻豆| av强奸乱轮| 97青青操视频| AV女优男人的天堂| aaaa少妇高潮大片| 欧美 传媒 麻豆 日韩 偷拍| 精品免费囯产一区二区三区| 狠狠色狠狠色狠狠五月| 天天干天天日天天射黄色大片| 亚洲AV永久无码精品成人调教| 精品无码久久久久久国产浪潮| 熟妇熟女亚洲天堂网| 天天操福利视频综合网站| 亚洲欧洲综合av在线| 97操97色| 啊啊啊啊啊好多水| 日韩av乱伦| 蜜桃视频啊啊啊啊| 色色色欧美| 麻豆成人av| 日本性爱欧美性爱| 蜜臀在线免费观看在线免费观看| 九久9精品| 色色色五月婷婷| 欧美色图片色哟哟| 国产尹人在线视频免费| 91精品又粗又猛又爽| 伊人久久综合影院| 欧洲与亚洲欧美精品中文字幕| 久久中文字幕不卡人妻| 神马久久久久眼| 97超碰中文在线| 香蕉在线一区二区三区| 亚洲 在线| 国模一区二区三区| 92久久| 黄色污污污污污污网站| 欧美色涩| 亚洲男人的天堂一区二区| 国产福利精品98视频| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 天天狂操夜夜狂日| 立川理惠加勒比无码| 人妻美腿丝袜日韩| 久久精品亚洲成a人天堂| 美女丝袜激情小说| 人人操人人摸人| 91久久精品美女高潮喷水| 男人的天堂一区三区| 情色图区| 人妻少妇视频在线播放| 九九九免费视频| 熟女色图在线| 台湾成人无码AV| 无码操逼天堂| 亚洲啪啪性视频| 97chaopengongkai| 91色噜噜狠狠| 丰满岳乱妇一区二区三区| 久久中文字幕女同性恋一区| 九九aV| 99热| 欧美青青视频| 亚洲欧美激情在线视频| 天堂成人网| 蜜奶av| 伊人影院综合是一个与深夜成人在线| 久久超碰天天| 欧美日日网| 国产曰批免费观看久久久| 久久99久久99精品天美传媒棢·纸:.| 能看的AV| 色在线综合| 亚州精品人妻一二三区| 色蜜AV| 国产欧美日韩一区二区三区| 欧美一区二区三熟女剧情| 亚洲情色第一页| 福利操逼| 91bbbbbb| 久久精品视频在线观看| 久操热线| 最新日日夜夜天天干干| 超碰97人妻自拍| 97色97好| 色色激情| 95自拍视频在线观看| 超碰色图| 亚洲无限观看| 青青草九九九九九| 国产熟女免费观看久久| 亚洲国产成人综合碰碰三级经典| 偷拍五区| 91亚洲不卡一区| 日本肏逼视频在线观看| 综合av社区| 人人妻人人澡人人爽久久av| 免费看污网址| 日韩AV电影网站| 五月丁香社区婷婷日韩欧美精品影院| 国产精品不卡高清在线观看| 舔舔啊| 欧美日韩精品国产91| 久久久人体| 亚洲一区二区精品福利| 欧美特大AA级黄片| 97干在线视频| 国产AB视频| 亚洲区限制级| 九一屌逼| 青青网三级视频| 欧美在线播放aaaa| 国产AV毛片| 性爱网站一区二区| 国产老女人久久毛| 亚洲欧美国产精品久久久久久久| 美女诱惑在线一区| 日韩一999精品| 五月婷婷综合在线| 国产热RE99久久6国产精品首| 欧美性爱第一区| 欧美一级黄片视频在线| 四月丁香婷婷| 天天日天天色| 免费在线观看AV无码网站| 欧美精品99久久久**| 亚洲成人黄色在线观看| 欧美综合另类| 一本色道久久综合精品婷婷| 欧美综合色综合| 色香伊人| 韩国国产欧美情侣视频在线| 麻豆性爱视频在线播放| 天天操女人| 久久精品欧美一区蜜桃| 七久久久| 91爱综合| 麻豆天美国美国产| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 人妻二区| 男女啪啪网站免费视频| 国产精品美女| 一二三区操逼国产91| 91这里只有精品| 欧美第一页| 亚洲精品国语在线播放| 色色毛片| 婷婷伊人五月| 伦激情人妻另类人妻| 飘花国产午夜精品不卡| 日韩欧美成人综合在线| 人人人人插| 怡红院一区二区熟女人妻| 欧美综合区| 色激情五月天| 中文一区二区婷婷视频|