方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集,封装联表查询的数据(去除重复的数据)
  SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}

方式二:嵌套查询,通过执行另外一个SQL 映射语句来返回预期的复杂类型
  SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
  SELECT t.tid id, t.tname name FROM teacher t WHERE t.tid = #{id} //使用上面查到的tid


2种都用到了resultMap和association(关联),区别:

方式1中的association中,用到javaType,代表关联的实体类型

方式2中的association中,不用javaType,但是用到column(代表第一条sql查询的结果的外键作为第二条sql的查询条件)和select(第二条sql语句)


实例:

有班级class[id, name, teacher],对应的老师teacher[id, name],它们的关系是一对一。

插入表数据:

--teacher表
INSERT INTO `mybatis`.`teacher`(`tid`,`tname`) VALUES ( NULL,'老师A');
INSERT INTO `mybatis`.`teacher`(`tid`,`tname`) VALUES ( NULL,'老师B');
--class表
INSERT INTO `mybatis`.`class`(`cid`,`cname`,`tid`) VALUES ( NULL,'一年级','');
INSERT INTO `mybatis`.`class`(`cid`,`cname`,`tid`) VALUES ( NULL,'二年级','');

Java实体类:

public class Teacher {
private int id;
private String name; public Teacher() {
super();
}
public Teacher(int id, String name) {
super();
this.id = id;
this.name = name;
}
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;
}
@Override
public String toString() {
return "Teacher [id=" + id + ", name=" + name + "]";
} }
public class Clazz {
private int id;
private String name;
private Teacher teacher; public Clazz(int id, String name, Teacher teacher) {
super();
this.id = id;
this.name = name;
this.teacher = teacher;
}
public Clazz() {
super();
}
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 Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "Clazz [id=" + id + ", name=" + name + ", teacher=" + teacher
+ "]";
} }

第一种方式: 嵌套结果,使用嵌套结果映射来处理重复的联合结果的子集,封装联表查询的数据(去除重复的数据)

SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}

teacherMapper.xml:

<!-- 查询班级及其老师信息 -->
<select id="getClazz" parameterType="int" resultMap="getClazzMap">
SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
</select> <resultMap type="Clazz" id="getClazzMap">
<id property="id" column="cid"/>
<result property="name" column="cname"/>
<!-- 关联班级对应的teacher -->
<association property="teacher" javaType="Teacher">
<id property="id" column="tid"/>
<result property="name" column="tname"/>
</association>
</resultMap>

Java测试类:

/**
* 方式一:嵌套结果
* @author 魅力_小生
*
*/
@Test
public void getClazz1(){
//创建session,设置事务为true
SqlSession session = MyBatisUtil.getSessionFactory().openSession(true);
String statement = "com.mlxs.mybatis.test4.clazzMapper.getClazz";
Clazz clazz = session.selectOne(statement, "2");
System.out.println("clazz--->"+clazz);
session.close();
}

结果:

clazz--->Clazz [id=2, name=二年级, teacher=Teacher [id=2, name=老师B]]

第二种方式:嵌套查询,通过执行另外一个SQL 映射语句来返回预期的复杂类型

SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
SELECT t.tid id, t.tname name FROM teacher t WHERE t.tid = #{id} //使用上面查到的tid

teacherMapper.xml:

<!--
一对一 关联查询: 方式二:嵌套查询,通过执行另外一个SQL 映射语句来返回预期的复杂类型
SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
SELECT t.tid id, t.tname name FROM teacher t WHERE t.tid = #{id} //使用上面查到的tid
-->
<!-- 查询班级及其老师信息 -->
<select id="getClazz2" parameterType="int" resultMap="getClazzMap2">
SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
</select>
<select id="getTeacher" parameterType="int" resultType="Teacher">
SELECT t.tid id, t.tname name FROM teacher t WHERE t.tid = #{id}
</select> <resultMap type="Clazz" id="getClazzMap2">
<id property="id" column="cid"/>
<result property="name" column="cname"/>
<!-- 关联班级对应的teacher,将查询class表返回的tid参数传给getTeacher,也就是getTeacher中的#{id} -->
<association property="teacher" column="tid" select="getTeacher"/>
</resultMap>

