簡體   English   中英

如何使用擴展父映射器的子映射器方法

[英]how to use a child mapper method which extends a parent mapper

我試圖通過靈活的情況調用子映射器方法但是在這種情況下,我們不知道會調用哪個方法,即使它擴展了父映射器。 【帶有mybatis的spring boot框架】

// ParentMapper
public interface ParentMapper
{
    // List<Map<String, String> findAll();
}

// Child1Mapper
public interface Child1Mapper extends ParentMapper
{
    List<Map<String, String> findAll();
}

// Child2Mapper
public interface Child2Mapper extends ParentMapper{
    List<Map<String, String> findAll();
}



@Autowired
Child1Mapper child1Mapper;

@Autowired
Child2Mapper child2Mapper;

// some class file
public ParentMapper getMapper(String param){
    switch(param){
        case "case1" : child1Mapper;
        case "case2" : child2Mapper;
        ... 10 more..
    }
}



public class example{
    public void somethid(){
        // this logic is in some biz
        ParentMapper mapper = getMapper("case1");  // <----`-` we do not know where `findAll method` located is in
        mapper.findAll();
    }
}

如何調用子映射器方法

它在代碼中很清楚,如果您將case1傳遞給getMapper(String param)方法,它將返回return new Child1Mapper() child1mapper 對象,因此如果您調用findAll()方法,則將調用child1mapper類的findAll()方法

如果你通過case2那么你會得到child2mapper對象(which is like Parentmapper p = new Child2Mapper())所以如果你調用findAll()方法(p.findAll()) child2mapper findAll()方法將被調用

child1mapperchild2maper都是的子類parentmapper但沒有關系,船舶child1mapperchild2mapper所以沒有方法沖突的概念

你所做的一切都很好。

提供:您在這里指的是實際的實現類而不是接口

case "case1" : return new Child1Mapper();
case "case2" : return new Child2Mapper();

有趣的是:您剛剛在這里實現了一個設計模式。 您的getMapper方法代表Factory Method Pattern 根據需要,這些類型的方法絕對有效。

關於Factory Method Pattern更多信息: https : //www.tutorialspoint.com/design_pattern/factory_pattern.htm

TLDR:你缺少的方法簽名ParentMapper

public interface ParentMapper
{
    List<Map<String, String>> findAll();
}

您需要為任何想要實現ParentMapper接口的類指定共享方法簽名。 接口是實現的契約。

這將要求 Child1Mapper 和 Child2Mapper 提供該簽名的實現細節。

public interface ParentMapper
{
    List<Map<String, String>> findAll();
}

// Child1Mapper
public class Child1Mapper implements ParentMapper
{
    public List<Map<String, String>> findAll() { /* implementation */ }
}

// Child2Mapper
public class Child2Mapper implements ParentMapper{
    public List<Map<String, String>> findAll() { /* implementation */ }
}

ParentMapper mapper = getMapper("child1"); mapper.findAll() ParentMapper mapper = getMapper("child1"); mapper.findAll()將使用Child1Mapper實例的實現。

考慮到您使用的是 Spring,您也可以調整工廠方法以返回 Spring Bean。 例如:(這將取決於您如何連接彈簧豆)

@Bean
Child1MapperBean() { return new Child1Mapper() }
@Bean
Child2MapperBean() { return new Child2Mapper() }

public ParentMapper getMapper(String param){
    switch(param){
       case "case1" : return Child1MapperBean();
       case "case2" : return Child2MapperBean();
    }
}

我剛剛想通了......如果ParentMapper,ChildMappers 有相同的方法。 它運作良好。

或者我們可以考慮反射......像這樣。

Mapper mapper = getMapperClass(name);
Method method = mapper.getClass().getMethod(mapperQueryId, Map.class);
return (List<Map<String, Object>>) method.invoke(mapper, params);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM