处理has-one关系需要用到association元素,而处理has many关系则需要用到collection元素。例如本例中,假设一 名教师可同时指导多名学生,下面就来介绍如何使用collection元素来实现这种映射,具体的任务是查询出教师及其指导的多个学生的信息(本示例源代 码下载页面:http://down.51cto.com/data/490947)。

一、为Teacher实体增加相关属性

为教师实体增加指导学生集合的属性如下:

  1. private List<Student> supStudents;//指导学生

并为其增加setter和getter方法,这里略过。

二、TeacherMapper接口

为实现教师实体映射,应先创建映射器接口如下:

  1. package com.abc.mapper;
  2. import com.abc.domain.Teacher;
  3. public interface TeacherMapper {
  4. public Teacher getById(int id);
  5. }

三、映射文件

为教师实体创建的映射文件如下:

  1. <?xml version="1.0" encoding="utf8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <!--与以前一样,namespace的值是对应的映射器接口的完整名称-->
  4. <mapper namespace="com.abc.mapper.TeacherMapper">
  5. <!--TeacherMapper接口中getById方法对应的SQL语句。
  6. 查询教师及其指导的学生的信息。由于教师、学生都有
  7. id、name、gender等属性,因此给教师的字段都起了别名-->
  8. <select id="getById" parameterType="int" resultMap="supervisorResultMap">
  9. select t.id t_id, t.name t_name, t.gender t_gender,
  10. t.research_area t_research_area, t.title t_title,
  11. s.id,s.name, s.gender,s.major,s.grade
  12. from teacher t,student s where t.id=#{id}
  13. and s.supervisor_id = t.id
  14. </select>
  15. <!--教师实体映射-->
  16. <resultMap id="supervisorResultMap" type="Teacher">
  17. <id property="id" column="t_id"/>
  18. <result property="name" column="t_name"/>
  19. <result property="gender" column="t_gender"/>
  20. <result property="researchArea" column="t_research_area"/>
  21. <result property="title" column="t_title"/>
  22. <!--collection元素映射教师的指导学生集合的属性。resultMap
  23. 以命名空间名.resultMap的id的形式,引用studentResultMap。
  24. 需要注意的是,上面的select语句中学生的字段名/别名应与
  25. studentResultMap中的column属性一致-->
  26. <collection property="supStudents"
  27. resultMap="com.abc.mapper.StudentMapper.studentResultMap"/>
  28. </resultMap>
  29. </mapper>

相应地,学生实体的映射文件如下:

  1. <?xml version="1.0" encoding="utf8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.abc.mapper.StudentMapper">
  4. <resultMap id="studentResultMap" type="Student">
  5. <id property="id" column="id"/>
  6. <result property="name" column="name"/>
  7. <result property="gender" column="gender"/>
  8. <result property="major" column="major"/>
  9. <result property="grade" column="grade"/>
  10. <!--相应地,在此引用supervisorResultMap,亦采用
  11. 命名空间名.resultMap的id的形式。-->
  12. <association property="supervisor"
  13. resultMap="com.abc.mapper.TeacherMapper.supervisorResultMap"/>
  14. </resultMap>
  15. </mapper>

在工程的src\resources目录下新建子目录mappers,用来统一存放映射文件。为了能让MyBatis找到这些映射文件,修改其核心配置文件configuration.xml中的mappers元素如下:

  1. <!--在classpath中以相对路径的形式引用映射文件-->
  2. <mappers>
  3. <mapper resource="resources/mappers/StudentMapper.xml"/>
  4. <mapper resource="resources/mappers/TeacherMapper.xml"/>
  5. </mappers>

注意:resources目录在工程编译前会被复制到classes目录下(详见工程生成文件build.xml中的copy-resources和compile这两个target),而classes目录会被ant添加到classpath中。

四、执行类

执行类为CollectionDemo,其内容如下:

  1. package com.demo;
  2. import org.springframework.context.ApplicationContext;
  3. import com.abc.mapper.StudentMapper;
  4. import com.abc.mapper.TeacherMapper;
  5. import com.abc.domain.Teacher;
  6. import com.abc.domain.Student;
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;
  8. import java.util.List;
  9. public class CollectionDemo
  10. {
  11. private static ApplicationContext ctx;
  12. static
  13. {
  14. //在类路径下寻找resources/beans.xml文件
  15. ctx = new ClassPathXmlApplicationContext("resources/beans.xml");
  16. }
  17. public static void main(String[] args)
  18. {
  19. //从Spring容器中请求映射器
  20. TeacherMapper mapper =
  21. (TeacherMapper)ctx.getBean("teacherMapper");
  22. //查询id为1的教师
  23. Teacher teacher = mapper.getById(1);
  24. if(teacher == null)
  25. {
  26. System.out.println("未找到相关教师信息。");
  27. }
  28. else
  29. {
  30. //教师信息
  31. System.out.println("**********************************************");
  32. System.out.println("教师姓名:" + " " + teacher.getName());
  33. System.out.println("教师职称:" + " " + teacher.getTitle());
  34. System.out.println("**********************************************");
  35. System.out.println("指导学生信息:");
  36. //遍历指导的学生
  37. for(Student s : teacher.getSupStudents())
  38. {
  39. System.out.println("**********************************************");
  40. System.out.println( s.getName() + " " + s.getGender() + " " + s.getGrade()
  41. + " " + s.getMajor());
  42. //从学生端访问教师
  43. System.out.println("指导教师研究方向:" + s.getSupervisor().getResearchArea());
  44. }
  45. System.out.println("**********************************************");
  46. }
  47. }
  48. }

从中可看出,可以从任意一端访问另一端的对象。

五、修改build.xml

为了能用ant运行此程序,需修改build.xml中的run target,指定类CollectionDemo为执行类。如下:

  1. <target name="run" depends="compile">
  2. <!--指定CollectionDemo为要运行的类-->
  3. <java fork="true" classname="com.demo.CollectionDemo"
  4. classpathref="library">
  5. <!--把classes目录添加到工程的classpath中。
  6. ${targetdir}是指引用上面定义的property元素targetdir-->
  7. <classpath path="${targetdir}"/>
  8. </java>
  9. </target>
  1.   运行结果如下:

MyBatis一对多双向关联——MyBatis学习笔记之七的更多相关文章

  1. JPA学习---第九节:JPA中的一对多双向关联与级联操作

    一.一对多双向关联与级联操作 1.创建项目,配置文件代码如下: <?xml version="1.0" encoding="UTF-8"?> < ...

  2. JPA中的一对多双向关联与级联操作

    学习Spring有两周时间了 , 个人觉得服务端主要实现的是数据关系的维护和数据结构的制定 , 以及由业务需求产生的CRUD , 只要保证对前端提供的接口稳定高效响应 , 具体的前端实现完全不关心. ...

  3. Hibernate从入门到精通(九)一对多双向关联映射

    上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映射,即在一的 ...

  4. Hibernate(九)一对多双向关联映射

    上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关 内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映 射,即在 ...

  5. Hibernate 一对多双向关联Demo

    以Classes[班级]和Student[学生]为例的Demo //Classes.java public class Classes implements Serializable { privat ...

  6. hibernate 一对多双向关联 详解

    一.解析: 1.  一对多双向关联也就是说,在加载班级时,能够知道这个班级所有的学生. 同时,在加载学生时,也能够知道这个学生所在的班级. 2.我们知道,一对多关联映射和多对一关联映射是一样的,都是在 ...

  7. Hibernate中用注解配置一对多双向关联和多对一单向关联

    Hibernate中用注解配置一对多双向关联和多对一单向关联 Hibernate提供了Hibernate Annotations扩展包,使用注解完成映射.在Hibernate3.3之前,需单独下载注解 ...

  8. 【Visual C++】游戏编程学习笔记之七:键盘输入消息

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...

  9. Mybatis中使用association及collection进行一对多双向关联示例(含XML版与注解版)

    XML版本: 实体类: package com.sunwii.mybatis.bean; import java.util.ArrayList; import java.util.List; impo ...

随机推荐

  1. Ubuntu 取消sudo密码

    需求:在Ubuntu下装了FQ代理goagent之后,为了goagent能够开机启动.因为goagent需要sudo权限,所以要去掉sudo密码. 要修改的文件位于/etc/sudoers,先备份: ...

  2. 什么是hibernate?

    一.什么是hibernate框架?1.通过数据库保存java运行时产生的对象和恢复对象,其实就是实现java对象与关系数据库记录的映射关系称为ORM(Object Relation Mapping), ...

  3. 汇编debug 截图2

  4. ArcEngine查询、添加、删除要数的方法

    原文地址:http://www.cnblogs.com/caodajieup/archive/2011/11/02/2232658.html 1.查找数据 1).利用FeaturCursor进行空间查 ...

  5. java web 下实现文件下载

    来自:http://blog.csdn.net/longshengguoji/article/details/39433307 需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法 ...

  6. Windows 7下配置JDK环境变量

    安装jdk1.8版本(下载链接:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) ...

  7. oracle db shutdown immediate–multi Instance

    [oracle@redhat4 ~]$ sqlplus / as sysdba@orcl SQL*Plus: Release 11.2.0.1.0 Production on Tue Oct 6 21 ...

  8. Windows下搭建MySql Master-Master Replication

    1.首先下载最新版的MySql Server (http://dev.mysql.com/downloads/windows/installer/) 2.安装MySql Server到两台机器上 My ...

  9. java_十进制数转换为二进制,八进制,十六进制数的算法

    java_十进制数转换为二进制,八进制,十六进制数的算法 java Ê®½øÖÆÊýת»»Îª¶þ½øÖÆ,°Ë½øÖÆ,Ê®Áù½øÖÆÊýµÄË㕨 using System; using S ...

  10. 1320. Graph Decomposition

    1320 简单并查集 #include <iostream> #include<cstdio> #include<cstring> #include<algo ...