body
{
font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif;
font-size: 10.5pt;
line-height: 1.5;
}
html, body
{

}
h1 {
font-size:1.5em;
font-weight:bold;
}
h2 {
font-size:1.4em;
font-weight:bold;
}
h3 {
font-size:1.3em;
font-weight:bold;
}
h4 {
font-size:1.2em;
font-weight:bold;
}
h5 {
font-size:1.1em;
font-weight:bold;
}
h6 {
font-size:1.0em;
font-weight:bold;
}
img {
border:0;
max-width: 100%;
}
blockquote {
margin-top:0px;
margin-bottom:0px;
}
table {
border-collapse:collapse;
border:1px solid #bbbbbb;
}
td {
border-collapse:collapse;
border:1px solid #bbbbbb;
}

Mybatis 示例之 Association - 偶尔记一下 - 博客频道 - CSDN.NET

接下来的文章中,关于Mybatis的示例,全部来自于Mybatis代码中的单元测试代码,通过这些代码能够学习Mybatis中很有用的知识,
这些内容在doc文档中可能只是简单提到了,或者有一些文字说明,通过这些单元测试能更直观的了解如何在Mybatis使用这些内容。

这一节内容为Association关联的结果查询,就是在查询出结果后,根据查询的列和resultMap定义的对应关系,来创建对象并写入值。

  • association – 一个复杂的类型关联;许多结果将包成这种类型

    • 嵌入结果映射 – 结果映射自身的关联,或者参考一个

(注:“参考一个”,这里参考一个是通过对象的Key来唯一确定的,如果Key值一样,就直接用已经存在的这个对象。)

association是resultMap中的一个配置选项,下面是用到的类的UML图:

Car对象中包含了Engine和Brakes两个对象。Mapper是接口对象。AssociationTest是该测试对象。

SQL表结构和数据:

  1. drop table cars if exists;  
  2.   
  3. create table cars (  
  4.   carid integer,  
  5.   cartype varchar(20),  
  6.   enginetype varchar(20),  
  7.   enginecylinders integer,  
  8.   brakestype varchar(20)  
  9. );  
  10.   
  11. insert into cars (carid, cartype, enginetype, enginecylinders, brakestype) values(1, 'VW',   'Diesel', 4,    null);  
  12. insert into cars (carid, cartype, enginetype, enginecylinders, brakestype) values(2, 'Opel',    null,    null, 'drum');  
  13. insert into cars (carid, cartype, enginetype, enginecylinders, brakestype) values(3, 'Audi', 'Diesel', 4,    'disk');  
  14. insert into cars (carid, cartype, enginetype, enginecylinders, brakestype) values(4, 'Ford', 'Gas',    8,    'drum');  
drop table cars if exists;

create table cars (
carid integer,
cartype varchar(20),
enginetype varchar(20),
enginecylinders integer,
brakestype varchar(20)
); insert into cars (carid, cartype, enginetype, enginecylinders, brakestype) values(1, 'VW', 'Diesel', 4, null);
insert into cars (carid, cartype, enginetype, enginecylinders, brakestype) values(2, 'Opel', null, null, 'drum');
insert into cars (carid, cartype, enginetype, enginecylinders, brakestype) values(3, 'Audi', 'Diesel', 4, 'disk');
insert into cars (carid, cartype, enginetype, enginecylinders, brakestype) values(4, 'Ford', 'Gas', 8, 'drum');

Mapper.xml文件:

  1. <mapper namespace="org.apache.ibatis.submitted.associationtest.Mapper">  
  2.   
  3.     <resultMap type="org.apache.ibatis.submitted.associationtest.Car" id="carResult">  
  4.         <id column="carid" property="id"/>  
  5.         <result column="cartype" property="type"/>  
  6.         <association property="engine" resultMap="engineResult"/>  
  7.         <association property="brakes" resultMap="brakesResult"/>  
  8.     </resultMap>  
  9.     <resultMap type="org.apache.ibatis.submitted.associationtest.Engine" id="engineResult">  
  10.         <result column="enginetype" property="type"/>  
  11.         <result column="enginecylinders" property="cylinders"/>  
  12.     </resultMap>  
  13.     <resultMap type="org.apache.ibatis.submitted.associationtest.Brakes" id="brakesResult">  
  14.         <result column="brakesType" property="type"/>  
  15.     </resultMap>  
  16.   
  17.     <select id="getCars" resultMap="carResult">  
  18.     select * from cars  
  19.   </select>  
  20.   
  21.     <select id="getCarsNonUnique" resultMap="carResult">  
  22.     select 1 as carid, cartype, enginetype, enginecylinders, brakestype from cars  
  23.   </select>  
  24.   
  25.     <select id="getCars2" resultMap="carResult">  
  26.     select 1 as carid, cartype, enginetype, enginecylinders, brakestype from cars where carid in (1,2)  
  27.   </select>  
  28.   
  29. </mapper>  
