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

2 java mybatis spring-mybatis

我有两个表:人和狗。您知道这个人可能拥有不止一只狗。
我的模型是:

public class {
  int personId;
  List <Dog> dogs;
  String name;
  String surname;
}
public class Dog{
   String name;
   int dogId;
}
Run Code Online (Sandbox Code Playgroud)

当谈到数据库时,它非常相似:

PersonID(PK), Name (String), surname(String)   
dogId(PK), name(String), IdOwner(FK)   
Run Code Online (Sandbox Code Playgroud)

你能帮我在mybatis中写select吗?我尝试阅读有关@one和 的内容@many

Pau*_*Pau 5

如果您正在使用,则参考文档MyBatis中描述了两个选项

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

在您的情况下,当您想要加载多个关联时,您必须使用Nested Select,因为您无法使用fetch outer join(仅与获取的一行关联)

\n\n

嵌套选择

\n\n

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

\n\n

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

\n\n
<select id="findById" resultMap="personResult">\n  SELECT * FROM PERSON WHERE NAME = #{name}\n</select>\n
Run Code Online (Sandbox Code Playgroud)\n\n

其方法:

\n\n
Person findById(String name); \n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
<select id="findDogsByPerson" resultType="Dog">\n  SELECT * FROM DOG WHERE ID_PERSON = #{namePerson}\n</select>\n
Run Code Online (Sandbox Code Playgroud)\n\n

及其方法:

\n\n
List<Dog> findDogsByPerson(String namePerson);\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,您必须将选择添加为结果映射中的关联,引用通过外键 ( findDogsByPerson) 进行的选择。在您的情况下,有很多关联,因此您应该使用collection标签而不是association

\n\n
<resultMap id="personResult" type="Person">\n  <!--Other properties maps -->\n  <!-- ..... -->\n  <collection property="dogs" column="id_person" javaType="Dog" select="selectDogByPerson"/>\n  <!-- ..... -->\n</resultMap>\n
Run Code Online (Sandbox Code Playgroud)\n\n

注释替代方案

\n\n

如果你愿意,你可以用annotations它来做。它几乎是相同的,但是 和ResultMap高于Select方法。@Many它将使用引用许多关系的注释。

\n\n
@Select("SELECT * FROM PERSON WHERE NAME = #{name}")\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0@Results(value = {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0@Result(property="name", column="name"),\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0@Result(property="surname", column="surname"),\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0@Result(property="dogs", javaType=List.class, column="name",\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0many=@Many(select="findDogsByPerson"))})\nPerson findById(String name); \n\n@Select("SELECT * FROM DOG WHERE ID_PERSON = #{namePerson}")\n@Results(value = {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0@Result(property="name", column="name"),\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0@Result(property="dogId", column="dogId")})\nList<Dog> findDogsByPerson(String namePerson);\n
Run Code Online (Sandbox Code Playgroud)\n