MyBatis

Mybatis关联查询

一对一关联查询

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

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

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

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

image 23

Mapper.xml

  <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单独建立数据库与对象属性的对应关系

image 25

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

一对多关联查询

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

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

image 26

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

image 29

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

image 30

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

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

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

<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>

发表评论