mybatis实现多对多关联查询XML实现

在开发过程中,持久层架mybatis为我们封装了SQL操作,只需要提供相应的SQL语句即可查询出结果,若结合逆向工程插件便可免去写一些简单SQL的繁琐工作,大大提高了开发效率。然而,一些复杂的SQL语句自动代码无法完成,如一对一,一对多,关联查询等。

这里我们以多对多查询为例:下面代码中一部电影可以属于多个分类,一个分类下又可以存在多部电影,这种多对多关系的SQL可以通过mybatis提供的collection标签实现。

表结构:

  • 电影表:(movie_id,电影名称,封面图片)
  • 类型表: (type_id,类型名称)
  • 电影-类型表 (id,movie_id,type_id)

PS: 在电影实体类中写一个非数据字段list 保存它所属的类型,通过后面的关联查询中注入进来

public class Movie {
    private Integer movieId;

    private String name;

    private String pic;
	/**
     * 非数据库字段
     */
     private List<Type> listType;
public class Type {
    private Integer typeId;

    private String name;

    private List<Movie> listMovie;
}

例如我们要查询movieId为1的电影信息,并查询出它所属分类,可以用连接查询把上面三个表连起来

SELECT a.`name`,c.`name` typename FROM movie a LEFT JOIN movie_type b ON a.movie_id = b.movie_id  LEFT JOIN type c ON b.type_id = c.type_id WHERE a.movie_id = 1

查询结果

hive多对多关联处理 多对多关联查询_SQL

可以发现我们要查询一部电影,却出现了两条数据,是因为类型的限制返回了两条结果,而查询中我们只需要一个movie对象,而不是一个list。如何让查询出的多个类型数据注入到一个movie对象的listType中呢,mybatis的collection标签可以帮我们实现

首先是一条连接查询SQL

<select id="getTypeList" resultMap="rm2">
		SELECT a.movie_id,b.type_id,b.movie_id,c.type_id,c.`name`  from movie a LEFT JOIN 	movie_type b  on a.movie_id = b.movie_id  LEFT JOIN type c ON b.type_id = c.type_id WHERE 	  a.movie_id = #{movieId}
	</select>

定义结果集

<!-- 关联所有分类 -->
	<resultMap type="com.yc.bean.Movie" id="rm2">
		<id column="movie_id" property="movieId" />
		<collection property="listType" ofType="com.yc.bean.Type">
			<id property="typeId" column="type_id"/>
			<result property="name" column="name"/>
		</collection>
	</resultMap>

column 数据库列名

property 对象字段名

ofType 集合全限定类名

PS:主表和从表的id标签一定要加入,这是必要连接条件

执行 moviemapper.getTypeList();可以发现list.size()为1也就是只返回了一个movie对象,并typeList已经成功注入到了movie对象中

hive多对多关联处理 多对多关联查询_SQL_02

以上就是电影与分类的一对多关联了,分类的代码类似,在type中加入Listmovie字段多对多关联也就建立起来了。