熟悉 mybatis-plus 的人都知道,mybatis-plus 提供两种包含预定义增删改查操作的接口:
Mybatis-plus提供了2个接口1个类:
BaseMapper
接口针对dao层的方法封装 CRUDIService
接口针对业务逻辑层的封装 需要指定Dao层类和对应的实体类 是在BaseMapper基础上的加强ServiceImpl, T>
类针对业务逻辑层的实现两者提供的方法略有不同:
对比这两个接口,操作都差不多,名字有一点点改变,比如 BaseMapper 里面叫 insert()
的方法,在 IService 里面叫 save()
。
再有就是 IService 提供批处理操作,BaseMapper 没有。
除此之外还有就是 IService 依赖于 Spring 容器,而 BaseMapper 不依赖。
所以,如果你既要使用批处理操作,又要添加自己的数据库操作,那就必须两个接口一起用。
下面让我们看一下继承结构:
🔔重要: 既然ServiceImpl类也实现了IService接口,那么如果我的UserServiceImpl直接继承ServiceImpl类不就行了吗?为何还要自定义一个继承了IService接口的IUserService接口?这是因为Spring自动注入要求是以接口为标准,在Controller里注入的Service要是一个接口才符合Spring的规范(当然你注入类也行)!
再来看看ServiceImpl类的源代码:
/** * IService 实现类( 泛型:M 是 mapper 对象,T 是实体 ) * * @author hubin * @since 2018-06-23 */ @SuppressWarnings("unchecked") public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> { protected Log log = LogFactory.getLog(getClass()); @Autowired protected M baseMapper; @Override public M getBaseMapper() { return baseMapper; } protected Class<T> entityClass = currentModelClass(); @Override public Class<T> getEntityClass() { return entityClass; } protected Class<M> mapperClass = currentMapperClass(); ...... }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
里面依赖Spring容器给自动注入了baseMapper
下面我们对比一下BaseMapper
和 IService
两个接口的方法。
总结:
BaseMapper 针对dao层的方法封装 CRUD
IService 针对业务逻辑层的封装,需要指定Dao层类和对应的实体类,是在BaseMapper基础上的加强
ServiceImpl 针对业务逻辑层的实现
一般典型的使用例子中,自己的${Entity}ServiceImpl
类继承自ServiceImpl类,并实例化BaseMapper的子类${Entity}Mapper
和持久化${Entity}
类,实现自定义的$I{Entity}Service
接口(继承IService接口),在${Entity}ServiceImpl
类实现CRUD的增删改查功能,并重写在I${Entity}Service
接口定义的方法
例如:
public interface IMyEntityService extends IService<MyEntity> {
public List<MyEntity> selectAllList();
public Future<Boolean> updateBaseInfo(MyEntity cgr);
}
@Service
public class MyEntityImpl extends ServiceImpl<MyEntityMapper,MyEntity> implements MyEntityService {
@Autowired
private GetResponse getResponse;
@Override
public List<MyEntity> selectAllList() {
return this.baseMapper.selectAllList();
}
@Override
public Future<Boolean> updateBaseInfo(MyEntity cgr) {
String ztmc=cgr.getZzmc();
log.info("当前正在处理的采购人是|{}",ztmc );
try{
String legalname =getResponse.getBaseInfo(ztmc).get(0).getData().get(0).getLegalName();
String socialcode= getResponse.getBaseInfo(ztmc).get(0).getData().get(0).getSocialCode();
cgr.setFrmc(legalname);
cgr.setXydm(socialcode);
}catch (Exception ex){
log.error("法人或者信用代码有空{}",ex.getMessage());
}finally {
log.info("任务进行中,线程池剩余任务数量为|{}", CustomMultiThreadingConfig.executor.getThreadPoolExecutor().getQueue().size());
int result = this.baseMapper.updateBaseInfo(cgr);
return AsyncResult.forValue(result>0);
}
}
}
自定义的IMyEntityService接口里面可以自定义一些针对自己业务封装的一些方法
<<<<<<<<<<<< ⌛ >>>>>>>>>>>>