一对一关联表查询
一对一关联表查询有2种方式,分别是: 嵌套结果 和 嵌套查询 ,以下将对这2个进行举例。
用到的实体类:
Teacher.java
public class Teacher {
private Integer id;
private String name;
......
Class.java
public class Class {
private Integer id;
private String name;
private Teacher teacher;
......
一. 嵌套结果
使用嵌套结果映射来处理重复的联合结果的子集封装联表查询的数据
创建2个对应的映射文件:
ClassMapper.xml
<mapper namespace="com.wsb.mybatis.beans.ClassMapper">
<select id="selectClass" parameterType="int" resultMap="ClassResultMap">
SELECT *
FROM class c, teacher t WHERE c.teacher_id = t.t_id AND c.c_id= #{id}
</select>
<resultMap type="Class" id="ClassResultMap">
<id property="id" column="c_id" />
<result property="name" column="c_name" />
<!-- 将查询到的teacher数据封装为Teacher对象(将字段映射到类属性)-->
<association property="teacher" javaType="Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
</resultMap>
TestClass.java
public class TestClass {
@Test
public void testSelect(){
SqlSession session = MyBatisUtil.getFactory().openSession();
String statement = "com.wsb.mybatis.beans.ClassMapper.selectClass";
Class class1 = session.selectOne(statement , 1);
session.commit();
System.out.println(class1);
session.close();
}
结果:Class [id=1, name=bj_a, teacher=Teacher [id=1, name=LS1]]
二. 嵌套结果
通过执行另外一个SQL映射语句来返回预期的复杂类型
在第一种方式的例子里改映射文件即可
ClassMapper.xml
<mapper namespace="com.wsb.mybatis.beans.ClassMapper">
<select id="selectClass" parameterType="int" resultMap="ClassResultMap">
SELECT * FROM class WHERE c_id = #{id}
</select>
<select id="selectTeacher" parameterType="int" resultType="Teacher">
SELECT t_id id, t_name name FROM teacher WHERE t_id = #{id}
</select>
<resultMap type="Class" id="ClassResultMap">
<id property="id" column="c_id" />
<result property="name" column="c_name" />
<!-- 通过使用 select 属性引用 selectTeacher 并将 teacher_id 输入到占位符#{id}-->
<association property="teacher" column="teacher_id" select="selectTeacher">
</association>
</resultMap>