多表关联查询两种方法

Posted 捡黄金的少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多表关联查询两种方法相关的知识,希望对你有一定的参考价值。

简单总结一下,方便以后查看

A表(mxg_category)

 B表(mxg_label)

 B表的category_id 关联A表的ID

方法一

1、Mapper的接口如下

  List<Category> findCategoryAddLabel();

2、因为A表查询出来要对应多条B表的数据,所以要在A的实体类中添加B的list集合

*
     * @author jiangHaoJie
     * @since 2021-12-08
     * 一个分类可以对应多个标签
     */

    @ApiModelProperty(value = "标签表集合")
    @TableField(exist = false)
    private List<Label> labelList;

3、mapper.xml如下

采用left join   On的方式将两个表连接起来,
 column="label_id" 对应的是数据库查询的字段

 property="id"对应的是实体类的字段

ofType="Label"表示实体类所在的地址,因为application.yml中已经配置了mapper路径,所以只用写类名就可以了

 <select id="findCategoryAddLabel" resultMap="categoryLabelMap">
        SELECT
            m1.id,
            m1.`name`,
            m2.id label_id,
            m2.`name` label_name
        FROM
            mxg_category m1
        LEFT JOIN mxg_label m2 ON m1.id = m2.category_id
        WHERE m1.`status`=1
    </select>
    <resultMap id="categoryLabelMap" type="Category">
        <id column="id" property="id"></id>
        <result column="name" property="name"></result>

        <collection property="labelList" javaType="List" ofType="Label">
            <id column="label_id" property="id"></id>
            <result column="label_name" property="name"></result>
        </collection>
    </resultMap>

方法二

1、mapper的接口如下


    List<Category> findCategoryAddLabel2();

2、mapper.xml 如下

区别是下面collection 中绑定了一个通过Id查询集合的方法

注意resultmap中一定要加上 <id column="id" property="id"></id>,不然主表ID无数据

    <select id="findCategoryAddLabel2" resultMap="categoryLabelMap2">
        SELECT
             id,
             `name`
        FROM  mxg_category
    </select>
    <resultMap  id="categoryLabelMap2" type="Category">
        <id column="id" property="id"></id>
        <result column="name" property="name"></result>
        <collection property="labelList" javaType="List"
                    ofType="Label" column="id"
                    select="com.jhj.blog.article.mapper.LabelMapper.labelListByCategoryId"
        >
        </collection>
    </resultMap>

3、绑定的labelListByCategoryId方法,如下

/**
     * 测试一个文章多个标签的联表查询
     */
    List<Label> labelListByCategoryId(@Param("id") String id);

4、实现的XML如下

 <select id="labelListByCategoryId" resultType="Label">
    select * from mxg_label where category_id=#id
 </select>

方法一和方法二实现的效果一样

只不过方法二延展性更强

以上是关于多表关联查询两种方法的主要内容,如果未能解决你的问题,请参考以下文章

Caml 多表关联查询

MyBatis关于多表联查 关联关系之一--------一对多(单条sql语句查询)

sql 多表关联查询

多表查询(章节摘要)

Django表关联对象及多表查询

sql mysql多表如何关联查询