BaseDao指南

1. BaseDao類

import java.sql.*;/*** 通用的工具類 ,負責連接數據, 執行增刪改查的通用方法*/
public class BaseDao {private Connection connection;private PreparedStatement pstm;private ResultSet rs;/*** 建立數據庫連接** @return*/public Boolean getConnection(){try {Class.forName("com.mysql.jdbc.Driver");connection =DriverManager.getConnection("jdbc:mysql://主機:端口/連接的數據庫名稱","根用戶名","密碼");return true;} catch (ClassNotFoundException e) {e.printStackTrace();return false;} catch (SQLException e) {e.printStackTrace();return false;}}/*** @param sql    insert into xx values (?,?,?)* @param params 參數個數和占位符個數一致*               new params[]{"a","b","c"}* @return*/public int update(String sql, Object[] params){try {if (this.getConnection()){pstm = connection.prepareStatement(sql);if (params!=null && params.length>0){for (int i=0; i < params.length; i++) {pstm.setObject(i+1,params[i]);}}int num = pstm.executeUpdate();return num;}} catch (SQLException e) {e.printStackTrace();}return 0;}/*** 查詢** @param sql    select * from xxx where xx =? and xx=?* @param params new []{"xxx","xxx"}* @return*/public ResultSet query(String sql, Object[] params){try {if (this.getConnection()){pstm = connection.prepareStatement(sql);if (params!=null && params.length>0){for (int i=0; i < params.length; i++) {pstm.setObject(i+1,params[i]);}}rs = pstm.executeQuery();}} catch (SQLException e) {e.printStackTrace();}return rs;}/*** 關閉數據庫連接*/public void close(){try {if (rs!=null){rs.close();}if (pstm!=null){pstm.close();}if (connection!=null){connection.close();}} catch (SQLException e) {e.printStackTrace();}}
}

主機,端口,根用戶名,密碼:

自選你需要連接的數據庫名:

填寫相應的數據,BaseDao就初始化完成了。

2. 指南

!食用指南前請先看文章Dao模式,更便于理解!

DAO模式-CSDN博客

接下來我將舉例來說明如何具體使用:

需求:根據雇員id添加/更新/刪除雇員信息。 根據部門id獲取部門名稱

我們需要連接到dept1來完成工作:

connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/dept1","root","ok");

????????表信息:

????????????????employees表:

????????????????departments表:

首先我們先創建兩個實體類:

? ? ? ? entity:

????????????????Employees

public class Employees {private Integer empId;private String empName;private Integer departmentId;private Double salary;private String empPasswd;public Employees() {}public Employees(Integer empId, String empName, Integer departmentId, Double salary, String empPasswd) {this.empId = empId;this.empName = empName;this.departmentId = departmentId;this.salary = salary;this.empPasswd = empPasswd;}public Integer getEmpId() {return empId;}public void setEmpId(Integer empId) {this.empId = empId;}public String getEmpName() {return empName;}public void setEmpName(String empName) {this.empName = empName;}public Integer getDepartmentId() {return departmentId;}public void setDepartmentId(Integer departmentId) {this.departmentId = departmentId;}public Double getSalary() {return salary;}public void setSalary(Double salary) {this.salary = salary;}public String getEmpPasswd() {return empPasswd;}public void setEmpPasswd(String empPasswd) {this.empPasswd = empPasswd;}@Overridepublic String toString() {return "Employees{" +"empId=" + empId +", empName='" + empName + '\'' +", departmentId=" + departmentId +", salary=" + salary +", empPasswd='" + empPasswd + '\'' +'}';}
}

? ? ? ? ? ? ? ? Departments

public class Departments {private Integer deptId;private String deptName;public Departments() {}public Departments(Integer deptId, String deptName) {this.deptId=deptId;this.deptName=deptName;}public Integer getDeptId() {return deptId;}public void setDeptId(Integer deptId) {this.deptId = deptId;}public String getDeptName() {return deptName;}public void setDeptName(String deptName) {this.deptName = deptName;}@Overridepublic String toString() {return "Departments{" +"deptId=" + deptId +", deptName='" + deptName + '\'' +'}';}
}