Java测试类:

/**
* 方式二:嵌套查询,通过执行另外一个SQL 映射语句来返回预期的复杂类型
SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
SELECT t.tid id, t.tname name FROM teacher t WHERE t.tid = #{id} //使用上面查到的tid
* @author 魅力_小生
*
*/
@Test
public void getClazz2(){
//创建session,设置事务为true
SqlSession session = MyBatisUtil.getSessionFactory().openSession(true);
String statement = "com.mlxs.mybatis.test4.clazzMapper.getClazz2";
Clazz clazz = session.selectOne(statement, "2");
System.out.println("clazz--->"+clazz);
session.close();
}

结果:

clazz--->Clazz [id=1, name=一年级, teacher=Teacher [id=1, name=老师A]]

5.mybatis一对一表关联查询的更多相关文章

  1. 三、mybatis多表关联查询和分布查询

    前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...

  2. JAVA入门[9]-mybatis多表关联查询

    概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...

  3. mybatis多表关联查询之resultMap单个对象

    resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...

  4. MyBatis 多表关联查询

    多表关联查询 一对多 单条SQL实现. //根据部门编号查询出部门和部门成员姓名public dept selectAll() thorws Excatipon; //接口的抽象方法 下面是对应接口的 ...

  5. Mybatis多表关联查询字段值覆盖问题

    一.错误展示 1.首先向大家展示多表关联查询的返回结果集 <resultMap id="specialdayAndWorktimeMap type="com.hierway. ...

  6. spring boot 2使用Mybatis多表关联查询

    模拟业务关系:一个用户user有对应的一个公司company,每个用户有多个账户account. spring boot 2的环境搭建见上文:spring boot 2整合mybatis 一.mysq ...

  7. 三、Mybatis多表关联查询应用

    一对一查询 实现语句:select * from neworder o, user u where o.uid = u.id 实体Order: 接口: 配置: 测试: 一对多查询 实现语句:selec ...

  8. MyBatis学习总结(三)——多表关联查询与动态SQL

    在上一章中我们学习了<MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射>,这一章主要是介绍一对一关联查询.一对多关联查询与动态SQL等内容. 一.多表关联查询 表与 ...

  9. Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!

    之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...

随机推荐

  1. Bind[Exclude|Include]排除字段或只允许字段验证

    public ActionResult xx([Bind(Exclude = "id")] xxModel xx, HttpPostedFileBase file)//排除id验证 ...

  2. 【Pro ASP.NET MVC 3 Framework】.学习笔记.3.MVC的主要工具-单元测试

    IProductRepository接口定义了一个仓库,我们通过它获得.更新Product对象.IPriceReducer接口指定了一个功能,它将要对所有的Products实施,通过一个参数,降低他们 ...

  3. error:could not open D:\java\jre1.8\lib\i386\jvm.cfg

    复制一份jre到eclipse的目录下就可以了.

  4. 怎么样 解决nginx负载均衡的session共享问题呢

    php服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态,下面提供了几种方式来解决ses ...

  5. 霸气的jQ插件

    http://codepen.io/ canvas的各种实例 1.The Responsive jQuery Content Slider http://bxslider.com/ 2.ThemePu ...

  6. WIN7 64位系统注册银行支付组件

    WIN7 64位系统注册银行支付组件目前只尝试注册了银联的chinapay.dll和工行的icbcebankutil.dll 1.将dll文件拷贝到windows\syswow64\文件夹下(Win7 ...

  7. js笔记---封装一般运动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 错误Mybatis 元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id*,result*,association*,collection*,discriminat

    今天算是见识了什么事顺序的重要性. 在使用mybatis时由于联合了其他的表,用到了resultMap,之后外加association这一项.可是在替换对应字段的位置上加上association总是报 ...

  9. java中MD5加密的小使用

    最近项目中需要用到md5加密,就自己在网上看了看. package com.wxgs.ch01; import java.security.MessageDigest; import java.sec ...

  10. Basic 分类: POJ 2015-08-03 15:49 3人阅读 评论(0) 收藏

    Basic Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 905 Accepted: 228 Description The p ...