mybatis底层通过什么实现_priorityqueue java

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、概述

最近接触了一些项目,发现很多项目最开始的时候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类中去重写原方法,或者直接添加新方法。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170789.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WPF Visifire图表控件使用基础

    WPF Visifire图表控件使用基础https://www.cnblogs.com/wyuan/archive/2012/07/22/WPF.html引言:  由于项目中需要使用Visifire所以自己就写了一些demo,大家一起共享!基础Visifire图表的展示1.Visifire的创建需要引用的DLL包【WPFToolkit.dll;WPFVisifire.Charts;WPFVisifire.Gauges(这个以后会用到)】2

    2022年7月21日
    12
  • 劳动节,让我们劳动起来!

    劳动节,让我们劳动起来!

    2021年5月27日
    115
  • 【打一局王者荣耀掉星的时间,我制作了一款支持 重力感应 的 3D动态壁纸】

    【打一局王者荣耀掉星的时间,我制作了一款支持 重力感应 的 3D动态壁纸】正在兢兢业业的当一个打工仔,有一个小伙伴问我能不能用Unity制作3D动态壁纸。我一寻思应该问题不大,因为之前用Unity简单制作过一个PC端的桌面宠物,开启Unity背景穿透模式能有一个壁纸的效果。但是仔细一想在手机端也这样做的话好像不能直接套用…所以在网上搜索了一下有没有什么简单可行的方法。然后我发现Unity有一款专门用来做动态壁纸的插件:uLiveWallpaper所以本篇文章就来使用这款插件制作一款最基础的3D重力感应动态壁纸,下面一起看看如何制作吧~

    2022年5月25日
    148
  • JAX-WS手动配置实例

    JAX-WS手动配置实例随着近几年来,SOA,EAI等架构体系的日渐成熟,Webservice越来越炽手可热,尤其是在企业做异质平台整合时成为了首选的技术。Java的Webservice技术更是层出不穷,比较流行的有:  Axis2,SpringWS以及Jaxws。   本人在日常工作和以往工程中,在使用了上述这些Webservice后进行了总结,比较,最终觉得jaxws是目前最标准,需要额外第三方插件

    2022年7月15日
    15
  • web开发excel文件上传及解析(下)

    web开发excel文件上传及解析(下)

    2021年8月2日
    54
  • 怎么保存退出 vim 编辑

    怎么保存退出 vim 编辑保存命令按ESC键跳到命令模式,然后::w保存文件但不退出vim:wfile将修改另外保存到file中,不退出vim:w!强制保存,不推出vim:wq保存文件并退出vim:wq!强制保存文件,并退出vimq:不保存文件,退出vim:q!不保存文件,强制退出vim:e!放弃所有修改,从上次保存文件开始再编辑本文来自ij2155的CSDN博客…

    2022年4月29日
    69

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号