MyBatis关联查询

原创 2016年08月28日 14:28:19
一对一关联
一对一的场景:一个班主任只属于一个班级,一个班级也只能有一个班主任。
1、创建班级表和教师表语句

班级表

CREATE TABLE class
    (
        c_id INT NOT NULL AUTO_INCREMENT,
        c_name VARCHAR(20),
        teacher_id INT,
        PRIMARY KEY (c_id)
    )
ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO class(c_name, teacher_id) VALUES('class_a', 1);
INSERT INTO class(c_name, teacher_id) VALUES('class_b', 2);
教师表

CREATE TABLE teacher
    (
        t_id INT NOT NULL AUTO_INCREMENT,
        t_name VARCHAR(20),
        PRIMARY KEY (t_id)
    )
    ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO teacher(t_name) VALUES('teacher1');
INSERT INTO teacher(t_name) VALUES('teacher2');

2、创建实体

public class Classes {
	private int id;
	private String name;
	private Teacher teacher;
/* 省略Getter与Setter */
}

public class Teacher {
	private int id;
	private String name;
	/* 省略Getter与Setter */
}
3、编写sql映射ClassMapper.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的 -->
<mapper namespace="com.mahaochen.work.mapper.ClassMapper">
	<!-- 一对一联表查询  -->
	<!-- 方式一:嵌套结果,使用嵌套结果映射来处理重复的联合的子集,封装联表查询的数据(去除重复数据) -->
	<select id="SelectOneToOne1" parameterType="int" resultMap="ClassResultMap1">
		select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id}
	</select>
	<!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->
	<resultMap type="com.mahaochen.work.domain.Classes" id="ClassResultMap1">
		<id property="id" column="c_id" />
		<result property="name" column="c_name" />
		<association property="teacher" javaType="com.mahaochen.work.domain.Teacher">
			<id property="id" column="t_id" />
			<result property="name" column="t_name" />
		</association>
	</resultMap>

	<!-- 方式二:嵌套查询,通过执行另外一个SQL映射语句来返回预期的复杂类型 -->
	<select id="SelectOneToOne2" parameterType="int" resultMap="ClassResultMap2">
		select * from class where c_id=#{id}
	</select>
	<!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->
	<resultMap type="com.mahaochen.work.domain.Classes" id="ClassResultMap2">
		<id property="id" column="c_id" />
		<result property="name" column="c_name" />
		<association property="teacher" column="teacher_id" select="SelectTeacher" />
	</resultMap>
	<!-- 查询Teacher表语句 -->
	<select id="SelectTeacher" parameterType="int" resultType="com.mahaochen.work.domain.Teacher">
		SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
	</select>
</mapper>
        MyBatis使用association标签来解决一对一的关联查询,association标签可用的属性如下:
property 对象属性的名称
javaType 对象属性的类型
column 所对应的外键字段名称
select 使用另一个查询封装的结果

一对多关联
一对多的场景:根据班级,获取包括学生、教师、班级信息。一个班级包好多个学生。
1、创建学生表

CREATE TABLE student
    (
        s_id INT NOT NULL AUTO_INCREMENT,
        s_name VARCHAR(20),
        class_id INT,
        PRIMARY KEY (s_id)
    )
    ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO student(s_name, class_id) VALUES('student_A', 1);
INSERT INTO student(s_name, class_id) VALUES('student_B', 1);
INSERT INTO student(s_name, class_id) VALUES('student_C', 1);
INSERT INTO student(s_name, class_id) VALUES('student_D', 2);
INSERT INTO student(s_name, class_id) VALUES('student_E', 2);
INSERT INTO student(s_name, class_id) VALUES('student_F', 2);

2、创建实体

public class Student {

	private int id;
	private String name;
/* 省略Getter与Setter */
}

public class Classes {

	private int id;
	private String name;
	private Teacher teacher;
	//使用一个List<Student>集合属性表示班级拥有的学生
	private List<Student> students;
/* 省略Getter与Setter */
}

