这篇文章我们将来学习一些 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. 有了faker,再也不用为了构造测试数据而烦恼啦!

    在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据.在手动制造数据的过程中,可能需要花费大量精力和工作量,此时可以借助Py ...

  2. Java开发桌面程序学习(六)——拖动文件获得文件路径

    拖动获得文件路径 在windows软件中,很多软件都提供了拖动文件的打开文件的功能,JavaFx中也是有这功能,是通过监听器来实现的 监听器 setOnDragDetected(new EventHa ...

  3. Implement Custom Business Classes and Reference Properties 实现自定义业务类和引用属性(XPO)

    In this lesson, you will learn how to implement business classes from scratch. For this purpose, the ...

  4. Android O的通知渠道适配

     在 Android O 以后,Google引入了通知通道的概念,如果目标API大于 Android O ,不直指定通知渠道是不能发送通知的. 这里放一个我写好的通知方法,大家可以适当的改改再用,*当 ...

  5. [转]国内阿里Maven仓库镜像Maven配置文件Maven仓库速度快

    原文地址:http://www.cnblogs.com/ae6623/p/4416256.html 国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以备用. ...

  6. c++ 多态的内幕

    c++ 多态,就是利用了一个二级指针(指针数组),数组里的每个元素都指向了,用virtual修饰的成员函数. 既然提到了指针,那就让我们用内存地址来证明一下吧. 为了证明,我们必须要取到成员函数的首地 ...

  7. VM虚拟机Android安装图形界面

    摘自,转 https://blog.csdn.net/weixin_42633191/article/details/89391188

  8. 01-Django 简介

    一.MVC框架(模型-视图-控制器缩写,软件的构建模式) 一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需 ...

  9. B/S架构与C/S架构(略讲)

    B/S架构基本概念 B/S是Browser/Server,即浏览器/服务器架构.Browser指的是Web浏览器,极少数事务逻辑在前端实现,但主要事务逻辑在服务器端实现. B/S三层体系结构可以定义为 ...

  10. jdk的一条命令查看运行参数

    jps 查看运行的java进程; jinfo <pid> 查看 jvm 配置参数