数据库表:class:c_id,c_name ,t_id(老师的id)
teacher:t_id,t_name
student: s_id,s_name,c_id
实体类就不写了 直接写上mapper文件吧
classMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--mapper文件的唯一标识-->
<mapper namespace="cn.limbo.pojo.classMapper">
<!--根据班级查询老师信息,老师和班级的关系是一对一的关系-->
<!--方法一-->
<select id="getClass" resultMap="getClassMap" parameterType="Integer">
SELECT * FROM class c,teacher t WHERE c.t_id = t.t_id AND c_id = #{id};
</select>
<resultMap id="getClassMap" type="Classes">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" javaType="teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
</resultMap>
<!--方法二-->
<select id="getClass2" resultMap="getClass2Map" parameterType="Integer">
SELECT * FROM class WHERE c_id = #{id}
</select>
<select id="getTeacher" resultType="Teacher" parameterType="Integer">
SELECT t_id id,t_name name FROM teacher WHERE t_id = #{id}
</select>
<resultMap id="getClass2Map" type="Classes">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<!--其中association中的column表示为select属性中的sql语句传递什么参数-->
<association property="teacher" column="t_id" select="getTeacher"/>
</resultMap>
<!--
association:用于一对一的关联查询
property:对象属性的名称
javaType:对象属性的类型
column:所对应的外键名称
select使用另一个查询封装的结果
-->
<!--根据班级查询老师和学生的信息 班级和老师关系是一对一,和学生关系是一对多-->
<!--方法一-->
<select id="getStudent" parameterType="Integer" resultMap="getStudentMap">
SELECT * FROM class c , student s, teacher t WHERE c.c_id = s.class_id AND c.t_id = t.t_id AND c.c_id = #{id};
</select>
<resultMap id="getStudentMap" type="Classes">
<id property="id" column="c_id" />
<result property="name" column="c_name" />
<association property="teacher" javaType="Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name" />
</association>
<collection property="students" ofType="Student">
<id property="id" column="s_id" />
<result property="name" column="s_name" />
</collection>
</resultMap>
<!--方法二-->
<select id="getClass3" resultMap="getClass3Map">
SELECT * FROM class WHERE c_id=#{id}
</select>
<select id="getStudent2" resultType="Student">
SELECT s_id id,s_name name FROM student WHERE class_id = #{id}
</select>
<resultMap id="getClass3Map" type="Classes">
<id property="id" column="c_id" />
<result property="name" column="c_name" />
<association property="teacher" column="t_id" select="getTeacher" />
<collection property="students" column="c_id" select="getStudent" />
</resultMap>
</mapper>
上面就包含了一对一和一对多的情况,我测试过两种方法的效率,感觉差不多,没有什么区别,但是从写法上更加推荐第一种,因为简单