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

时间:2018-08-17 02:10:51

标签: java spring-boot 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();
    }
}

如何调用子映射器方法

4 个答案:

答案 0 :(得分:1)

如果您将case1传递给getMapper(String param)方法,这在代码中很明显,它将返回return new Child1Mapper() child1mapper对象,因此,如果您调用findAll()方法,则child1mapperfindAll()方法将被调用

如果通过case2,则将获得child2mapper对象(which is like Parentmapper p = new Child2Mapper()),因此,如果调用findAll()方法(p.findAll()) child2mapper findAll()方法将被调用

child1mapperchild2maper都是parentmapper的子类,但是child1mapperchild2mapper之间没有关系,因此没有方法冲突的概念

答案 1 :(得分:0)

无论您做什么都绝对可以。

提供 :您指的是实际的实现类,而不是此处的接口

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

答案 2 :(得分:0)

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()将使用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();
    }
}

答案 3 :(得分:0)

我刚刚想通了... 如果使用ParentMapper,则ChildMappers具有相同的方法。效果很好。

或者我们可以考虑这样思考。

.Exclude()