在后端开发中使用到mybatis-plus时,会发现在其内部存在着两种数据库操作接口,Iservice和BaseMapper,如果只是用增删改查,会发现除了方法名称不同外,两者的功能是一致的。那如何在开发中进行合理的选择?
首先应该知道的是,mybatis-plus 提供两种包含预定义增删改查操作的接口和一个类:
其中,BaseMapper 接口和IService<T> 接口有以下差异:
Mapper简化了单表的sql操作步骤(CRUD),而Serivce实现的了更加丰富的CRUD,加入了很多批处理功能。但是必须依赖Mapper,因此需要编写Mapper接口。
/**
* 订单 服务类
*/
public interface IOrderService extends IService<Order> {
// 无需编写任何方法,继承 IService 即可使用通用的 CRUD 方法
}
IOrderService 接口扩展了 MyBatis-Plus 提供的 IService<Order> 接口,表示它定义了与 Order 实体相关的业务逻辑方法。IService<Order> 接口是 MyBatis-Plus 的一部分,提供了一组通用的服务方法,包括常见的 CRUD(创建、读取、更新、删除)操作。
/**
* 订单 Mapper 接口
*/
public interface OrderMapper extends BaseMapper<Order> {
// 无需编写任何方法,继承 BaseMapper 即可使用通用的 CRUD 方法
}
OrderMapper 接口继承了 MyBatis-Plus 提供的 BaseMapper<Order> 接口,这意味着它会继承一系列通用的数据库操作方法,包括常见的查询、插入、更新、删除等 CRUD 操作。这样的设计遵循了 MyBatis-Plus 的规范,使得开发者无需手动实现这些通用的数据库操作,而是可以直接在 OrderMapper 接口中使用这些方法。
M 是mapper对象,T 是实体
ServiceImpl 是 MyBatis-Plus 提供的通用 Service 实现类。它已经实现了 IService 接口,包含了通用的 CRUD 方法的实现。在你的业务 Service 实现类中,可以直接继承 ServiceImpl,从而获得这些通用的数据库操作方法。
/**
* 订单 服务实现类
*/
@Service
@RequiredArgsConstructor
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order>
implements IOrderService {
// 无需额外编写方法,继承 ServiceImpl 即可使用通用的 CRUD 方法
}
OrderServiceImpl 是 IOrderService 接口的实现类,通过继承 ServiceImpl<OrderMapper, Order>,该类直接继承了 MyBatis-Plus 提供的默认 Service 实现,并指定了泛型参数为 OrderMapper 和 Order。因此,OrderServiceImpl 中无需额外编写方法,即可直接使用 ServiceImpl 中提供的通用的 CRUD 方法。
再根据项目看一下对应的继承关系图
既然ServiceImpl类也实现了IService接口,那么如果UserServiceImpl直接继承ServiceImpl类不就行了吗?为何还要自定义一个继承了IService接口的IUserService接口?
这是因为Spring自动注入要求是以接口为标准,在Controller里注入的Service要是一个接口才符合Spring的规范(当然注入类也行)!
在项目的一般开发流程中,先定义Mapper接口和对应的XML文件实现对数据库的操作,然后在Service层中注入Mapper接口的实例,并调用Mapper的方法来实现业务逻辑,提供更高层次的抽象和封装。
因此在项目开发中,通常会同时使用 Mapper 和 IService,将数据访问层和业务逻辑层分离。Mapper 用于处理底层数据库访问,而 IService 用于封装业务逻辑。这种组合使用的方式能够更好地利用 MyBatis-Plus 提供的功能,使代码结构更清晰,同时也便于单元测试和维护。
IService简直是BaseMapper的大扩充,不但包含了所有基本方法,还加入了很多批处理功能。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。