这篇文章我们将来学习一些 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. 开发常用Git/Linux/idea命令快捷键总结(持续更新)

    在开发过程中,会使用越来越多的命令,或快捷键,来帮助我们提高工作效率.本文记录了我在平时积累的常用命令,分享给大家. git命令 基本命令 set LESSCHARSET=utf-8 --idea T ...

  2. Koa 提交和接收 JSON 表单数据

    来自 url 中的 query 参数可直接通过 context.query 获取,但 POST 方式提交的表单数据则需要借助中间件的解析来完成,比如 koa-bodyparser. 首先准备好一个表单 ...

  3. 在生成.net core 3.0程序时不包含nuget库

    在.net core 3.0中,默认的生成行为有了两个变化,一个是默认生成可执行文件,另一个是会复制依赖的Nuget项. 前一个变化会默认生成可执行的exe,用起来更加方便了.另一个变化可能是为了减少 ...

  4. 故事2:.net程序员成长经历

    啊,最近一段时间在学习asp.net mvc ,一直没有接着写了,加上白天工作很忙,每天都很辛苦的哈,那咱接着说上一个故事哈. 当时第二天开始复习java面试题,非常的期待,从来没有去过公司,不知道别 ...

  5. abp实战-ContosoUniversity Abp版-2添加菜单与创建实体

    这里略过理论篇,但需要了解abp分层,对于小项目来说abp分层有点复杂,这里只是演示,个别地方没有完全按照ddd理论去写,后期我将会完善. 1. 创建ContosoUniversity相关功能的菜单 ...

  6. 用Python程序批量删除excel里面的图片

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

  7. PLC与外接按钮开关接线方法图解

    一个电机控制电路如图1所示,电路中使用常开按钮启动电机,用常闭按钮停止电机运行,图1中KM是控制电机电源的继电器.这样的电路若是使用PLC时的外接线图如图2所示.同时为使PLC运行,在PLC中输入由图 ...

  8. java核心技术第三篇之JDBC第一篇

    01.JDBC_两个重要的概念: 1).什么是数据库驱动程序:由数据库厂商提供,面向某种特定的编程语言所开发的一套访问本数据库的类库. 驱动包一般由两种语言组成,前端是:面向某种特定编程语言的语言:后 ...

  9. C#中对文件File常用操作方法的工具类

    场景 C#中File类的常用读取与写入文件方法的使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99693983 注: 博客 ...

  10. crm-3权限

    1.权限基本实现 rbac: rbac基于角色的权限控制 ,权限本质就是url 权限表: url列表 角色表: 一个角色固定访问一些url的地址 用户表: 用户可以绑定角色 ,用户拥有了角色的权限 生 ...