<mapper namespace="org.apache.ibatis.submitted.associationtest.Mapper">

    <resultMap type="org.apache.ibatis.submitted.associationtest.Car" id="carResult">
<id column="carid" property="id"/>
<result column="cartype" property="type"/>
<association property="engine" resultMap="engineResult"/>
<association property="brakes" resultMap="brakesResult"/>
</resultMap>
<resultMap type="org.apache.ibatis.submitted.associationtest.Engine" id="engineResult">
<result column="enginetype" property="type"/>
<result column="enginecylinders" property="cylinders"/>
</resultMap>
<resultMap type="org.apache.ibatis.submitted.associationtest.Brakes" id="brakesResult">
<result column="brakesType" property="type"/>
</resultMap> <select id="getCars" resultMap="carResult">
select * from cars
</select> <select id="getCarsNonUnique" resultMap="carResult">
select 1 as carid, cartype, enginetype, enginecylinders, brakestype from cars
</select> <select id="getCars2" resultMap="carResult">
select 1 as carid, cartype, enginetype, enginecylinders, brakestype from cars where carid in (1,2)
</select> </mapper>

其中的一个测试用例:

  1. @Test  
  2.  public void shouldGetAllCars() {  
  3.    SqlSession sqlSession = sqlSessionFactory.openSession();  
  4.    try {  
  5.      Mapper mapper = sqlSession.getMapper(Mapper.class);  
  6.      List<Car> cars = mapper.getCars();  
  7.      Assert.assertEquals(4, cars.size());  
  8.      Assert.assertEquals("VW", cars.get(0).getType());  
  9.      Assert.assertNotNull(cars.get(0).getEngine());  
  10.      Assert.assertNull(cars.get(0).getBrakes());  
  11.      Assert.assertEquals("Opel", cars.get(1).getType());  
  12.      Assert.assertNull(cars.get(1).getEngine());  
  13.      Assert.assertNotNull(cars.get(1).getBrakes());  
  14.    } finally {  
  15.      sqlSession.close();  
  16.    }  
  17.  }  
 @Test
public void shouldGetAllCars() {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
Mapper mapper = sqlSession.getMapper(Mapper.class);
List<Car> cars = mapper.getCars();
Assert.assertEquals(4, cars.size());
Assert.assertEquals("VW", cars.get(0).getType());
Assert.assertNotNull(cars.get(0).getEngine());
Assert.assertNull(cars.get(0).getBrakes());
Assert.assertEquals("Opel", cars.get(1).getType());
Assert.assertNull(cars.get(1).getEngine());
Assert.assertNotNull(cars.get(1).getBrakes());
} finally {
sqlSession.close();
}
}

cars返回值:

association是嵌套查询中最简单的一种情况,像上述例子中,一般我们都会用一个Car对面包含所有的属性,这里的例子使用了嵌套对象,使对像的结构更鲜明。不过一般情况下很少会拆分一个对象为多个,用的多的时候是多表查询的嵌套。

上面XML中的

carResult和engieResult,brakesResult都是分别定义,carResult引用了另外两个resultMap。

对于不需要重用嵌套对象的情况,还可以直接这么写,把上面的XML修改后:

  1. <resultMap type="org.apache.ibatis.submitted.associationtest.Car" id="carResult">  
  2.     <id column="carid" property="id"/>  
  3.     <result column="cartype" property="type"/>  
  4.     <association property="engine" javaType="org.apache.ibatis.submitted.associationtest.Engine">  
  5.         <result column="enginetype" property="type"/>  
  6.         <result column="enginecylinders" property="cylinders"/>  
  7.     </association>  
  8.     <association property="brakes" resultMap="brakesResult"/>  
  9. </resultMap>  
    <resultMap type="org.apache.ibatis.submitted.associationtest.Car" id="carResult">
