使用myBatis

时间:2017-10-19 16:46:53

标签: java mybatis one-to-one spring-mybatis

我尝试使用MyBatis从数据库对象获取,该对象具有另一个对象作为字段。像这样:

public class Worker {
  private int id;
  private String firstName;
  private String lastName;

  private Bank bank;   
}

public class Bank  {
  private int id;
  private String name;
}

可以看出,这里应该是一对一的关系。 目前我发现只有两个解决方案:

1)参考银行sql将@Result注释添加到WorkerMapper,如下所示:

public interface WorkerMapper {
  @Results({
    @Result(column = "id",          property = "id"),
    @Result(column = "first_name",  property = "firstName"),
    @Result(column = "last_name",   property = "lastName"),
    @Result(property="bank", javaType=Bank.class, column="id", many=@Many(select="getBank"))
  })
  @Select("worker select")
  Worker get(int id);

  @Select("bank select")
  Bank getBank(int id);
)

但是,如果我理解正确,如果我这样做,我需要为银行和工人执行两个查询^。这对BD来说不是很好

2)我可以用“内连接”编写sql查询,创建一些“RowAdapter”类,其中包含所有查询字段。从数据库中获取后,我将解析我的必要对象。 这个解决方案比两个查询要好,但是有必要编写很多代码。

在MyBatis中是否有一个更优雅的解决方案是通过一个带有“内连接”的sql查询来获取两个对象(理想的使用注释)?

1 个答案:

答案 0 :(得分:0)

请注意,使用@Many涉及Worker类具有Collection<Bank>属性。在您的情况下,您必须使用@One

引用API documentation

  

@One:映射到复杂类型的单个属性值。   属性:select,是映射的完全限定名称   可以加载实例的语句(即mapper方法)   适当的类型,

多个查询的潜在兴趣是lazyLoading及时获得银行日期。

  

fetchType,取代全局配置参数   lazyLoadingEnabled用于此映射。

这实际上取决于你的要求。

  • 如果仅限于按ID选择worker,则选择bank by id, 2个简单查询和单个查询之间没有太大区别 加入查询。

  • 如果选择所有工人(比如100万),则选择100万 可以发行精选银行。如果懒惰,JOIN查询可能更好 加载不是一种选择。

无论如何,

  

注意您会注意到不支持通过连接映射   注释API。这是由于Java Annotations的限制   这不允许循环引用。

然后JOIN查询需要在XML中定义结果映射。使用自动映射,以下应该足够了:

<resultMap id ="workerResultMap" type="Worker">
  <association property="bank" resultMap="bankResultMap"/>
</resultMap>
<resultMap id ="bankResultMap" type="Bank">
</resultMap>