Java 如何在另一个映射器中重用MyBatis的映射器?

Java 如何在另一个映射器中重用MyBatis的映射器?,java,mybatis,Java,Mybatis,我有表event和message,它们有一对一的关系,由类表示: public class Event { private Long id; private Message message; } public class Message { private Long id; } 有两个映射器:EventMapper和MessageMapper: EventMapper通过注释选择事件并映射它们,使用getMessage选择并映射事件的消息。但是我在MessageMap

我有表event和message,它们有一对一的关系,由类表示:

public class Event {
    private Long id;
    private Message message;
}

public class Message {
    private Long id;
}
有两个映射器:EventMapper和MessageMapper:


EventMapper通过注释选择事件并映射它们,使用getMessage选择并映射事件的消息。但是我在MessageMapper中已经有了相同的方法selectById,所以可以重用它吗?

为了使用来自其他映射器的任何定义,包括语句或结果映射,您应该将映射器的命名空间完全限定名包括到该实体的标识符中

在您的示例中,假设MessageMapper位于com.company.app.mappers包中,则为:

public interface EventMapper {

    @Select("SELECT * FROM event WHERE date BETWEEN #{from} AND #{to}")
    @Results({
            @Result(property = "id", column = "id"),
            @Result(property = "message", column = "message_id",
                    javaType = Message.class,
                    one = @One(select = "com.company.app.mappers.MessageMapper.getMessage"))
    })
    List<Event> selectInInterval(@Param("from") Date from, @Param("to") Date to);
}

为什么不使用继承呢?如果消息是一种事件类型,则使其扩展该事件,并使MessageMapper扩展EventMapper。如果要区分事件和消息,EventManager不应使用getMessage。这是不同的类型,消息不扩展事件。当然,可以创建类似GetMessagable接口的东西,但显然这是一个丑陋的解决方案。但这是一个总是有信息的事件。那么,是什么阻止您像EventMapper extends MessageMapper那样在EventMapper中扩展MessageMapper,然后只使用继承的selectById函数呢?对我来说,现在听起来不是一个丑陋的解决方案。但是我们也不知道你想要达到的目标的全部范围,知道吗,这正是我想要的。
public interface EventMapper {

    @Select("SELECT * FROM event WHERE date BETWEEN #{from} AND #{to}")
    @Results({
            @Result(property = "id", column = "id"),
            @Result(property = "message", column = "message_id",
                    javaType = Message.class,
                    one = @One(select = "com.company.app.mappers.MessageMapper.getMessage"))
    })
    List<Event> selectInInterval(@Param("from") Date from, @Param("to") Date to);
}