我有两张桌子:人和狗。你知道那个人可能有一只以上的狗 我的模特是:
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
。
答案 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
来执行此操作。它几乎相同,但ResultMap
和Select
超越了方法。它会使用参考许多关系的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);