一对一关联查询
A表的一条数据,对应B表的一条数据;B表的一条数据,对应A表的一条数据。
创建两个表就可以,设置A表的外码是B表的主码
由于查询两个表,最后返回的是进行笛卡尔积后的结果,我们需要创建一个新类包含这两个表里的属性,通常来讲这个类叫***Business。
在这个Business类中写属性较少的类,并创建setter,getter和toString方法。
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单独建立数据库与对象属性的对应关系
Java类作为属性时,要使用association。
一对多关联查询
一对多查询,就是A表中查询到B表中的多个选项
创建一个class类,表示班级包含很多人
这里需要注意,构造方法中不能写ArratList,像下面这样写就会导致类型不匹配
但是将ArrayList从构造方法中去除,结果就正常
这个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>