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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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原型模…