您的位置:首页 > 其它

Mybatis学习——关联表查询

2016-05-17 22:28 260 查看
<mapper namespace="com.wj.dao.mapper.ClassesMaper">

<!--
根据班级id查询班级信息(带老师的信息)
##1. 联表查询
SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=1;

##2. 执行两次查询
SELECT * FROM class WHERE c_id=1;  //teacher_id=1
SELECT * FROM teacher WHERE t_id=1;//使用上面得到的teacher_id
-->

<!--
方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
封装联表查询的数据(去除重复的数据)
select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=1
-->
<select id="getClass" parameterType="int" resultMap="ClassResultMap">
select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id}
</select>
<!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->
<resultMap type="com.wj.model.Classes" id="ClassResultMap">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" javaType="com.wj.model.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
</resultMap>

<!--
方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
SELECT * FROM class WHERE c_id=1;
SELECT * FROM teacher WHERE t_id=1   //1 是上一个查询得到的teacher_id的值
-->
<select id="getClass2" parameterType="int" resultMap="ClassResultMap2">
select * from class where c_id=#{id}
</select>
<!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->
<resultMap type="com.wj.model.Classes" id="ClassResultMap2">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" column="teacher_id" select="getTeacher"/>
</resultMap>

<select id="getTeacher" parameterType="int" resultType="com.wj.model.Teacher">
SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
</select>

</mapper>

package com.wj.model;

/**
* @author wj
* 定义班级表对应的实体类
*/
public class Classes {

//定义实体类的属性,与class表中的字段对应
private int id;            //id===>c_id
private String name;    //name===>c_name

/**
* class表中有一个teacher_id字段,所以在Classes类中定义一个teacher属性,
* 用于维护teacher和class之间的一对一关系,通过这个teacher属性就可以知道这个班级是由哪个老师负责的
*/
private Teacher teacher;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Teacher getTeacher() {
return teacher;
}

public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}

@Override
public String toString() {
return "Classes [id=" + id + ", name=" + name + ", teacher="
+ teacher + "]";
}

}

package com.wj.model;

/**
*
* @author wj
* 定义教师表
*/
public class Teacher {

//定义实体类的属性,与teacher表中的字段对应
private int id;            //id===>t_id
private String name;    //name===>t_name

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "Teacher [id=" + id + ", name=" + name + "]";
}
}


一、一对一关联

mybatis中的一对一关联用association标签,有两种方式实现:

</pre><p></p><p></p><p></p><p></p><pre code_snippet_id="1687212" snippet_file_name="blog_20160517_2_9188279" name="code" class="html">



javaType 表示对象属性的类型,

property 表示属性名称,

column 是该属性对应数据库里的列名

select:使用另一个查询封装的结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: