java和mybatis - 误解一对多关系 - 仅注释

时间:2016-11-22 22:08:14

标签: java mybatis spring-mybatis

我有两张桌子:人和狗。你知道那个人可能有一只以上的狗 我的模特是:

public class {
  int personId;
  List <Dog> dogs;
  String name;
  String surname;
}
public class Dog{
   String name;
   int dogId;
}

说到数据库,它非常相似:

PersonID(PK), Name (String), surname(String)   
dogId(PK), name(String), IdOwner(FK)   

你能帮我写一下mybatis中的select吗?我试着阅读@one@many

1 个答案:

答案 0 :(得分:2)

如果您使用的是MyBatis,则reference documentation中有两个选项:

  
      
  • 嵌套选择:执行另一个返回所需复杂类型的映射SQL语句。
  •   
  • 嵌套结果:通过使用嵌套结果映射来处理重复连接结果的子集。
  •   

在您的情况下,由于您要加载多个关联,因此您必须使用嵌套选择,因为您无法使用fetch outer join加载多个关联(只是关联)提取一行)

嵌套选择

在此选项中,您应该添加对select的引用,该引用通过外键关系(在您的外键中为person)加载daya,在您的情况下为dogs的关系`ResultMap。

所以你应该有一个加载Person表的查询:

<select id="findById" resultMap="personResult">
  SELECT * FROM PERSON WHERE NAME = #{name}
</select>

其方法:

Person findById(String name); 

然后是一个按人关键关系加载狗的查询:

<select id="findDogsByPerson" resultType="Dog">
  SELECT * FROM DOG WHERE ID_PERSON = #{namePerson}
</select>

其方法:

List<Dog> findDogsByPerson(String namePerson);

然后,您必须在引用select by foreign key(findDogsByPerson)的resultmap中添加select as association。在您的情况下,有很多关联,因此您应该使用collection标记而不是association

<resultMap id="personResult" type="Person">
  <!--Other properties maps -->
  <!-- ..... -->
  <collection property="dogs" column="id_person" javaType="Dog" select="selectDogByPerson"/>
  <!-- ..... -->
</resultMap>

注释替代

如果您愿意,可以使用annotations来执行此操作。它几乎相同,但ResultMapSelect超越了方法。它会使用参考许多关系的anotation @Many

@Select("SELECT * FROM PERSON WHERE NAME = #{name}")
    @Results(value = {
          @Result(property="name", column="name"),
          @Result(property="surname", column="surname"),
          @Result(property="dogs", javaType=List.class, column="name",
                             many=@Many(select="findDogsByPerson"))})
Person findById(String name); 

@Select("SELECT * FROM DOG WHERE ID_PERSON = #{namePerson}")
@Results(value = {
          @Result(property="name", column="name"),
          @Result(property="dogId", column="dogId")})
List<Dog> findDogsByPerson(String namePerson);