是这样的,首先学生表中有三个属性,前两个属性要出现在结果集中,第三个属性哦用于查找教师的名字,然后呢,用resultMap重新处理,将老师的名字重新对应为学生表的第三个属性。其实这样做有局限
多对一查询
SQL语句
SELECT s.id ,s.name,t.name from student s ,teacher t WHERE s.tid=t.id
public List<Student> getStudent();
实现接口类
配置Mapper文件
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace命名空间:与那个接口类文件产生交集,相当于实现那个接口-->
<mapper namespace="com.kuang.dao.StudentMapper">
<!-- 思路
1.查询所有的学生
2.根据查询出来的学生的tid,寻找对应的老师!
-->
<select id="getStudent" resultMap="StudentTeacher">
select * from student
</select>
<resultMap id="StudentTeacher" type="Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!-- result只能针对单个属性,复杂的对象用不了-->
<!-- 这是多对一的处理方式 多个学生对一个老师
如果是返回的一个对象就用association
返回的是一个集合就用collection
-->
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="Teacher">
select * from teacher where id=#{id}
</select>
</mapper>
实现原理就是 嵌套子查询
@Test
public void getStudent(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> student = mapper.getStudent();
for (Student a : student) {
System.out.println(a);
}
sqlSession.close();
}
只有一个参数时自动匹配,无论写啥都行
注意
第二种方法:结果嵌套处理
2。此处查询后输出3个字段,有两个字段基本同名,取别名区分
取别名可以不用AS
讲实话,真的要写的话,还是第一种更加适用,第二种只适合查询少量列的情况
即使只是写了三个查询都感觉到了这种方式过于麻烦了
其实:我自己的理解:
结果集嵌套就是 用SQL查出来的结果 通过resultMap 用别名 association 映射到 对象的属性里 通过输出对象,对象的属性也一一输出出来。
//第二种方法,结果嵌套实现
public List<Student> getStudent2();
<!--方法2 通过结果嵌套-->
<select id="getStudent2" resultMap="StudentTeacher2">
SELECT s.id sid,s.name sname,t.id thid,t.name tname from student s ,teacher t WHERE s.tid=t.id
</select>
<!-- 由于Student类里有个属性是Teacher类的对象 所以与数据库的名字不一致,所以要使用结果集 -->
<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"/>
<result property="id" column="thid"/>
</association>
</resultMap>
@Test
public void getStudent2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> student = mapper.getStudent2();
for (Student a : student) {
System.out.println(a);
}
sqlSession.close();
}
子查询对应第一种方式
联表查询对应第二种方式
说白了
1.第一种方式:其实就是查询嵌套 查询出对象进入 主对象
2.第二种方式:其实就是结果嵌套 进入对象