(8)MyBatis多对多查询

MyBatis多对多查询xml实现

我们以电影film和电影院cinema之间的关系为例,一部电影可以在多个影院放映,一个影院可以播放多不电影。所谓多对多关系,其实是由两个互反的一对多关系组成。即多对多关系都会通过一个中间表来建立,此处的中间表电影-影院表。电影对于电影院来说是一对多,电影院对于电影来说也是一对多。

创建model及对应的数据库表

电影实体类

public class Film {
    private Integer filmId;

    private String filmName;
    
	private String filmType;

	/**
     * 非数据库字段
     */
     private List<Cinema> cinemas;
     
	//省略constructor、getter、setter和toString
	//注意要创建无参构造方法
}

建表语句:

CREATE TABLE `t_film` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `film_name` VARCHAR(20) NULL,
  `film_type` VARCHAR(20) NULL,
  PRIMARY KEY (`id`));

电影院实体类

public class Cinema{
    private Integer cinemaId;

    private String cinemaName;
  
	/**
     * 非数据库字段
     */
     private List<Film> films;

	//省略constructor、getter、setter和toString
	//注意要创建无参构造方法
}

建表语句:

CREATE TABLE `t_cenima` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `cinema_name` VARCHAR(20) NULL,
  PRIMARY KEY (`id`));

中间表:

CREATE TABLE `t_film_cinema` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `fid` INT NULL,
  `cid` INT NULL,
  PRIMARY KEY (`id`));

dao层

package com.h3c.dao;

import com.h3c.bean.Cinema;

public interface CinemaDao {

    Cinema selectCourseFilm(Integer id);
}

mapper映射

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.h3c.dao.CinemaDao">

    <resultMap id="CinemaMap" type="cinema">
        <!--Cinema中的基本属性-->
        <id column="id" property="cinemaId"/>
        <result column="cinema_name" property="cinemaName"/>
        <!--关联属性的映射关系-->
        <collection property="films" ofType="film">
            <id column="film_id" property="filmId"/>
            <result column="film_name" property="filmName"/>
            <result column="film_type" property="filmType"/>
        </collection>
    </resultMap>
    
		<select id="selectCourseFilm" resultMap="CinemaMap">
			SELECT c.id, c.cinema_name, f.id film_id, f.film_name, f.film_type 
			from t_cinema c 
			LEFT JOIN t_film_cinema fc 
			ON c.id = fc.cid  
			LEFT JOIN t_film f 
			ON f.id = fc.fid
			WHERE c.id = #{xxx}
		</select>
</mapper>

需要注意重名字段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值