Java 如何使用扩展父映射器的子映射器方法
我试图通过一个灵活的案例调用child mapper方法 但在这种情况下,我们不知道将调用哪个方法,即使它扩展了父映射器。[带mybatis的spring启动框架]Java 如何使用扩展父映射器的子映射器方法,java,spring-boot,mapper,Java,Spring Boot,Mapper,我试图通过一个灵活的案例调用child mapper方法 但在这种情况下,我们不知道将调用哪个方法,即使它扩展了父映射器。[带mybatis的spring启动框架] // ParentMapper public interface ParentMapper { // List<Map<String, String> findAll(); } // Child1Mapper public interface Child1Mapper extends ParentMapp
// 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)
方法,它将返回returnnewchild1mapper()
Child1Mapper对象,那么如果调用findAll()
方法,则将调用Child1Mapper
classfindAll()
方法
如果您通过了case2
,那么您将得到child2mapper
对象(这类似于Parentmapper p=new child2mapper())
,因此如果您调用findAll()
方法(p.findAll())
child2mapperfindAll()
方法将被调用
child1mapper
和child2mapper
都是parentmapper
的子类,但是child1mapper
和child2mapper
之间没有关系,因此没有方法冲突的概念无论你做什么都是绝对正确的
提供了:这里指的是实际的实现类,而不是接口
有兴趣知道:
您刚刚在这里实现了一个设计模式。
您的getMapper
方法表示Factory方法模式
。根据需要,这些类型的方法是绝对有效的
有关工厂方法模式的详细信息
:TLDR:ParentMapper中缺少方法签名
public interface ParentMapper
{
List<Map<String, String>> findAll();
}
ParentMapper mapper=getMapper(“child1”);mapper.findAll()将使用Child1Mapper
实例的实现
考虑到您正在使用Spring,您也可以调整出厂方法以返回SpringBean
我刚刚发现。。。。
如果ParentMapper和childmapper使用相同的方法,那么效果会很好
或者我们可以考虑反射……像这样
Mapper mapper = getMapperClass(name);
Method method = mapper.getClass().getMethod(mapperQueryId, Map.class);
return (List<Map<String, Object>>) method.invoke(mapper, params);
Mapper-Mapper=getMapperClass(名称);
方法Method=mapper.getClass().getMethod(mapperQueryId,Map.class);
return(List)method.invoke(mapper,params);
是这称为运行时多态性
这是具有子对象的父引用,请检查此项(检查银行示例)谢谢您提供的信息。是的,您的案例我们可以使用Factory方法模式,然后我可以使用finAll方法,但此案例ParentMapper接口没有findAll方法。具体来说,此代码正在使用mybatis的spring boot framework上工作@김승갑 这是一个基本的面向对象特性。接口只是定义,您的子类将提供实际的实现。
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 */ }
}
@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();
}
}
Mapper mapper = getMapperClass(name);
Method method = mapper.getClass().getMethod(mapperQueryId, Map.class);
return (List<Map<String, Object>>) method.invoke(mapper, params);