起因:公司有一个产品化的项目,是使用一套自己总结的包含业务的抽象框架,根据不同的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里面也不用写了。