接著我們來創建兩個接口:

!注意:創建接口時可以根據需求一個一個方法的創建并實現。比如要做增刪改查四個功能,可以先在接口里寫(增加)的方法,在implement里實現以后再繼續添加后續方法!

!注意:也可以分類別添加方法,比如增刪改查是一類方法,可以add update delete list都寫進接口里,在impl里挨個實現,然后再添加減薪資之類的復雜方法!

? ? ? ? 接口:

????????????????EmployeesDao接口

import com.zb.entity.Employees;import java.util.List;public interface EmployeesDao {int addEmployees(Employees employees);int updateEmp(Employees employees);int deleteEmp(Integer id);List<Employees> listEmpByDept(Integer deptId);Double avgSalaryByDept(Integer dept);}

? ? ? ? ? ? ? ?DepartmentsDao接口

import com.zb.entity.Departments;public interface DepartmentsDao {Departments findDeptById(Integer id);}

接下來在接口實現類里對接口的方法進行實現:

!注意:接口實現類繼承BaseDao并實現對應接口!

? ? ? ? 接口實現類

????????????????EmployeesDaoImpl

import com.zb.dao.BaseDao;
import com.zb.dao.EmployeesDao;
import com.zb.entity.Employees;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class EmployeesDaoImpl extends BaseDao implements EmployeesDao {@Overridepublic int addEmployees(Employees employees) {String sql = "insert into employees values (?,?,?,?,?)";Object[] param = {employees.getEmpId(),employees.getEmpName(),employees.getDepartmentId(),employees.getSalary(),employees.getEmpPasswd()};int num = super.update(sql,param);close();return num;}@Overridepublic int updateEmp(Employees employees) {String sql = "update employees set emp_name=? , department_id=? ,salary =? ,emp_passwd =? where emp_id=?";Object[] param = {employees.getEmpName(),employees.getDepartmentId(),employees.getSalary(),employees.getEmpPasswd(),employees.getEmpId()};int num = super.update(sql,param);close();return num;}@Overridepublic int deleteEmp(Integer id) {String sql = "delete from employees  where emp_id=?";Object[] param = {id};int num = super.update(sql,param);close();return num;}@Overridepublic List<Employees> listEmpByDept(Integer deptId) {List<Employees> list = new ArrayList<>();String sql = "SELECT * FROM employees WHERE department_id=?";Object[] param = {deptId};ResultSet rs = super.query(sql,param);try {while(rs.next()){Employees employee = new Employees();employee.setEmpId(rs.getInt(1));employee.setEmpName(rs.getString(2));employee.setDepartmentId(rs.getInt(3));employee.setSalary(rs.getDouble(4));employee.setEmpPasswd(rs.getString(5));list.add(employee);}} catch (SQLException e) {e.printStackTrace();} finally {close();}return list;}@Overridepublic Double avgSalaryByDept(Integer dept) {String sql = "SELECT AVG(salary) FROM employees WHERE department_id = ?";Object[] param = {dept};ResultSet rs = super.query(sql,param);try {while (rs.next()){Double avgSalary = rs.getDouble(1);return avgSalary;}} catch (SQLException e) {e.printStackTrace();}finally {close();}return null;}}

????????????????

????????????????DepartmentDaoImpl

import com.zb.dao.BaseDao;
import com.zb.dao.DepartmentsDao;
import com.zb.entity.Departments;import java.sql.ResultSet;
import java.sql.SQLException;public class DepartmentDaoImpl extends BaseDao implements DepartmentsDao {@Overridepublic Departments findDeptById(Integer id) {Departments departments = null;String sql = "SELECT * FROM  departments WHERE dept_id =?";Object[] param = {id};ResultSet rs = super.query(sql, param);try {while (rs.next()) {departments = new Departments();departments.setDeptId(rs.getInt(1));departments.setDeptName(rs.getString(2));}} catch (SQLException e) {e.printStackTrace();} finally {super.close();}return departments;}
}

接著我們進行測試:

? ? ? ? Test

