提出问题:如何查询出所有学生以及学生对应的老师信息
第一种解决办法:按照查询嵌套处理
思路:
1,先查询出所有学生信息。
2,再通过查询出来的学生信息的tid,寻找对应的老师信息。
先写学生接口
public interface StudentMapper {
//查询所有学生以及对应的老师信息
List<Student> getStudent();
}
学生接口配置文件中,先执行所有信息的查询,老师同理
<select id="getStudent" resultMap="Student">
select * from student
</select>
<select id="getTeacher" resultType="Teacher">
select * from teacher where id=#{id}
</select>
这个时候student执行查询的结果,老师信息会为null
于是采用结果集映射的方法解决:
<select id="getStudent" resultMap="StudentTeacher">
select * from student
</select>
<resultMap id="StudentTeacher" type="Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!-- 复杂的属性需要单独处理
如果是复杂的对象,就用association
如果是集合,就用:collection
-->
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="Teacher">
select * from teacher where id=#{id}
</select>
学生表中的字段id,name是能够对应到实体类中的。但是tid对应的是一个类对象teacher,所以用到association映射,对应到数据库中的tid.
要注意的是,在association标签中,还需要加上javaType的属性(需要映射的是teacher对象,所以上面的JavaType为Teacher类)和查询老师信息的执行语句。
执行查询:能够将老师信息查询出来
第二种解决办法:按照结果嵌套处理
先将连表查询的sql语句写出来
select s.id sid,s.name sname,t.name tname from student s,teacher,t where s.tid = t.id
在student,teacher这两张表中,当学生表中的tid等于老师表中的id相等时,查询出学生id,学生姓名,学生关联的老师的名字。
<select id="getStudent2" resultMap="StudentTeacher2">
select s.id sid,s.name sname,t.name tname
from student s,teacher t
where s.tid = t.id;
</select>
<resultMap id="StudentTeacher2" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
最上面的select查询语句查询出来了tname,即老师的名字,然后通过ResultMap将Teacher实体类中的name字段映射到Student中。