一、前言
之前自学了Mybatis框架,但实在搞不明白这些一对多、多对多之间的关系,前段时间,自己开发了个小项目,用到mybatis,才算彻底搞明白,结合案例来说明下,在看这个之前,必须知道ResultMap。
二、一对一
当我们播放歌曲时,需要显示这首歌所对应的专辑的图片,所以我们在查询歌曲的时候,需要把它对应的专辑信息来查询出来
1. 歌曲类
public class Song {
private Integer songId;
private String songName;
private Album album;
//get、set省略
}
2. 专辑类
public class Album {
private Integer albumId;
private String albumName;
private String albumImg;//专辑封面
}
3. xml
一对一的时候,在xml文件中需要一个特殊的标签association
<select id="queryAllSong" resultMap="SongMap" >
select * from song s
left join album a on s.song_album=a.album_id
</select>
<resultMap id="SongMap" type="Song">
<result property="songId" column="song_id"/>
<result property="songName" column="song_name"/>
<association property="album" javaType="Album">
<id property="albumId" column="album_id"/>
<result property="albumName" column="album_name" />
<result property="albumImg" column="album_img" />
</association>
</resultMap>
三、 一对多
相反的,一张专辑中有多首歌曲,当我们查询一张专辑时,也应该查询出所有的歌曲
1. 歌曲类
public class Song {
private Integer songId;
private String songName;
private int songAlbumId;
}
2. 专辑类
public class Album {
private Integer albumId;
private String albumName;
private String albumImg;//专辑封面
private List<Song> songlist;
}
3. Xml
一对多的时候,需要用到这个标签collection
<select id="queryAlbum" resultMap="BaseAlbumMap">
select * from album
left join song on song_albumid=album_id
</select>
<resultMap id="BaseAlbumMap" type="Album">
<result property="albumId" column="album_id"/>
<result property="albumName" column="album_name"/>
<result property="albumImg" column="album_img"/>
<collection property="songlist" ofType="Song">
<id property="songId" column="song_id"/>
<result property="songName" column="song_name"/>
</collection>
</resultMap>
四、多对多
多对多写法和一对多的类似,但是需要关联表,例如歌单和歌曲的关系,一个歌单可以包含多首歌,同时一首歌可以在多个歌单里。
1. 歌曲表
public class Song {
private Integer songId;
private String songName;
}
2. 歌单表
public class Lists {
private Integer listId;
private String listTitle;
private List<Song> songlist;
}
3. 关联表(可以不创类,光用表就行)
public class SongList {
private Integer songListId;
private Integer songListSongId; //歌曲Id
private Integer songListListId; //歌单Id
}
4. xml
查询歌单时,带出歌单的所有歌曲
<select id="queryListById" resultMap="BaseMap">
select * from lists
left join songlist on list_id=songlist_listid
left join song on song_id = songlist_songid
where list_id = #{listId}
</select>
<resultMap id="BaseMap" type="Lists">
<result property="listId" column="list_id"/>
<result property="listName" column="list_name"/>
<result property="listImg" column="list_img"/>
<collection property="songlist" ofType="Song">
<id property="songId" column="song_id"/>
<result property="songName" column="song_name"/>
</collection>
</resultMap>