• mybatis通用底层的实现


    一、概述

    最近接触了一些项目,发现很多项目最开始的时候Service接口和实现类一个方法都没有,通过继承通用底层能够使用基本的增删改查操作了。这种骚操作以前听过但是着实没有亲手实现过,今天参考着自己实现一下。

    依赖关系图

    以最终我想要获得的自定义接口实现类DemoRStudentClassServicelImpl为例,以下是相关类之间的依赖关系图,不难看出,大体是分成通用的DAO层和建立在前者之上的通用的Service层两部分实现。

    二、通用DAO实现

    1.通用底层对象BaseDO

    框架定义了一个基础对象BaseDO,提供一些通用属性,和通用方法,比如创建时间,修改时间等。

    所有的对象都需要继承此类,以便在后续操作中使得定义的方法通过泛型接收对象。

    /**
     * 基础对象
     */
    public class BaseDO {
        
        private String id;
        
        private String createBy;
        
        private Date createDate;
        
        private String updateBy;
        
        private Date updateDate;
    
    }
    
    /**
     * 自定义对象
     */
    @Date
    public class DemoRStudentDO extend BaseDO{
        
        private String name;
        
        private String age;
    
    }
    

    2.通用底层IBaseDao与自定义Dao

    定义一个统一的通用底层IBaseDao接口,里面规定了一些基本的增删改查方法,通过接口泛型去规定接口下方法的返回值,这些自定义的业务对象类同样需要继承BaseDO类。

    当我们创建了一个自定义底层DemoRStudentDao的时候,我们只需要让DemoRStudentDao接口直接继承IBaseDao接口:

    /**
     * 通用Dao
     */
    @NoRepositoryBean
    public interface IBaseDao<T extends BaseDO> {
        
        T get(String id);
        
        List<T> list(Map<String, Object> map);
        
        int save(T bpmClass);
        
        int update(T bpmClass);
        
        int remove(String id);
    
    }
    
    /**
     * 自定义Dao
     */
    @Mapper
    public interface DemoRStudentDao extends IBaseDao<DemoRStudentDO> {
        //直接获得IBaseDao中的方法
    }
    

    然后就能直接获得基本的增删改查方法,其中XML文件的namespace依然直接映射到DemoRStudentDao,当有其他业务需求的时候,直接重写基本方法,或者在DemoRStudentDao中新增方法即可。

    三、通用Service实现

    1.通用服务接口IBaseService

    跟IBaseDao一样,我们为通用的服务接口规定出一些基本的增删改查方法,这些方法的返回值同样通过接口泛型指定为任意一个继承了BaseDO的对象类。

    然后自定义的service接口直接继承IBaseService,即可获得基本的增删改查方法。

    /**
     * 通用接口
     */
    public interface IBaseService<T extends BaseDO> {
        
        T get(String id);
        
        List<T> list(Map<String, Object> map);
        
        int save(T entity);
        
        int update(T entity);
        
        int remove(String id);
    
    }
    
    /**
     * 自定义接口
     */
    public interface DemoRStudentClassService extends IBaseService<DemoRStudentClassDO> {
        //直接获得IBaseService中的方法
    }
    

    2.通用实现类BaseService

    为了避免还要重复实现基本的增删改查方法,我们需要一个BaseService类去实现IBaseService中的基本方法,自定义的Service通过继承它来获得实现好的基本方法。

    因为无论如何,要操作数据就必须得有某个DAO实例,所以在BaseService接口中有一个抽象方法getDao(),这个抽象方法需要我们实现以后返回一个DAO实例,其他的方法都基于这个getDao()来获取DAO实例,有点像代理模式。

    所以BaseService是一个抽象类,接口泛型既需要指定继承了BaseDO的对象类,又需要指定继承了IBaseDAO接口的DAO实例。

    /**
     * 通用实现类
     */
    public abstract class BaseService<T extends BaseDO, K extends IBaseDao<T>> implements IBaseService<T> {
    
        /**
         * 由具体的自定义接口实现类去继承并且实现,注入操作依然放在具体的自定义实现类里
         *
         * @return K 返回一个IbaseDao的子类
         */
        protected abstract K getDao();
    
        @Override
        public T get(String id) {
            return getDao().get(id);
        }
    
        @Override
        public List<T> list(Map<String, Object> map) {
            return getDao().list(map);
        }
    
    
        @Override
        public int save(T entity) {
            entity.preInsert(String.valueOf(getUserId()));
            return getDao().save(entity);
        }
    
        @Override
        public int update(T entity) {
            entity.preUpdate(String.valueOf(getUserId()));
            return getDao().update(entity);
        }
    
        @Override
        public int remove(String id) {
            return getDao().remove(id);
        }
    
    }
    

    3.使用自定义的XXXServiceImpl

    我们现在有了通用的底层,该去自己实现一个DemoRStudentClassService去使用它们了。

    • 首先,我们新建一个Service接口,叫做DemoRStudentClassService,接口继承IBaseService,获取基本的方法。

      public interface DemoRStudentClassServiceService extends IBaseService<DemoRStudentClassDO> {}
      
    • 然后,我们新建一个实现类DemoRStudentClassServiceImpl,这个类需要实现DemoRStudentClassService,然后继承BaseService

      接口与实现类的关系

      如图所示,DemoRStudentClassService继承了IBaseService接口中的方法,DemoRStudentClassServiceImpl继承了BaseService类,而BaseService类又实现了IBaseService的方法,所以DemoRStudentClassServiceImpl只要继承BaseService就可以自动获得IBaseService的实现方法。

    • 最后,实现BaseService中的getDao()抽象方法,返回注入的DAO实例,让BaseService中的方法有dao可用。

      @Service
      public class DemoRStudentClassServiceImpl extends BaseService<DemoRStudentClassDO, DemoRStudentClassDao> implements XXXService {
          @Autowired
          private DemoRStudentClassDao dao;
      
          @Override
          protected DemoRStudentClassDao getDao() {
              return dao;
          }
      
      }
      

    到目前为止,在IBaseService中规定的方法都可以直接使用了。如果有必要,可以在自己的Dao或者ServiceImpl类中去重写原方法,或者直接添加新方法。

  • 相关阅读:
    SpringDataJPA中No serializer
    SpringDataJPA中NO Session错误
    SpringDataJpa
    SSJ集成
    Spring创建对象的4种方式
    Properties在xml中添加值
    在ubuntu上进行React-Native开发之环境搭建
    免费学外语?上这10个网站。知道一个算你牛!
    ListView circleImageView Item test
    apk瘦身 提高优化效果
  • 原文地址:https://www.cnblogs.com/Createsequence/p/13825912.html
Copyright © 2020-2023  润新知