如何在另一个映射器中重用 MyBatis 的映射器?
How to reuse MyBatis's mapper in another mapper?
我有表 event
和 message
,它们具有一对一的关系,由 类:
表示
public class Event {
private Long id;
private Message message;
}
public class Message {
private Long id;
}
还有两个映射器:EventMapper
和 MessageMapper
:
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 = "getMessage"))
})
List<Event> selectInInterval(@Param("from") Date from, @Param("to") Date to);
@Select("SELECT * FROM message WHERE id = #{id}")
Message getMessage(@Param("id") Long id);
}
public interface MessageMapper {
@Select("SELECT * FROM message WHERE id = #{id}")
@Results({
@Result(property = "id", column = "id"),
@Result(property = "text", column = "text")
})
List<Event> selectById(@Param("id") Long id);
}
EventMapper
selects 事件并通过注释映射它们,使用 getMessage
到 select 并映射事件的消息。但是我在 MessageMapper
中已经有相同的方法 selectById
,所以可以重用它吗?
为了使用来自其他映射器的任何定义,包括语句或 ResultMap
,您应该将映射器的 namespace
(完全限定名称)包含到该实体的标识符中。
在您的示例中,假设 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);
}
我有表 event
和 message
,它们具有一对一的关系,由 类:
public class Event {
private Long id;
private Message message;
}
public class Message {
private Long id;
}
还有两个映射器:EventMapper
和 MessageMapper
:
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 = "getMessage"))
})
List<Event> selectInInterval(@Param("from") Date from, @Param("to") Date to);
@Select("SELECT * FROM message WHERE id = #{id}")
Message getMessage(@Param("id") Long id);
}
public interface MessageMapper {
@Select("SELECT * FROM message WHERE id = #{id}")
@Results({
@Result(property = "id", column = "id"),
@Result(property = "text", column = "text")
})
List<Event> selectById(@Param("id") Long id);
}
EventMapper
selects 事件并通过注释映射它们,使用 getMessage
到 select 并映射事件的消息。但是我在 MessageMapper
中已经有相同的方法 selectById
,所以可以重用它吗?
为了使用来自其他映射器的任何定义,包括语句或 ResultMap
,您应该将映射器的 namespace
(完全限定名称)包含到该实体的标识符中。
在您的示例中,假设 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);
}