`
bit1129
  • 浏览: 1070012 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【持久化框架MyBatis3五】MyBatis3一对多关联查询

 
阅读更多

以教员和课程为例介绍一对多关联关系,在这里认为一个教员可以叫多门课程,而一门课程只有1个教员教,这种关系在实际中不太常见,通过教员和课程是多对多的关系。

 

示例数据:

 

地址表:

 

CREATE TABLE ADDRESSES 
(
  ADDR_ID INT(11) NOT NULL AUTO_INCREMENT,
  STREET VARCHAR(50) NOT NULL,
  CITY VARCHAR(50) NOT NULL,
  STATE VARCHAR(50) NOT NULL,
  ZIP VARCHAR(10) DEFAULT NULL,
  COUNTRY VARCHAR(50) NOT NULL,
  PRIMARY KEY (ADDR_ID)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF-8;
 

 

教员表:

 

 

CREATE TABLE TUTORS 
(
  TUTOR_ID INT(11) NOT NULL AUTO_INCREMENT,
  NAME VARCHAR(50) NOT NULL,
  EMAIL VARCHAR(50) NOT NULL,
  PHONE VARCHAR(15) DEFAULT NULL,  
  DOB DATE DEFAULT NULL,
  GENDER VARCHAR(6) DEFAULT NULL,
  BIO LONGTEXT DEFAULT NULL,
  PIC BLOB DEFAULT NULL,
  ADDR_ID INT(11) DEFAULT NULL,
  PRIMARY KEY (TUTOR_ID),
  UNIQUE KEY UK_EMAIL (EMAIL),
  CONSTRAINT FK_TUTORS_ADDR FOREIGN KEY (ADDR_ID) REFERENCES ADDRESSES (ADDR_ID)  
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF-8;
 

 

课程表:

 

 

CREATE TABLE COURSES 
(
  COURSE_ID INT(11) NOT NULL AUTO_INCREMENT,
  NAME VARCHAR(100) NOT NULL,
  DESCRIPTION VARCHAR(512) DEFAULT NULL,
  START_DATE DATE DEFAULT NULL,
  END_DATE DATE DEFAULT NULL,
  TUTOR_ID INT(11) NOT NULL,
  PRIMARY KEY (COURSE_ID),
  CONSTRAINT FK_COURSE_TUTOR FOREIGN KEY (TUTOR_ID) REFERENCES TUTORS (TUTOR_ID)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF-8;
 

 

样例数据:

 

 

INSERT INTO ADDRESSES (ADDR_ID,STREET,CITY,STATE,ZIP,COUNTRY) VALUES 
 (1,'4891 Pacific Hwy','San Diego','CA','92110','San Diego'),
 (2,'2400 N Jefferson St','Perry','FL','32347','Taylor'),
 (3,'710 N Cable Rd','Lima','OH','45825','Allen'),
 (4,'5108 W Gore Blvd','Lawton','OK','32365','Comanche');


INSERT INTO TUTORS (TUTOR_ID,NAME,EMAIL,PHONE,DOB,GENDER,BIO,PIC,ADDR_ID) VALUES 
 (1,'John','john@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1),
 (2,'Ken','ken@gmail.com','111-222-3333','1980-05-20','MALE',NULL,NULL,1),
 (3,'Paul','paul@gmail.com','123-321-4444','1981-03-15','FEMALE',NULL,NULL,2),
 (4,'Mike','mike@gmail.com','123-321-4444','1981-03-15','MALE',NULL,NULL,2);


INSERT INTO COURSES (COURSE_ID,NAME,DESCRIPTION,START_DATE,END_DATE,TUTOR_ID) VALUES 
 (1,'Quickstart Core Java','Core Java Programming','2013-03-01','2013-04-15',1),
 (2,'Quickstart JavaEE6','Enterprise App Development using JavaEE6','2013-04-01','2013-08-30',1),
 (3,'MyBatis3 Premier','MyBatis 3 framework','2013-06-01','2013-07-15',2);
 

 

Course-Mapper.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="com.mybatis3.mappers.CourseMapper">
	
	<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="false"/>
        <!--resultMap:课程表与Course实体之间的对应关系-->
  	<resultMap type="Course" id="CourseResult">
  		<id 	column="course_id" property="courseId"/>
  		<result column="name" property="name"/>
  		<result column="description" property="description"/>
  		<result column="start_date" property="startDate"/>
  		<result column="end_date" property="endDate"/>
  	</resultMap>
  	
  	<select id="selectCoursesByTutor" parameterType="int" resultMap="CourseResult">
  		select * from courses where tutor_id=#{tutorId}
  	</select>
  	<!--根据条件查询课程,这里使用了if做动态SQL的组装-->
  	<select id="searchCourses" parameterType="hashmap" resultMap="CourseResult" useCache="false">
  		SELECT * FROM COURSES
  		WHERE TUTOR_ID= #{tutorId}
  		<if test="courseName != null">
  			AND name like #{courseName}
  		</if>
  		<if test="startDate != null">
  			AND start_date  &gt;= #{startDate}
  		</if>
  		<if test="endDate != null">
  			AND end_date  &lt;= #{endDate}
  		</if>
  		
  	</select>
  	<!--查询一组教学所教的课程,这里用到了foreach循环-->
  	<select id="searchCoursesByTutors" parameterType="hashmap" resultMap="CourseResult">
  		SELECT * FROM COURSES
  		<if test="tutorIds != null">
  		<where>
  		tutor_id IN
                <!--foreeach的每个对象是tutorId,使用#{tutorId}表示-->
                <!--open=...close..表示以(开头,以)结果,每个元素用,分开-->
  		<foreach item="tutorId" collection="tutorIds"
	      open="(" separator="," close=")">
	        #{tutorId}
	  	</foreach>
   		</where>  		
   		</if>
  	</select>
  	
</mapper>
 

 

Tutor-Mapping.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="com.mybatis3.mappers.TutorMapper">
	
	
  	<resultMap type="Tutor" id="TutorWithCoursesNestedResult">
  		<id 	column="tutor_id" property="tutorId"/>
  		<result column="tutor_name" property="name"/>
  		<result column="email" property="email"/>
                <!--assocation定义1对1关联,使用resultMap属性表示address对应的结果类型是AddressResult对应的type,即Address对象-->
  		<association property="address" resultMap="com.mybatis3.mappers.AddressMapper.AddressResult"/>
                <!--collection定义1对多关联,resultMap表示1对多的多的那一方的类型是CourseResult-->
  		<collection property="courses"  resultMap="com.mybatis3.mappers.CourseMapper.CourseResult"  />
  	</resultMap>
  	
  	<resultMap type="Tutor" id="TutorWithCoursesNestedSelect">
  		<id 	column="tutor_id" property="tutorId"/>
  		<result column="tutor_name" property="name"/>
  		<result column="email" property="email"/>
  		<association property="address" resultMap="com.mybatis3.mappers.AddressMapper.AddressResult"/>
                <!--colllection定义1对多关联,通过SQL语句CourseMapper.selectCoursesByTutor获得关联的课程列表-->
                <!---->
  		<collection property="courses"  column="tutor_id" select="com.mybatis3.mappers.CourseMapper.selectCoursesByTutor"/>
  	</resultMap>
  	
        <!--使用Address是通过Assocation + resultMap关联,左外链接查询Address-->      
        <!--使用Course是通过Assocation + resultMap关联,所以左外链接查询Courses-->
  	<select id="selectTutorById" parameterType="int" resultMap="TutorWithCoursesNestedResult">
  		SELECT t.tutor_id, t.name as tutor_name, email, a.addr_id, street, city, state, zip, country,
       			course_id, c.name, description, start_date, end_date
		FROM tutors t left outer join addresses a on t.addr_id=a.addr_id
		  left outer join courses c on t.tutor_id=c.tutor_id
		where t.tutor_id=#{tutorId}
  	</select>
  	<!--使用Address是通过Assocation + resultMap关联,左外链接查询Address-->
        <!--因为Course是使用collection + select进行关联,所以不要对Course表做连接查询-->
  	<select id="selectTutorWithCourses" parameterType="int" resultMap="TutorWithCoursesNestedSelect">
  		SELECT t.tutor_id, t.name as tutor_name, email, a.addr_id, street, city, state, zip, country
		FROM tutors t left outer join addresses a on t.addr_id=a.addr_id
		where t.tutor_id=#{tutorId}
  	</select>
  	
</mapper>
 

 

 

 总结:

1. 1对多关联查询使用collection,collection的属性有两个,resultMap和select

2. collection+resultMap

    这种方式,需要在sql语句中使用连接查询,不能懒加载

3. collection+select

   这种方式,在sql语句中不需要使用连接查询,可以使用懒加载,但是需要两遍查询,a.首先查询出教员信息 b.根据教员ID查询Course表,查出所有的符合条件的Course

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    java 之持久化框架mybatis3,

    MyBatis是一个流行的Java持久层框架,它简化了传统JDBC的编程方式,提供了丰富的数据映射功能,并且易于与各种数据库交互。MyBatis的核心思想是将SQL语句从Java代码中分离出来,通过映射配置文件,或注解的方式,将...

    mybatis自关联查询

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在实际开发中,我们常常需要处理数据之间的关联关系,比如一对一、一对多、多对一、多对多等。本篇文章将重点讲解 MyBatis 中的自关联...

    myBatis一对一和一对多

    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在实际的项目开发中,我们经常遇到一对一(One-to-One)和一对多(One-to-Many)的关系映射,这两种关系在数据库设计中非常常见。本主题将...

    SpringBoot中mybatis表关联映射关系(一对多嵌套:结果方式)

    SpringBoot 中 MyBatis 表关联映射关系(一对多嵌套:结果方式) 在 SpringBoot 中,MyBatis 是一个非常流行的持久...最后,我们可以使用 MyBatis 来映射 Lesson 和 Stu 之间的一对多关联关系,实现数据的持久化操作。

    数据持久化框架-MyBatis.html

    Mybatis是一款优秀的持久层框架,用于简化JDBC开发。 Mybatis官网:https://mybatis.org/mybatis-3/ Mybatis中文官网:https://mybatis.org/mybatis-3/zh/index.html 2、Mybatis的历史 Mybatis前身是Apache的一个...

    mybatis xml 一对多

    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。在处理复杂的数据库关系时,如一对一、一对多、多对多,MyBatis通过XML配置文件或...

    [MyBatis] Java 持久化 (MyBatis 3 实现) (英文版)

    [Packt Publishing] Java 持久化 (MyBatis 3 实现) (英文版) [Packt Publishing] Java Persistence with MyBatis 3 (E-Book) ☆ 出版信息:☆ [作者信息] K. Siva Prasad Reddy [出版机构] Packt Publishing ...

    mybatis的多对多关联实例

    在IT领域,数据库关系模型中的多对多关联是常见的数据结构设计,MyBatis作为一款强大的持久层框架,提供了处理这种复杂关联的能力。本实例主要探讨如何在MyBatis中实现与MySQL数据库的多对多关联,并利用Log4j进行...

    MyBatis3官方中文文档

    另外,MyBatis的映射文件是MyBatis框架中非常重要的一部分,它将SQL语句和映射的Java对象关联起来,是MyBatis中实现查询、插入、更新、删除等操作的关键。映射文件通常与接口紧密配合,通过命名空间和方法名的对应...

    mybatis持久化dao生成工具

    标题 "mybatis持久化dao生成工具" 涉及到的主要技术是MyBatis,一个流行的Java持久层框架,以及Freemarker,一个强大的模板引擎。这个工具旨在自动化Spring MVC框架中的DAO(数据访问对象)、Service层代码的生成,...

    MyBatis3关联关系

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在处理复杂的数据库关联关系时,MyBatis 提供了一对一、一对多、多对多等多种映射方式,使得数据模型的构建和数据查询变得更加灵活。 ##...

    Java Persistence With Mybatis 3

    《Java Persistence With Mybatis 3》是关于Java持久层框架Mybatis使用指南的一本书籍,它详细介绍了如何使用Mybatis进行数据库操作和数据持久化处理。Mybatis是一个支持定制化SQL、存储过程以及高级映射的持久层...

    Mybatis3帮助文档

    例如,你可能需要将数据库中的日期字段转换为特定的Java日期对象,或者处理一对多或多对一的关系映射。 SSM框架技术,即Spring、SpringMVC和Mybatis的组合,是企业级Java应用的常见架构。Spring负责依赖注入和管理...

    Mybatis的课程管理系统数据持久化外文文献及翻译.zip

    Mybatis 是一款流行的Java持久层框架,用于简化数据库操作,特别是在复杂的SQL查询和对象关系映射(ORM)方面。在“Mybatis的课程管理系统数据持久化外文文献及翻译.zip”压缩包中,包含了关于Mybatis如何应用于课程...

    mybatis 框架和一些mybatis的依赖jar包

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...

    mybatis框架面试整理

    MyBatis支持自动类型匹配,也可以自定义结果映射,包括一对一、一对多、多对多的关联映射。 8. **动态SQL**:MyBatis的动态SQL功能非常强大,可以在XML映射文件中使用if、choose、when、otherwise、where、trim、...

    官方比较完整的框架mybatis-3.4.6

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...

    MyBatis支持定制化SQL存储过程以及高级映射的优秀的持久层框架

    例如,通过`&lt;association&gt;`标签可以实现一对一关联映射,而`&lt;collection&gt;`则用于一对多或多对多映射。此外,MyBatis还支持结果映射的自动类型判断和转换,以及延迟加载(lazy loading),以提高程序的运行效率。 在...

    mybatis关联/级联以及动态sql

    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在关联和级联查询以及动态SQL方面,MyBatis提供了强大的功能,使得开发人员能够更加灵活地处理数据库交互。 首先,我们来探讨MyBatis中的...

Global site tag (gtag.js) - Google Analytics