Blog of CodeJELLOW’S ENGINEERING NOTES
← 返回文章

Mybatis关联查询

一对一关联查询 A表的一条数据,对应B表的一条数据;B表的一条数据,对应A表的一条数据。 创建两个表就可以,设置A表的外码是B表的主码 由于查询两个表,最后返回的是进行笛卡尔积后的结果,我们需要创建一个新类包含这两个表里的属性,通常来讲这个类叫***Busin…

本文目录 ⌄

    一对一关联查询

    A表的一条数据,对应B表的一条数据;B表的一条数据,对应A表的一条数据。

    创建两个表就可以,设置A表的外码是B表的主码

    由于查询两个表,最后返回的是进行笛卡尔积后的结果,我们需要创建一个新类包含这两个表里的属性,通常来讲这个类叫***Business。

    在这个Business类中写属性较少的类,并创建setter,getter和toString方法。

    Mapper.xml

    TEXT
      <select id="queryMoneyByName" resultType="java.lang.Integer">
            select person_card.money from person,person_card where person.name=# 
           {name} and person.card_id = person_card.card_id
    </select>

    使用resultMap返回结果,主要思想为。result单独建立数据库与对象属性的对应关系

    Java类作为属性时,要使用association。

    一对多关联查询

    一对多查询,就是A表中查询到B表中的多个选项

    创建一个class类,表示班级包含很多人

    这里需要注意,构造方法中不能写ArratList,像下面这样写就会导致类型不匹配

    但是将ArrayList从构造方法中去除,结果就正常

    这个bug我找了一天也没发现原因。经过很长时间的排除和查找,原因是mybatis会调用无参的构造方法来创建实例,通过这个实例映射关系。但Java的语法中,如果没有定义有参构造方法,系统会自动创建无参的构造方法,如果写了有参的构造方法系统将不会创建无参构造方法。在上图里我创建了有参的构造方法,但没写<constructor>标签,所以mybatis会按照数据库顺序给构造方法赋值,类型不匹配时出现bug。

    解决方法去除掉这个类型不匹配的参数或者添加无参构造方法即可。

    当一对多关系时,使用collection标签。

    TEXT
    <select id="queryAllClassAndPeople" resultMap="class_people_map">
            select * from class,person where  class.class_id=person.class and class.class_id=#{id}
        </select>
    
        <resultMap id="class_people_map" type="Classes">
            <id property="classId" column="class_id"/>
            <result property="className" column="class_name"/>
            <collection property="people" ofType="Person" >
                <id property="id" column="id"/>
                <result property="age" column="age"/>
                <result property="name" column="name"/>
            </collection>
        </resultMap>

    通过 RSS 订阅更新 →