Mybatis的一对一、一对多以及多对多

一、前言

之前自学了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>
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值