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
查询结果
可以发现我们要查询一部电影,却出现了两条数据,是因为类型的限制返回了两条结果,而查询中我们只需要一个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对象中
以上就是电影与分类的一对多关联了,分类的代码类似,在type中加入Listmovie字段多对多关联也就建立起来了。