这篇文章我们将来学习一些 association 用法

表结构

  1. DROP TABLE IF EXISTS `student`; CREATE TABLE `student` (

  2.  `id` int(11) NOT NULL auto_increment,

  3.  `name` varchar(10) NOT NULL,

  4.  `gender` char(1) NOT NULL,

  5.  `major` varchar(20) NOT NULL,

  6.  `grade` char(4) NOT NULL,

  7.  `supervisor_id` int(11) NOT NULL,

  8.  PRIMARY KEY  (`id`)

  9. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES ('1', 'zhangsan', '男', '计算机科学与技术', '2011', '1'); -- ---------------------------- -- Table structure for teacher -- ---------------------------- DROP TABLE IF EXISTS `teacher`; CREATE TABLE `teacher` (

  10.  `id` int(11) NOT NULL auto_increment,

  11.  `name` varchar(10) NOT NULL,

  12.  `gender` char(1) NOT NULL,

  13.  `research_area` varchar(20) NOT NULL,

  14.  PRIMARY KEY  (`id`)

  15. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of teacher -- ---------------------------- INSERT INTO `teacher` VALUES ('1', 'laowu', '男', '软件工程');

对应的java bean

  1. public class Student {

  2. private int id;  

  3. private String name;     // 姓名

  4. private String gender;   // 性别

  5. private String major;    // 专业

  6. private String grade;    // 年级

  7. private Teacher supervisor; //指导教师  

  8. public int getId() {


  9.  return id;


  10. }


  11. public void setId(int id) {


  12.  this.id = id;


  13. }


  14. public String getName() {


  15.  return name;


  16. }


  17. public void setName(String name) {


  18.  this.name = name;


  19. }


  20. public String getGender() {


  21.  return gender;


  22. }


  23. public void setGender(String gender) {

  24.  this.gender = gender;


  25. }


  26. public String getMajor() {


  27.  return major;


  28. }


  29. public void setMajor(String major) {


  30.  this.major = major;


  31. }


  32. public String getGrade() {


  33.  return grade;


  34. }


  35. public void setGrade(String grade) {


  36.  this.grade = grade;


  37. }


  38. public Teacher getSupervisor() {


  39.  return supervisor;


  40. }


  41. public void setSupervisor(Teacher supervisor) {


  42.  this.supervisor = supervisor;


  43. }


  44. }


  45. public class Teacher {


  46. private int id;    

  47. private String name;               // 教师姓名


  48. private String gender;        // 教师性别


  49. private String researchArea;    // 研究领域


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

  51. public int getId() {


  52.  return id;


  53. }


  54. public void setId(int id) {


  55.  this.id = id;


  56. }


  57. public String getName() {


  58.  return name;


  59. }


  60. public void setName(String name) {


  61.  this.name = name;


  62. }


  63. public String getGender() {


  64.  return gender;


  65. }


  66. public void setGender(String gender) {


  67.  this.gender = gender;


  68. }


  69. public String getResearchArea() {


  70.  return researchArea;


  71. }


  72. public void setResearchArea(String researchArea) {


  73.  this.researchArea = researchArea;


  74. }


  75. public List<Student> getSupStudents() {


  76.  return supStudents;


  77. }


  78. public void setSupStudents(List<Student> supStudents) {


  79.  this.supStudents = supStudents;


  80. }


  81. }

mapper

  1. <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  


  2. "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="net.zaodk.mybatis.mapper.StudentOperationMapper">


  3. <!-- 定义java Bean的属性与数据库的列之间的映射 -->


  4. <resultMap type="Student" id="studentResultMap">

  5.  <id column="id" property="id" />


  6.  <result column="name" property="name" />


  7.  <result column="gender" property="gender" />

  8.  <result column="major" property="major" />


  9.  <result column="grade" property="grade"/>


  10.  <!-- association处理has-a关系 -->

  11.  <!--注意:这种方式javaType必须指定,表示supervisor的类型是Teacher,否则会报错 -->


  12.  <association property="supervisor" javaType="Teacher">


  13.   <!-- 教师自身的属性与数据库字段的映射 -->


  14.   <id property="id" column="t_id"/>


  15.   <result property="name" column="t_name"/>


  16.   <result property="gender" column="t_gender"/>


  17.   <result property="researchArea" column="research_area"/>


  18.  </association>


  19. </resultMap>

  20. <!-- SQL语句中以"#{}"的形式引用参数 -->


  21. <select id="getById" parameterType="int" resultMap="studentResultMap">


  22.  SELECT st.id,st.name,st.gender,st.major,st.grade,t.id t_id,t.name t_name,


  23.  t.gender t_gender,t.research_area  


  24.  FROM student st, teacher t


  25.  WHERE st.supervisor_id = t.id


  26.  AND st.id=#{id}


  27. </select> </mapper>

测试

  1. public void testAssociation(){


  2.  SqlSession session = sqlSessionFactory.openSession();


  3.  StudentOperationMapper studentOperationMapper = session.getMapper(StudentOperationMapper.class);


  4.  Student student = studentOperationMapper.getById(1);


  5.  System.out.println(student.getName()+"的指导老师是:"+student.getSupervisor().getName());


  6. }

myBatis association的两种形式

嵌套的resultMap

这种方法的本质就是把教师实体映射从association元素中提取出来,用一个resultMap元素表示。然后association元素再引用这个resultMap元素。

  1. <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  


  2. "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="net.zaodk.mybatis.mapper.StudentOperationMapper">


  3. <!-- 定义java Bean的属性与数据库的列之间的映射 -->


  4. <resultMap type="Teacher" id="teacherResultMap">


  5.  <id property="id" column="t_id"/>


  6.   <result property="name" column="t_name"/>


  7.   <result property="gender" column="t_gender"/>


  8.   <result property="researchArea" column="research_area"/>


  9. </resultMap>

  10. <resultMap type="Student" id="studentResultMap">


  11.  <id column="id" property="id" />


  12.  <result column="name" property="name" />


  13.  <result column="gender" property="gender" />


  14.  <result column="major" property="major" />


  15.  <result column="grade" property="grade"/>


  16.  <!-- 引用teacherResultMap -->

  17.  <association property="supervisor" resultMap="teacherResultMap"/>


  18. </resultMap>
  19. <!-- SQL语句中以"#{}"的形式引用参数 -->


  20. <select id="getById" parameterType="int" resultMap="studentResultMap">


  21.  SELECT st.id,st.name,st.gender,st.major,st.grade,t.id t_id,t.name t_name,


  22.  t.gender t_gender,t.research_area  


  23.  FROM student st, teacher t


  24.  WHERE st.supervisor_id = t.id


  25.  AND st.id=#{id}


  26. </select> </mapper>

嵌套的select语句

这种方式是使用一条单独的select语句来加载关联的实体(本例中就是教师实体),然后在association元素中引用此select语句(注:此方法会产生N+1问题,尽量不要用嵌套的select语句)

  1. <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  

  2. "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="net.zaodk.mybatis.mapper.StudentOperationMapper">


  3. <!-- 定义java Bean的属性与数据库的列之间的映射 -->


  4. <resultMap type="Teacher" id="supervisorResultMap">

  5.  <id property="id" column="t_id"/>


  6.   <result property="name" column="t_name"/>


  7.   <result property="gender" column="t_gender"/>


  8.   <result property="researchArea" column="research_area"/>


  9. </resultMap>

  10. <resultMap type="Student" id="studentResultMap">


  11.  <id column="id" property="id" />


  12.  <result column="name" property="name" />


  13.  <result column="gender" property="gender" />


  14.  <result column="major" property="major" />


  15.  <result column="grade" property="grade"/>


  16.  <!-- 引用teacherResultMap -->

  17.  <association property="supervisor" column="supervisor_id" select="selectSupervisor"/>


  18. </resultMap>

  19. <!-- SQL语句中以"#{}"的形式引用参数 -->


  20. <select id="getById" parameterType="int" resultMap="studentResultMap">


  21.  select id,name,gender,major,grade,supervisor_id from student where id =#{id}

  22. </select>
  23. <select id="selectSupervisor" parameterType="int" resultMap="supervisorResultMap">


  24.  select id,name,gender,research_area


  25.  from teacher where id = #{id}


  26. </select> </mapper>

Mybatis中的association用法的更多相关文章

  1. Java-MyBatis-杂项: MyBatis 中 in 的用法2

    ylbtech-Java-MyBatis-杂项: MyBatis 中 in 的用法2 1.返回顶部 1. 一.简介 在SQL语法中如果我们想使用in的话直接可以像如下一样使用: select * fr ...

  2. Java-MyBatis:MyBatis 中 in 的用法

    ylbtech-Java-MyBatis-杂项:MyBatis  中  in 的用法 1.返回顶部 1. foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元 ...

  3. Mybatis中使用association进行关联的几种方式

    这里以一对一单向关联为例.对使用或不使用association的配置进行举例.  实体类: @Data @ToString @NoArgsConstructor public class IdCard ...

  4. mybatis中foreach的用法(转)

    foreach一共有三种类型,分别为List,[](array),Map三种. foreach属性 属性 描述 item 循环体中的具体对象.支持属性的点路径访问,如item.age,item.inf ...

  5. mybatis 中 if else 用法

    mybaits 中没有 else 要用 chose when otherwise 代替 下面就是MyBatis中的if....else...表示方法 <choose> <when t ...

  6. Mybatis中使用association及collection进行自关联示例(含XML版与注解版)

    XML版本: 实体类: @Data @ToString @NoArgsConstructor public class Dept { private Integer id; private Strin ...

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

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

  8. mybatis中collection association优化使用及多参数传递

    mybatis都会用,但要优雅的用就不是那么容易了 今天就简单举例,抛砖引玉,供大家探讨 1.主表 CREATE TABLE `test_one` ( `id` int(11) NOT NULL AU ...

  9. mybatis中 == 和 != 的用法

    != 的用法 <if test="xxx != null and xxx !=''"> == 的用法(相较于!=,仅需将双引号和单引号的位置换一下即可) <if ...

随机推荐

  1. 通过 SCQA 的框架来讲故事

    SCQA:Situation情景.Complication冲突.Question疑问. Answer回答   SCQA模型是一个"结构化表达"工具,是麦肯锡咨询顾问芭芭拉·明托在& ...

  2. NOI2019退役记 upd:2019.12.1

    (我把原来写的东西全部删掉了) AFO. 我退役了,\(\mbox{yyb}\)退役了. 至少,在接下来的日子里,我得投身到文化课,度过快乐的高三生活了. 这两年的\(OI\)生涯给了我很多,让我学会 ...

  3. git登陆

    git登陆 1. 执行登陆用户名和密码命令 git config --global user.email "you@example.com" git config --global ...

  4. 多线程学习三:Thread API,ThreadLocal,synchronized,volatile和Condition

    一.Thread API: setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 首先要了解什么是Thread. ...

  5. django10-form表单组件

    1.form组件的主要功能 生成页面的HTML标签和样式 ,将前端form表单的代码放在后端生成!! 对用户提交的数据进行校验(正则) 自动生成错误信息 保留上次输入信息 2.form组件常用字段与插 ...

  6. 进度更新---Responsive Web Design Certification (300 hours)

    进度更新---Responsive Web Design Certification (300 hours) 已经完成: basic html and html5 basic css applied ...

  7. Dynamics CRM 中Web API中的深度创建(Deep Insert)

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  8. 依赖弹出框lhdaiglog的基于WebUploader批量上传图片

    初始上传界面 //链接添加弹窗 html代码段↓ var msgcontent = ""; msgcontent += '<ul class="linkAddBox ...

  9. 我写了个项目,帮你学习HTTP接口测试!

    端午节我写了一个项目,帮助你学习HTTP接口测试. GitHub地址: https://github.com/defnngj/learning-API-test 整个项目基于Flask和 Reques ...

  10. Web服务器—Nginx

    Nginx常用命令: 启动nginx服务 [root@localhost ~]# service nginx start [root@localhost ~]# systemctl start ngi ...