<id column="carid" property="id"/>
<result column="cartype" property="type"/>
<association property="engine" javaType="org.apache.ibatis.submitted.associationtest.Engine">
<result column="enginetype" property="type"/>
<result column="enginecylinders" property="cylinders"/>
</association>
<association property="brakes" resultMap="brakesResult"/>
</resultMap>

为了对比和区分,这里指修改了Engine,在association元素上增加了属性javaType,元素内增加了result映射。

如果有association方面问题可以参考(或在此留言):

http://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html

本节源码请看官方git:

https://github.com/mybatis/mybatis-3/tree/master/src/test/java/org/apache/ibatis/submitted/associationtest

Mybatis 示例之 Association - 偶尔记一下 - 博客频道 - CSDN.NET的更多相关文章

  1. Boost::Thread使用示例 - CG-Animation - 博客频道 - CSDN.NET

    Boost::Thread使用示例 - CG-Animation - 博客频道 - CSDN.NET Boost::Thread使用示例 分类: C/C++ 2011-07-06 14:48 5926 ...

  2. boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET

    boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET     boost::crc_32_type crc32;       crc32. ...

  3. 让 QtWebkit 支持跨域CROS - nowboy的CSDN博客 - 博客频道 - CSDN.NET

    让 QtWebkit 支持跨域CROS - nowboy的CSDN博客 - 博客频道 - CSDN.NET 让 QtWebkit 支持跨域CROS 2013-05-23 22:05 450人阅读 评论 ...

  4. ibatis 学习笔记 3 - pfpfpfpfpf的专栏 - 博客频道 - CSDN.NET

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  5. Cannot call sendError() after the response has been committed - baiyangliu - 博客频道 - CSDN.NET

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  6. 最牛B的编码套路 - 呦呦鹿鸣 - 博客频道 - CSDN.NET

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  7. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  8. Notepad++前端开发常用插件介绍 - BorisHuai前端修炼 - 博客频道 - CSDN

    Notepad++前端开发常用插件介绍 - BorisHuai前端修炼 - 博客频道 - CSDN.NET http://blog.csdn.net/borishuai/article/details ...

  9. 帧与场 - djf_1985的专栏 - 博客频道 - CSDN.NET

    帧与场 - djf_1985的专栏 - 博客频道 - CSDN.NET 电视信号是通过摄像机对自然景物的扫描并经光电转换形成的.扫描方式分为“逐行扫描”和“隔行扫描”.“逐行扫描”指每幅图像均是由电子 ...

随机推荐

  1. Photoshop 字体

    字体类型: 宋体系列:北宋年间 超粗宋.粗宋,大标宋.小标宋/中宋.宋体 黑体系列:建国初期 (当时写标语,识别度高) 超粗黑 大黑/黑体 中等线/细黑 --广告.画册.宣传册 非正规场合 文字工具( ...

  2. 倒计时demo

    #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (strong,nonatom ...

  3. 浅谈SQL Server 对于内存的管理

    简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...

  4. zTree异步加载并初始化树时全部展开(贴主要代码)

    <%@page pageEncoding="UTF-8"%> <%@include file="/commons/include/html_doctyp ...

  5. JAVA-基本知识

    1.JAVA跨平台 其实就是在每个平台上要安装对应该操作系统的JVM,JVM负责解析执行,即实现了跨平台.JVM是操作系统与java程序之间的桥梁. 2.JRE:java运行环境,包含JVM+核心类库 ...

  6. json的学习笔记

    json比较简单,所以先从json开始学起. 一 json的名称: json的全称是javascript object notation,中文名称为js 对象表示法. json的定义:json是一种轻 ...

  7. 转Android 用Animation-list实现逐帧动画

    Android 用Animation-list实现逐帧动画     第一步:先上图片素材,以下素材放到res/drawable目录下: http://blog.csdn.net/aminfo/arti ...

  8. Android中购物车的全选、反选、问题和计算价格

    此Demo主要解决的是购物车中的全选,反选计算价格和选中的条目个数的问题,当选中几条时,点击反选,会把当先选中的变为不选中,把不选中的变为选中.点击全选会全部选中,再次点击时,变为全部不选中. //- ...

  9. JS-DOM操作应用高级(一)

    表格应用--tBodies  tHead  tFoot  rows  cells <title>无标题文档</title> <script> window.onlo ...

  10. Map 根据value 排序

    总是有特殊的需求 ,呵呵 ,一起看看Map 根据value 排序的一个例子吧,还用到了泛型 很不错 此文仅供自己记录笔记. /** * hashmap 根据值排序 */ public static & ...