猿问

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

我有表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,所以是有可能重新使用它?


慕盖茨4494581
浏览 146回答 1
1回答

胡说叔叔

为了使用来自其他映射器的任何定义,包括语句,或者ResultMap您应该namespace将映射器的(完全限定名称)包含到该实体的标识符中。在您的示例中,假设它MessageMapper在com.company.app.mappers包中,它将是:public interface EventMapper {&nbsp; &nbsp; @Select("SELECT * FROM event WHERE date BETWEEN #{from} AND #{to}")&nbsp; &nbsp; @Results({&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Result(property = "id", column = "id"),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Result(property = "message", column = "message_id",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; javaType = Message.class,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; one = @One(select = "com.company.app.mappers.MessageMapper.getMessage"))&nbsp; &nbsp; })&nbsp; &nbsp; List<Event> selectInInterval(@Param("from") Date from, @Param("to") Date to);}
随时随地看视频慕课网APP

相关分类

Java
我要回答