java - 如何在另一个mapper中复用MyBatis的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
选择事件并通过注释映射它们,getMessage
用于选择和映射事件的消息。但是我已经有相同的方法selectById
了MessageMapper
,可以重复使用吗?
解决方案
为了使用来自其他映射器的任何定义,包括语句,或者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);
}
推荐阅读
- android - 如何将 Android 库发布到 Maven 存储库以便轻松使用?
- sql - 即使未指定,也会添加“ORDER BY”子句
- nativescript - 如何检测滚动视图是否停止以 nativescript 角度滚动?
- c# - 如何通过将参数传递到 Web URI 从另一个应用程序调用 WebAPI
- r - R:模型拟合后如何得到误差的协方差矩阵
- html - 当用户在同一页面 css 中时,如何使边框变为红色
- html - 裁剪图像以填充具有相对于宽度的高度的父级
- css - 有没有比我写的更简洁的方法来获得具有一定不透明度的背景图像然后产生悬停效果?
- c++ - 读取txt文件中的一些数据并将其传递给字符串数组
- python-3.x - 我们如何过滤索引值以'x'结尾的pandas数据帧中的行