3、编写sql映射ClassMapper.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的 -->
<mapper namespace="com.mahaochen.work.mapper.ClassMapper">
<!-- 一对多联表查询  -->
	<!--方式一:嵌套结果,使用嵌套结果映射来处理重复的联合结果的子集 -->
	<select id="SelectOneToMany1" parameterType="int" resultMap="ClassResultMap3">
		select *
		from class c, teacher t,student s where c.teacher_id=t.t_id and
		c.C_id=s.class_id and c.c_id=#{id}
	</select>
	<resultMap type="com.mahaochen.work.domain.Classes" id="ClassResultMap3">
		<id property="id" column="c_id" />
		<result property="name" column="c_name" />
		<association property="teacher" column="teacher_id"
			javaType="com.mahaochen.work.domain.Teacher">
			<id property="id" column="t_id" />
			<result property="name" column="t_name" />
		</association>
		<!-- ofType指定students集合中的对象类型 -->
		<collection property="students" ofType="com.mahaochen.work.domain.Student">
			<id property="id" column="s_id" />
			<result property="name" column="s_name" />
		</collection>
	</resultMap>

	<!--方式二:嵌套查询,通过执行另外一个SQL映射语句来返回预期的复杂类型 -->
	<select id="SelectOneToMany2" parameterType="int" resultMap="ClassResultMap4">
		select * from class where c_id=#{id}
	</select>
	<resultMap type="com.mahaochen.work.domain.Classes" id="ClassResultMap4">
		<id property="id" column="c_id" />
		<result property="name" column="c_name" />
		<association property="teacher" column="teacher_id"
			javaType="com.mahaochen.work.domain.Teacher" select="SelectTeacher2"></association>
		<!-- collection标签来解决一对多的关联查询,ofType属性指定集合中元素的对象类型。 -->
		<collection property="students" ofType="com.mahaochen.work.domain.Student"
			column="c_id" select="SelectStudent2"></collection>
	</resultMap>

	<select id="SelectTeacher2" parameterType="int" resultType="com.mahaochen.work.domain.Teacher">
		SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
	</select>
	
	<select id="SelectStudent2" parameterType="int" resultType="com.mahaochen.work.domain.Student">
		SELECT s_id id, s_name name FROM student WHERE class_id=#{id}
	</select>
</mapper>

       MyBatis中使用collection标签来解决一对多的关联查询,ofType属性指定集合中元素的对象类型。collection标签可用的属性如下:
property 对象属性的名称
javaType 对象属性的类型
column 所对应的外键字段名称
select 使用另一个查询封装的结果







版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Mybatis多对多关联查询

  • 2016年03月15日 21:54
  • 1.12MB
  • 下载

MyBatis几种关联查询配置

前言简单的记录使用MyBatis关联查询的几种写法

mybatis关联查询问题(一对多、多对一)

mybatis关联查询问题(一对多、多对一) javamybatis多对多关系映射ORM 目录(?)[+] mybatis 提供了高级的关联查询功能,可以很方便地将数据库获取的结...

使用MyBatis(八)一对一关联(嵌套查询,嵌套结果)

1.创建2张表,建立主外键关系 2.建立实体类 package com.yw.test06; public class Class { private int id; private S...

22、SSM框架-Mybatis关联查询一对一和一对多的实现(4)

本文主要讲了使用Mybatis实现关联查询,分为一对一和一对多两种情况,最后并对ResultMap进行一个简要说明。 本文工程免费下载 一、创建表、分析 下面是两表,一个是顾客表,一个是车票...

Mybatis关联查询一对一和一对多的实现

Mybatis关联查询一对一和一对多的实现
  • fqf_520
  • fqf_520
  • 2016年01月07日 17:41
  • 902

mybatis关联查询问题(一对多、多对一)

mybatis 提供了高级的关联查询功能,一对多,多对多,多对一

Mybatis关联结果查询分页方法

在Mybatis分页插件的说明中有如下内容 不支持的情况 对于关联结果查询,使用分页得不到正常的结果,因为只有把数据全部查询出来,才能得到最终的结果,对这个结果进行分页才有效。因而如果...
  • isea533
  • isea533
  • 2014年06月06日 20:30
  • 14346
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MyBatis关联查询
举报原因:
原因补充:

(最多只允许输入30个字)