使用mybatis的继承机制

2018/02/08

Tags: java

起因:公司有一个产品化的项目,是使用一套自己总结的包含业务的抽象框架,根据不同的OEM厂商实现不同的provider。

在修改一个需求的时候,要求在原有的功能上进行修改,以实现个性化需求。现状如下: mapper类

public interface VinDao extends DaoMapper {
	
	T_Vin load(DaoParamWrapper wrapper);

	List<T_Vin_Mapping> loadVinMappings(DaoParamWrapper wrapper);

}

mapper xml

<select id="loadPartCodesByVin" resultType="...">
       do something...
    </select>

    <select id="load" resultType="...">
       do something...
    </select>

要求:loadVinMappings的实现不变,load的实现需要改变。同时还要增加2个方法,是这个oem独有的,不能写在公用的mapperDao里面。

解决

第一反应:这还不简单,直接复制一份嘛 问题:工作量太大了。其实也不大,就是感觉做java肯定要想尽办法做到复用。

下一个方案:分开写,各自实现各自的。 问题:有公用的方法,如果分离成两个mapper的话也不行,因为框架既定,这个mapper就是做这两件事的。随意改动的话其他地方也要跟着改。

最终方案:使用mybatis的继承机制。参考文章

解决后的代码: mapper类

public interface OEMVinDao extends VinDao {

    Set<String> loadPartCodesByVin(String vin);

    @Override
    T_Vin load(DaoParamWrapper wrapper);

    List<T_OEM_Vin> loadByBottom(DaoParamWrapper wrapper);

}

mapper xml

<select id="loadPartCodesByVin" resultType="...">
       do something...
    </select>

    <select id="load" resultType="...">
       do something...
    </select>

<select id="loadByBottom" resultType="...">
       do something...
    </select>

此时oem继承了公用的VinDao,其中未实现的方法loadVinMappings直接继承了父类的实现。xml里面也不用写了。