这篇文章我们将来学习一些 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. ActiveMQ是什么,为什么使用MQ

    是基于 Java 中的 JMS 消息服务规范实现的一个消息中间件. 1.系统解耦 采用中间件之后,就可以完美解决上述中因为耦合可能导致的问题.系统 A 不用去 关心下层服务调用方的问题. 2. 异步调 ...

  2. 安装keepalived OpenSSL is not properly installed on your system. !!!

    错误信息: configure: error: !!! OpenSSL is not properly installed on your system. !!! !!! Can not includ ...

  3. 前端之CSS1

    CSS基本语法和引入方式 CSS介绍 为了让网页元素的样式更加丰富,也为了让网页的内容和样式能拆分开,CSS由此而诞生,CSS是 Cascading Style Sheets 的首字母缩写,意思是层叠 ...

  4. C# redis StackExchange

    1.Install-Package StackExchange -v 2.0.601 2.using StackExchange.Redis; 3. static void StackExchange ...

  5. SpringBoot(六) SpringBoot整合Swagger2(自动化生成接口文档)

    一:在上篇文章pom增加依赖: <dependency> <groupId>io.springfox</groupId> <artifactId>spr ...

  6. 你不知道的JS第一卷

    这两天,开始看你不知道的JavaScript,第一卷.

  7. 查找字段的筛选-使用addCustomView

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复231或者20161031可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  8. [20191013]oracle number类型存储转化脚本.txt

    [20191013]oracle number类型存储转化脚本.txt --//测试看看是否可以利用bc obase=100的输出解决问题.另外以前脚本忘记考虑尾数的四舍五入问题.--//也许编程就是 ...

  9. 5-4 可视化库Seaborn-回归分析

    In [2]: %matplotlib inline import numpy as np import pandas as pd from scipy import stats,integrate ...

  10. 封装查找元素以及集成日志输出,Base模块

    关于查找元素封装,Base模块 """ Selenium 封装基类 封装查找元素以及集成日志输出 """ from HTMLReport i ...