在这个项目中,EmpService
和 EmpMapper
都定义接口,是基于面向接口编程(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 语句决定。