public class test {public static void main(String[] args) {//初始化一個新員工Employees employees=new Employees();employees.setEmpId(8);employees.setEmpName("關羽");employees.setDepartmentId(2);employees.setSalary(3000.0D);employees.setEmpPasswd("123");EmployeesDao employeesDao=new EmployeesDaoImpl();//添加新員工employeesDao.addEmployees(employees);//刪除該員工employeesDao.deleteEmp(8);//更新該員工數據employeesDao.updateEmp(employees);//查看部門編號為1的員工的姓名和薪資List<Employees> emp=employeesDao.listEmpByDept(1);for (Employees employees1 : emp) {System.out.println(employees1.getEmpName() + "\t" + employees1.getSalary());}//查看部門編號為1的名稱DepartmentsDao dept=new DepartmentDaoImpl();System.out.println(dept.findDeptById(1).getDeptName());}
}

????????附加:

進階需求:查找每個部門的平均薪資,如果大于5000,則每個雇員-500元薪資

添加service文件夾,在service里對dao包里獲取的數據進行處理

????????????????接口:

? ? ? ? ? ? ? ? ? ? ? ? EmployeesService接口

public interface EmployeesService {boolean changeSalaryByDept(Integer dept,Double changeMoney);
}

? ? ? ? ? ? ? ? ? ? ? ? DepartmentsService接口

import java.util.Map;public interface DepartmentsService {Map<String, Object> searchEmpFromDept(Integer dept);}

????????????????接口實現類:

????????????????????????EmpolyeesServiceImpl

import com.zb.dao.EmployeesDao;
import com.zb.dao.impl.EmployeesDaoImpl;
import com.zb.entity.Employees;
import com.zb.service.EmployeesService;import java.util.List;public class EmployeesServiceImpl implements EmployeesService {private EmployeesDao employeesDao = new EmployeesDaoImpl();@Overridepublic boolean changeSalaryByDept(Integer dept, Double reduceMoney) {double avgSalary = employeesDao.avgSalaryByDept(dept);if (avgSalary>5000){List<Employees> employees = employeesDao.listEmpByDept(dept);for (Employees employee : employees) {employee.setSalary(employee.getSalary()+reduceMoney);employeesDao.updateEmp(employee);}return true;}return false;}}

? ? ? ? ? ? ? ? ? ? ? ? ?DepartmentsImpl

import com.zb.dao.DepartmentsDao;
import com.zb.dao.EmployeesDao;
import com.zb.dao.impl.DepartmentDaoImpl;
import com.zb.dao.impl.EmployeesDaoImpl;
import com.zb.entity.Employees;
import com.zb.service.DepartmentsService;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class DepartmentsServiceImpl implements DepartmentsService {private DepartmentsDao departmentsDao = new DepartmentDaoImpl();private EmployeesDao employeesDao = new EmployeesDaoImpl();@Overridepublic Map<String, Object> searchEmpFromDept(Integer dept) {Map<String, Object> deptModel = new HashMap<>();List<Employees> employees = employeesDao.listEmpByDept(dept);deptModel.put("emp",employees);deptModel.put("dept",departmentsDao.findDeptById(dept));return deptModel;}}

? ? ? ? ? ? ? ? Test

import com.zb.dao.DepartmentsDao;
import com.zb.dao.EmployeesDao;
import com.zb.dao.impl.DepartmentDaoImpl;
import com.zb.dao.impl.EmployeesDaoImpl;
import com.zb.entity.Departments;
import com.zb.entity.Employees;
import com.zb.service.DepartmentsService;
import com.zb.service.EmployeesService;
import com.zb.service.impl.DepartmentsServiceImpl;
import com.zb.service.impl.EmployeesServiceImpl;import java.util.List;
import java.util.Map;public class test {public static void main(String[] args) {EmployeesDao employeesDao=new EmployeesDaoImpl();double avgSalary=employeesDao.avgSalaryByDept(1);EmployeesService employeesService=new EmployeesServiceImpl();boolean flag=employeesService.changeSalaryByDept(1, -500.0);System.out.println(avgSalary + "\t" + flag);}}

附錄:

整體程序的結構概覽

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81970.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81970.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81970.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot JAR 啟動原理

文章目錄 版本概述JAR 包結構MANIFEST.MF 描述文件JarLauncherArchive 接口launch 方法Handlers.register() 方法getClassPathUrls 方法createClassLoader 方法 時序圖參考 版本 Java 17SpringBoot 3.2.4 概述 JAR 啟動原理可以簡單理解為“java -jar的啟動原理” SpringBo…

YOLO11解決方案之速度估算探索

概述 Ultralytics提供了一系列的解決方案&#xff0c;利用YOLO11解決現實世界的問題&#xff0c;包括物體計數、模糊處理、熱力圖、安防系統、速度估計、物體追蹤等多個方面的應用。 YOLO速度估算結合物體檢測和跟蹤技術&#xff0c;使用YOLO11 模型檢測每幀中的物體&#xf…

初識C++:模版

本篇博客主要講解C模版的相關內容。 目錄 1.泛型編程 2.函數模板 2.1 函數模版概念 2.2 函數模版格式 2.3 函數模版的原理 2.4 函數模版的實例化 1.隱式實例化&#xff1a;讓編譯器根據實參推演模板參數的實際類型 2. 顯式實例化&#xff1a;在函數名后的<>中指定模…

人工智能100問?第27問:神經網絡與貝葉斯網絡的關系?

神經網絡與貝葉斯網絡是兩種互補的智能模型:神經網絡通過多層非線性變換從數據中學習復雜模式,擅長大規模特征提取和預測,而貝葉斯網絡基于概率推理建模變量間的條件依賴關系,擅長處理不確定性和因果推斷。兩者的融合(如貝葉斯神經網絡)結合了深度學習的表征能力與概率建…

【node.js】入門基礎

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;node.js 文章目錄 1. Node.js簡介1.1 Node.js的核心特點1.2 Node.js適用場景 2. 第一個Node.js程序2.1 創建并運行Hello World2.2 創建簡單的HTTP服務器 3. Node.js核心概念3.1 模塊系統3.1.1 創建和導出模塊3.1.2 導入和使用模…

百度飛槳PaddleOCR 3.0開源發布 OCR精度躍升13%

百度飛槳 PaddleOCR 3.0 開源發布 2025 年 5 月 20 日&#xff0c;百度飛槳團隊正式發布了 PaddleOCR 3.0 版本&#xff0c;并將其開源。這一新版本在文字識別精度、多語種支持、手寫體識別以及高精度文檔解析等方面取得了顯著進展&#xff0c;進一步提升了 PaddleOCR 在 OCR …

Android 14 Binderized HAL開發實戰指南(AIDL版)

Android 14 Binderized HAL開發實戰指南&#xff08;AIDL版&#xff09; 環境要求 Android 14源碼編譯環境AOSP android-14.0.0_r7分支Soong build系統Java 17 & NDK r25c 項目結構 hardware/interfaces/myservice/ ├── 1.0 │ ├── IMyHalService.aidl # AID…

第九天的嘗試

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 創造美好的代價是努力&#xff0c;失望以及毅力&#xff0c;首先是痛苦&#xff0c;然后才是歡樂。 時間是快的&#xff0c;看怎么利用&#xff0c;安排好一切事情&#xff0c;才能從容面對…

交安安全員:交通工程安全領域的關鍵角色

在交通工程這個龐大而復雜的領域中&#xff0c;交安安全員扮演著舉足輕重的角色&#xff0c;他們是安全的捍衛者&#xff0c;是交通工程順利推進的重要保障。? 交安安全員&#xff0c;專門從事公路水運工程施工企業安全生產管理工作。他們的專業身份由交通運輸部門頒發的交安…

實驗-設計一個應用系統(計算機組成原理)

目錄 一. 實驗內容 二. 實驗步驟 &#xff08;1&#xff09;七段數碼管顯示模塊 &#xff08;2&#xff09;指令模塊 &#xff08;3&#xff09;控制模塊 &#xff08;4&#xff09;ALU模塊 &#xff08;5&#xff09;CPU模塊 三. 實現效果 四. 實驗環境 五. 實驗小結…

【博客系統】博客系統第四彈:令牌技術

令牌機制 為什么不能使用 Session 實現登錄功能&#xff1f; 傳統思路&#xff1a; 登錄頁面把用戶名密碼提交給服務器。服務器端驗證用戶名密碼是否正確&#xff0c;并返回校驗結果給前端。如果密碼正確&#xff0c;則在服務器端創建 Session。通過 Cookie 把 sessionId 返回…

【瑞數3代】藥監評審中心逆向分析 | 后綴MmEwMD參數

1.目標 目標網址&#xff1a;https://www.cde.org.cn/main/news/listpage/545cf855a50574699b46b26bcb165f32 import requestscookies {FSSBBIl1UgzbN7N80S: 8sYeMWaC_IHoNl8Ckfx2y9MLiueMCkPr2V3MIoZkrMPUfzMMaXKzAoxpNPvyw4lt,Path: /,FSSBBIl1UgzbN7N80T: 3js3ygV.St6BvO20…

【漫話機器學習系列】274.基尼指數(Gini Index)

決策樹中的基尼指數&#xff08;Gini Index&#xff09;詳解 —— 從公式理解到實際應用 在構建決策樹模型時&#xff0c;一個核心問題是&#xff1a;如何選擇最優的特征來進行節點劃分&#xff1f; 這就涉及到了“劃分準則”的問題。常見的準則有信息增益、信息增益率以及本文…

R語言學習--Day07--T分布與T檢驗

昨天我們介紹了R中用于對數據進行分類的聚類分析的方法&#xff0c;接下來我們來看T分布。 T分布 T分布適用于幫我們估計整組數據&#xff08;較小的數據量&#xff0c;一般小于30&#xff09;的真實值在哪一個區間&#xff0c;具體是計算置信區間&#xff08;一般為95%&#…

數據結構與算法-線性表-雙向鏈表(Double Linked List)

1 線性表 1.4 雙向鏈表&#xff08;Double Linked List&#xff09; 雙向鏈表的結點中有兩個指針域&#xff0c;一個指向直接后繼&#xff0c;另一個指向直接前驅&#xff0c;主要是為了解決前向查找的問題。 雙向鏈表結構&#xff1a; 書籍和視頻教程都只講解了插入和刪除的…

甘特圖實例 dhtmlxGantt.js

本文介紹了如何使用dhtmlxGantt庫創建一個基礎的甘特圖示例&#xff0c;并對其進行漢化和自定義配置。首先&#xff0c;通過引入dhtmlxgantt.css和dhtmlxgantt.js文件初始化甘特圖。接著&#xff0c;通過設置gantt.i18n.setLocale("cn")實現核心文本的漢化&#xff0…

C++23 新增扁平化關聯容器詳解

文章目錄 一、引言已有關聯容器回顧新容器的引入原因 二、std::flat_set定義與特性代碼示例適用場景 三、std::flat_multiset定義與特性代碼示例適用場景 四、std::flat_map定義與特性代碼示例適用場景 五、std::flat_multimap定義與特性代碼示例適用場景 六、與其他容器的比較…

使用zap,對web應用/API接口 做安全檢測

https://www.zaproxy.org/getting-started/ 檢測方法 docker pull ghcr.io/zaproxy/zaproxy:stable# 執行baseline測試 docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \ -t https://baseline.yeshen.org# 執行api測試 docker run -t ghcr.io/zaproxy/zaproxy…

Qt—模態與非模態對話框

Qt—模態與非模態對話框 核心概念 ?模態對話框??&#xff1a;強制用戶優先處理當前窗口&#xff0c;阻塞指定范圍的用戶交互。?非模態對話框??&#xff1a;允許用戶自由切換窗口&#xff0c;無交互限制。 一、模態對話框類型與行為 1. 應用級模態&#xff08;Applica…

Axure高保真CRM客戶關系管理系統原型

一套出色的CRM&#xff08;客戶關系管理&#xff09;系統&#xff0c;無疑是企業管理者掌控客戶動態、提升銷售業績的得力助手。今天&#xff0c;就為大家介紹一款精心打造的Axure高保真CRM客戶關系管理系統原型模板&#xff0c;助你輕松開啟高效客戶管理之旅。 這款CRM原型模…