这篇文章我们将来学习一些 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. 07-Django模板(1)

    模板介绍 作为web框架,Django提供了模板,用于编写html代码(嵌入模板代码,更快更方便的完成页面开发,在通过视图中渲染模板,将最终生成的页面返回给浏览器(客户端)).模板是关于外表的渲染的, ...

  2. C++ getline函数用法详解

    转载自http://c.biancheng.net/view/1345.html 虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题. 当 cin 读取数 ...

  3. 用友的SPS定义

    基于标准产品的支持服务(Standard Product Support,SPS).主要包括:更新升级(软件补丁更新与产品升级).问题解决(产品问题在线或热线解析).知识转移(用友到客户的知识传递). ...

  4. C# read dll config

    public static SqlConnection GetSqlConnection() { Configuration myDllConfig = ConfigurationManager.Op ...

  5. windows环境下安装配置MongoDB

    版本选择MongoDB的版本命名规范如:x.y.z: y为奇数时表示当前版本为开发版,如:2.3.0.2.1.1: y为偶数时表示当前版本为稳定版,如:2.0.1.2.2.0: 目前官网上最新的版本为 ...

  6. Python爬取Boss直聘,帮你获取全国各类职业薪酬榜

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

  7. DQL---条件查询、单行函数、多行函数、分组函数、数据类型

    一.DQL 1.基本规则: (1)对于日期型数据,做 *,/ 运算不合法,可以进行 +, - 运算.比如给日期加一天或减一个月,结果仍为一个日期.两个日期间只能为减法,返回两个日期相差的天数,两个日期 ...

  8. whistle手机调试工具使用简单教程

    npm全局安装 npm install -g whistle 全局启动 w2 start 启动之后,输入127.0.0.1:8899 就可以访问到whistle调试界面了: 我们主要常用几个功能: 1 ...

  9. 创建Npm脚手架

    1工具 l  Npm ( https://nodejs.org/en/ ) l  Yeoman (npm install -g yo) l  generator-generator (npm inst ...

  10. 解决vue中百度地图覆盖物引用本地图片问题

    这次的主要目的是在百度地图中引用自定义的覆盖物,路径是再asset/images/文件夹下,直接引用出错.需要先导入再引用. 在<script></script>代码中增加如下 ...