以下皆为个人理解,如果有错误,或者理解错误 还希望各位可以指出。
先创建实体类 老师实体类(我这里懒省事,从上往下注解为 get与set,无参,有参)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
private int id;
private String name;
}
创建学生实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private int id;
private String name;
/*因为学生需要关联老师,所以不能使用 private int tid;*/
private Teacher teacher;
}
数据库字段(学生,老师)
编写接口
public interface studentDao {
List<Student> getStudent();
}
编写mapper实现
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace绑定一个对应的Dao/Mapper接口 -->
<mapper namespace="cn.cvs.dao.studentDao">
<!-- 先查询学生 -->
<select id="getStudent" resultMap="StudentTeacher" >
select * from student
</select>
<resultMap id="StudentTeacher" type="cn.cvs.pojo.Student">
<result property="id" column="id"/>
<result property="name" column="name" />
<association property="teacher" column="tid" javaType="cn.cvs.pojo.Teacher" select="getTeacher" />
</resultMap>
<select id="getTeacher" resultType="cn.cvs.pojo.Teacher">
select * from teacher where id =#{name}
</select>
</mapper>
我感觉一般都会在 resultMap 中的 association 这块不是很懂如下
<resultMap id="StudentTeacher" type="cn.cvs.pojo.Student">
<result property="id" column="id"/>
<result property="name" column="name" />
<association property="teacher" column="tid" javaType="cn.cvs.pojo.Teacher" select="getTeacher" />
</resultMap>
resultMap 和 association 基本不差 但是 association 代表的是对象,而resultMap 只能查出单个,不能查询对象,所以用到 association
两者有相同的属性 也就是 property="teacher" column="tid"
property="teacher" 由于查询的值是 teacher 对象(这个对象是你idea 实体类表中的)
column="tid" 对应数据库中 学生表 的字段
javaType="cn.cvs.pojo.Teacher" 是为了 idea 知道 property="teacher" 是哪个类型(也可以写别名)
后面的select 则代表执行某个 ”id =getTeacher“ 的 select语句,
这时就有人疑惑,为什么 下面的 where id =#{name} 中 这个name可以改变成任何名字 他都不会报错, 但是不能缺少这一句
要明白上面中 column="tid" 是从数据库中得到的数据 然后 执行 select="getTeacher"
也就是下面的语句 其中 #{name} 只是一个占位符 最终占位符会被从数据库的得到数据 column="tid" 给 #{name}
在SQL语句中 如下
SELECT s.id,s.name,t.name FROM student s,teacher t WHERE s.`tid`=t.`id`
执行的结果:
idea中写测试类:
@Test
public void test1(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
studentDao mapper = sqlSession.getMapper(studentDao.class);
List<Student> studentList = mapper.getStudent();
for (Student student : studentList) {
System.out.println(student);
}
sqlSession.close();
}
结果:
Student(id=1, name=小明, teacher=Teacher(id=1, name=秦老师))
Student(id=2, name=小红, teacher=Teacher(id=1, name=秦老师))
Student(id=3, name=小龙, teacher=Teacher(id=1, name=秦老师))
Student(id=4, name=小绿, teacher=Teacher(id=2, name=李老师))