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

表结构

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

 `id` int(11) NOT NULL auto_increment,

 `name` varchar(10) NOT NULL,

 `gender` char(1) NOT NULL,

 `major` varchar(20) NOT NULL,

 `grade` char(4) NOT NULL,

 `supervisor_id` int(11) NOT NULL,

 PRIMARY KEY  (`id`)

) 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` (

 `id` int(11) NOT NULL auto_increment,

 `name` varchar(10) NOT NULL,

 `gender` char(1) NOT NULL,

 `research_area` varchar(20) NOT NULL,

 PRIMARY KEY  (`id`)

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

对应的java bean

public class Student { 

private int id;  

private String name;     // 姓名

private String gender;   // 性别

private String major;    // 专业

private String grade;    // 年级

private Teacher supervisor; //指导教师  

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 String getGender() {


 return gender;


}


public void setGender(String gender) {

 this.gender = gender;


}


public String getMajor() {


 return major;


}


public void setMajor(String major) {


 this.major = major;


}


public String getGrade() {


 return grade;


}


public void setGrade(String grade) {


 this.grade = grade;


}


public Teacher getSupervisor() {


 return supervisor;


}


public void setSupervisor(Teacher supervisor) {


 this.supervisor = supervisor;


}


}


public class Teacher {


private int id;    

private String name;               // 教师姓名


private String gender;        // 教师性别


private String researchArea;    // 研究领域


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

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 String getGender() {


 return gender;


}


public void setGender(String gender) {


 this.gender = gender;


}


public String getResearchArea() {


 return researchArea;


}


public void setResearchArea(String researchArea) {


 this.researchArea = researchArea;


}


public List<Student> getSupStudents() {


 return supStudents;


}


public void setSupStudents(List<Student> supStudents) {


 this.supStudents = supStudents;


}


}

mapper

<?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="net.zaodk.mybatis.mapper.StudentOperationMapper">


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


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

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


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


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

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


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


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

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


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


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


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


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


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


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


 </association>


</resultMap>

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


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


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


 t.gender t_gender,t.research_area  


 FROM student st, teacher t


 WHERE st.supervisor_id = t.id


 AND st.id=#{id}


</select> </mapper>

测试

public void testAssociation(){ 


 SqlSession session = sqlSessionFactory.openSession();


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


 Student student = studentOperationMapper.getById(1);


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


}

myBatis association的两种形式

嵌套的resultMap

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

<?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="net.zaodk.mybatis.mapper.StudentOperationMapper">


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


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


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


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


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


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


</resultMap>

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


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


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


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


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


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


 <!-- 引用teacherResultMap -->

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


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


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


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


 t.gender t_gender,t.research_area  


 FROM student st, teacher t


 WHERE st.supervisor_id = t.id


 AND st.id=#{id}


</select> </mapper>

嵌套的select语句

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

<?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="net.zaodk.mybatis.mapper.StudentOperationMapper">


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


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

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


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


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


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


</resultMap>

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


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


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


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


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


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


 <!-- 引用teacherResultMap -->

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


</resultMap>

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


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


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

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


 select id,name,gender,research_area


 from teacher where id = #{id}


</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. 一、Mybatis配置详解

    Mybatis配置详解 XML配置文件层次结构 下图展示了mybatis-config.xml的全部配置元素 properties元素 properties是一个配置属性的元素,让我们能在配置文件的上 ...

  2. Kubernetes容器日志收集

    日志采集方式 日志从传统方式演进到容器方式的过程就不详细讲了,可以参考一下这篇文章Docker日志收集最佳实践,由于容器的漂移.自动伸缩等特性,日志收集也就必须使用新的方式来实现,Kubernetes ...

  3. 简析 Golang IO 包

    简析 Golang IO 包 io 包提供了 I/O 原语(primitives)的基本接口.io 包中定义了四个最基本接口 Reader.Writer.Closer.Seeker 用于表示二进制流的 ...

  4. 2019-9-23-win10-uwp-睡眠唤醒

    原文:2019-9-23-win10-uwp-睡眠唤醒 title author date CreateTime categories win10 uwp 睡眠唤醒 lindexi 2019-9-23 ...

  5. Python使用数字与字符串的技巧

    1.少写数字字面量 "数字字面量(integer literal)" 是指那些直接出现在代码里的数字.它们分布在代码里的各个角落,比如代码 del users[0] 里的 0 就是 ...

  6. 用 Python 监控知乎和微博的热门话题

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: TED Crossin的编程教室 PS:如有需要Python学习资料 ...

  7. 总结了Python中的22个基本语法

    "人生苦短,我用Python".Python编程语言是最容易学习.并且功能强大的语言.只需会微信聊天.懂一点英文单词即可学会Python编程语言.但是很多人声称自己精通Python ...

  8. CAD画三维图怎么渲染?一分钟教你快速操作

    从事过CAD相关工作的都知道,CAD绘制的方式有二维平面图以及三维图形,三维图形,画三维图方式也是比较简单的.那当然三维图画完后一般还需要进行渲染操作,步骤也是比较简洁的.下面就来给大家操作一下CAD ...

  9. grep命令提示"binary file matches **.log"解决方法

    仔细想想,这个问题遇到很多次了,之前一直以为很复杂,一搜索发现解决这么简单,记录一下做备忘. grep test XXX.log Binary file app.log matches 此时使用-a参 ...

  10. Metasploit漏洞扫描

    Metasploit漏洞扫描 漏洞扫描是自动在目标中寻找和发现安全弱点. 漏洞扫描器会在网络上和对方产生大量的流量,会暴露自己的行为过程,如此就不建议你使用漏扫了. 基本的漏洞扫描 我们首先使用net ...