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>
需要注意重名字段