在这个项目中,EmpServiceEmpMapper 都定义接口,是基于面向接口编程(Interface Oriented Programming,IOP)的设计思想,这两种接口在项目中承担着不同的职责,具体说明如下:

EmpService接口

  • 作用

    • 业务逻辑抽象EmpService 接口对员工相关的业务逻辑进行了抽象和定义。它将复杂的业务操作封装成一个个方法,比如员工的新增、删除、修改、查询等操作,使得上层的 EmpController 无需关心业务逻辑的具体实现细节,只需要调用接口方法即可。
    • 规范业务行为:通过定义接口,为业务逻辑的实现制定了统一的规范。不同的开发者可以根据这个规范,在 EmpService 接口的实现类(通常在 EmpService 接口所在包的 impl 子包下)中编写具体的业务逻辑代码。例如,在实现员工查询方法时,可能需要对查询条件进行合法性校验、处理分页逻辑、调用缓存服务(如果有的话)等,这些都可以在实现类中完成,只要保证方法签名符合接口定义即可。
    • 便于代码维护和扩展:当业务需求发生变化时,比如需要在员工删除操作中添加额外的业务校验(如检查该员工是否有关联的订单未处理),只需要在 EmpService 接口的实现类中修改对应的方法实现,而不会影响到 EmpController 以及其他依赖该接口的代码。同时,也方便在不修改接口的情况下,对业务逻辑进行扩展,例如添加新的业务方法。
    • 实现业务层的依赖倒置:在 Spring 等框架中,可以通过依赖注入(Dependency Injection,DI)的方式将 EmpService 接口的实现类注入到 EmpController 中,实现了高层模块(EmpController)不依赖于低层模块(EmpService 实现类)的具体实现,而是依赖于抽象(EmpService 接口),提高了代码的可维护性和可测试性。
  • 示例
    假设 EmpService 接口有以下定义:

public interface EmpService {// 查询所有员工List<Emp> listAllEmp();// 根据员工ID查询员工Emp getEmpById(Integer empId);// 新增员工void addEmp(Emp emp);// 修改员工void updateEmp(Emp emp);// 删除员工void deleteEmp(Integer empId);
}

EmpService 接口的实现类中,会根据业务需求实现这些方法,可能会涉及到调用 EmpMapper 接口进行数据库操作,以及处理其他业务相关的逻辑。

EmpMapper接口

  • 作用

    • 数据库操作抽象EmpMapper 接口对员工相关的数据库操作进行了抽象。它定义了与数据库交互的方法,如查询、插入、更新、删除员工数据等,使得业务层(EmpService)无需直接编写 SQL 语句,也无需关心数据库连接的获取、关闭等底层操作。
    • 配合 MyBatis 框架:在使用 MyBatis 框架的项目中,EmpMapper 接口与对应的 XML 映射文件(如 EmpMapper.xml)配合使用。接口中的方法与 XML 文件中定义的 SQL 语句相对应,MyBatis 框架会通过动态代理等机制,在运行时生成接口的实现类,从而执行对应的 SQL 操作。例如,EmpMapper 接口中的查询方法会根据 XML 文件中定义的 SQL 语句从数据库中获取数据,并将结果映射为 Java 对象(如 Emp 实体类)返回给调用者。
    • 实现数据访问层的解耦:通过将数据库操作抽象成接口,使得业务层与具体的数据库实现解耦。如果后续需要更换数据库(如从 MySQL 切换到 Oracle),只需要修改 EmpMapper.xml 中的 SQL 语句,以及数据库连接配置等,而业务层的代码(EmpService 及其实现类)无需进行大规模修改,提高了代码的可移植性和可维护性。
    • 方便测试和代码复用:在单元测试中,可以通过模拟 EmpMapper 接口的行为来测试业务层代码,而无需真正连接到数据库。同时,EmpMapper 接口定义的数据库操作方法可以在多个业务逻辑中复用,提高了代码的复用性。
  • 示例
    假设 EmpMapper 接口有以下定义:

public interface EmpMapper {// 查询所有员工List<Emp> selectAllEmp();// 根据员工ID查询员工Emp selectEmpById(Integer empId);// 新增员工int insertEmp(Emp emp);// 修改员工int updateEmp(Emp emp);// 删除员工int deleteEmp(Integer empId);
}

EmpMapper.xml 文件中,会有与这些方法对应的 SQL 语句定义,例如:

<select id="selectAllEmp" resultType="com.itheima.pojo.Emp">SELECT * FROM emp
</select>
<select id="selectEmpById" parameterType="int" resultType="com.itheima.pojo.Emp">SELECT * FROM emp WHERE emp_id = #{empId}
</select>
<insert id="insertEmp" parameterType="com.itheima.pojo.Emp">INSERT INTO emp (emp_name, age, gender,...) VALUES (#{empName}, #{age}, #{gender},...)
</insert>
<update id="updateEmp" parameterType="com.itheima.pojo.Emp">UPDATE emp SET emp_name = #{empName}, age = #{age}, gender = #{gender},... WHERE emp_id = #{empId}
</update>
<delete id="deleteEmp" parameterType="int">DELETE FROM emp WHERE emp_id = #{empId}
</delete>

两者区别

  • 功能职责不同EmpService 接口关注的是业务逻辑层面的操作,处理与员工相关的业务需求,如数据校验、业务规则应用等;而 EmpMapper 接口专注于数据库操作,负责从数据库中获取数据或向数据库中存储、更新、删除数据。
  • 调用层次不同EmpController 调用 EmpService 接口来处理业务请求,EmpService 接口在实现业务逻辑过程中会调用 EmpMapper 接口来完成数据库操作。即 EmpService 接口处于业务层,EmpMapper 接口处于数据访问层。
  • 依赖关系不同EmpService 接口依赖于 EmpMapper 接口,因为业务逻辑的实现往往需要对数据库进行操作;而 EmpMapper 接口不依赖于 EmpService 接口,它直接与数据库进行交互,为业务层提供数据访问服务。
  • 接口实现方式不同EmpService 接口的实现类由开发者根据业务需求编写,实现业务逻辑代码;EmpMapper 接口的实现是由 MyBatis 框架通过动态代理机制自动生成的,其具体的数据库操作逻辑由对应的 XML 映射文件中的 SQL 语句决定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94074.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94074.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94074.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【语音技术】什么是动态实体

目录 动态实体的定义和维度 1.1 动态实体的资源 1.2 生效维度 1.2.1 应用级 1.2.2 用户级 1.2.3 自定义级 2. 动态实体的上传及使用 2.1 WebAPI 2.1.1 授权认证 2.1.2 上传资源接口 2.1.2.1 参数说明 2.1.2.2 返回说明 2.1.3 查询打包状态 2.1.3.1 参数说明 2.1.…

STM32学习记录--Day3

今天了解了下I2C&#xff1a;1.I2C电路结构I2C通信示意图&#xff1a;数据传输阶段​​​​主→从模式​​&#xff08;写操作&#xff09;&#xff1a;主机控制SCL时钟&#xff08;把SCL拉低&#xff09;主机向SDA线发送数据&#xff08;每次8位1位ACK&#xff09;​​主←从模…

裂变数据看板:5个核心指标决定活动生死​

数据是裂变活动的“指南针”。本文详解曝光量、转化率、裂变系数等5大核心指标&#xff0c;结合工具与案例&#xff0c;教你用数据驱动活动优化&#xff0c;避免“自嗨式裂变”。​为什么数据是裂变的“生死线”&#xff1f;&#xff08;认知重构&#xff09; 很多企业裂变活动…

iOS 类存储 与 C# 类存储 的差异

C# 中类的代码&#xff08;包括方法、属性等成员&#xff09;的存储机制与 Objective-C 有显著差异&#xff0c;其核心依赖于 ​CLR&#xff08;公共语言运行时&#xff09;的方法表&#xff08;Method Table&#xff09;和虚拟方法表&#xff08;vtable&#xff09;机制&#…

Selenium自动化:轻松实现网页操控

selenium自动化 1 什么是 Selenium 自动化 Selenium 是一个用于 Web 应用程序测试的工具&#xff0c;支持多种浏览器&#xff08;如 Chrome、Firefox、Edge 等&#xff09;。WebDriver 是 Selenium 的核心组件&#xff0c;用于控制浏览器行为并执行自动化操作。元素定位是通过…

又开发了一个优雅的小工具!

在开源项目中&#xff0c;Issues是一个强大的功能&#xff0c;用于跟踪bug、功能请求和任务。然而&#xff0c;随着项目的发展&#xff0c;Issues可能会变得难以管理&#xff0c;特别是当你需要离线访问或进行深入分析时。 当然GitHub Issues除了上述功能以外&#xff0c;做在线…

【安装教程】Docker Desktop 安装与使用教程

文章目录一、环境要求二、安装步骤2.1 安装 WSL 2&#xff08;适用于非专业版 Windows 10 及 Windows 11&#xff09;2.2 安装 Docker Desktop2.3 汉化 DDocker Desktop2.4 卸载 Docker Desktop三、使用 Docker3.1验证安装3.2. 拉取镜像3.3. 运行容器3.4. 查看容器3.5.更改容器…

Hutool 的 WordTree(敏感词检测)

package cn.hutool.dfa;WordTree 继承自 HashMap<Character, WordTree>&#xff0c;表示一个字符到子树的映射&#xff0c;构成一颗“词树”&#xff08;类似 Trie 树&#xff09;&#xff0c;用于快速匹配字符串中的词语&#xff08;敏感词检测、关键词匹配等&#xff0…

Makefile 从入门到精通:自动化构建的艺术

引入 在软件开发的世界里&#xff0c;“编译” 是绕不开的环节&#xff0c;但手动编译大型项目时&#xff0c;重复输入编译命令的痛苦&#xff0c;相信每个开发者都深有体会。Makefile 作为自动化构建的基石&#xff0c;能让编译过程“一键完成”&#xff0c;甚至智能判断文件变…

利用DeepSeek将Rust程序的缓冲输出改写为C语言实现提高输出效率

在前面多语言测试中&#xff0c;遇到一个难以置信的问题&#xff0c;rust的输出到文件比c语言还快&#xff0c;这是不合情理的&#xff0c;通过对两者输出语句的比较&#xff0c;发现了不同。 rust程序在输出到stdout前有这么一句 let mut writer BufWriter::with_capacity(6…

Java Optional 类教程详解

一、Optional 类核心定位Optional 是 Java 8 引入的函数式容器类&#xff08;java.util.Optional&#xff09;&#xff0c;专为​​显式空值处理​​设计。其核心价值在于&#xff1a;消除 60% 以上的传统 null 检查代码通过类型系统强制空值声明&#xff0c;降低 NPE 风险支持…

Agent X MCP 把想法编译成现实

多模态GUI智能体协作型AI魔搭社区MCPMCP 硬件

cv快速input

效果<view class"miniWhether-box-lss"><view class"content-inp-text">快递单号</view><input class"content-inp-input" type"text"v-model"expressInfo.expressNo" placeholder"填写快递单号&…

[AI8051U入门第十二步]W5500-Modbus TCP从机

学习目标: 1、了解Modbus Tcp协议 2、学习Modbus Tcp 从机程序驱动 3、使用 Modbus Pull调试一、Modbus TCP介绍? Modbus TCP 是一种基于 TCP/IP 网络的工业通信协议,是 Modbus 协议家族中的一员,专门为以太网环境设计。它是 Modbus RTU(串行通信)协议的扩展,将 Modbus…

Python编程基础与实践:Python循环结构基础

循环结构 学习目标 通过本课程的学习&#xff0c;学员可以掌握Python中for循环和while循环的基本使用方法&#xff0c;了解如何利用循环结构来重复执行代码块&#xff0c;以及如何使用break和continue语句来控制循环的执行流程。 相关知识点 循环结构 学习内容 1 循环结构 1.1 …

趣谈设计模式之模板方法模式-老板,你的数字咖啡制作好了,请享用!

模板方法模式 定义了一套算法的骨架&#xff0c;讲某些具体的步骤延迟到子类中实现。 主要用于不改变算法结构的情况下重新定义算法的某些步骤&#xff0c;以适应新的需求。 模板方法的角色 抽象类&#xff1a; 作为算法的骨架&#xff0c;该抽象类中包含了算法的核心部分和…

技术栈:基于Java语言的搭子_搭子社交_圈子_圈子社交_搭子小程序_搭子APP平台

一、市场背景1、社会发展与生活方式转变城市化进程加快&#xff1a;随着城市化不断推进&#xff0c;大量人口涌入城市&#xff0c;人们生活的物理空间距离拉近了&#xff0c;但人际关系却在一定程度上变得疏离。传统的基于血缘、地缘建立起的紧密社交关系难以满足城市生活中的多…

字典在VBA与VB.NET的区别,举例说明

简述&#xff1a;在VBA中&#xff0c;字典通常使用Scripting.Dictionary对象&#xff0c;通过CreateObject("Scripting.Dictionary")创建。它需要引用Microsoft Scripting Runtime库&#xff08;scrrun.dll&#xff09;。VBA字典的方法包括Exists、Add、Remove等&…

2024年网络安全案例

以下是2024年造成严重损失的网络安全典型案例&#xff0c;涵盖市政系统、金融交易、区块链平台、国家级攻击及全球性IT故障五大领域&#xff0c;按损失规模和技术危害性综合排序&#xff1a;---一、市政基础设施攻击 1. 加拿大汉密尔顿市勒索软件事件 - 损失&#xff1a;183…

PINN+贝叶斯:深度学习中的魔改新思路

2025深度学习发论文&模型涨点之——PINN贝叶斯PINN通过将物理定律&#xff08;如偏微分方程PDEs&#xff09;嵌入神经网络的损失函数中&#xff0c;使得模型能够利用已知的物理规律来指导学习过程&#xff0c;从而在数据有限或噪声较多的情况下实现更高的准确性。然而&…