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. list组件

    <?xml version="1.0"?> <!-- Simple example to demonstrate the Spark List component ...

  2. ComboBox绑定Dictionary做为数据源

    http://www.cnblogs.com/refresh/archive/2012/07/14/2591503.html https://msdn.microsoft.com/zh-cn/libr ...

  3. shell脚本字符串截取

    假设有变量 var=http://www.google.com/test.htm 一 # 号截取,删除左边字符,保留右边字符.echo ${var#*//}其中 var 是变量名,# 号是运算符,*/ ...

  4. php mysql 实现消息队列

    最近遇到一个批量发送短信的需求,短信接口是第三方提供的.刚开始想到,获取到手机号之后,循环调用接口发送不就可以了吗? 但很快发现问题:当短信数量很大时,不仅耗时,而且成功率很低. 于是想到,用PHP和 ...

  5. 每隔一秒自动执行函数(JavaScript)

    http://www.cnblogs.com/xlx0210/archive/2010/03/19/1689497.html 1. setInterval() ——每隔一秒自动执行方法,setInte ...

  6. 【转】从1到N这N个数中1的出现了多少次?

    给定一个十进制整数N,求出从1到N的所有整数中出现"1"的个数. 例如:N=2,1,2出现了1个"1". N=12,1,2,3,4,5,6,7,8,9,10,1 ...

  7. HDU 2209 翻纸牌游戏

    翻纸牌游戏 Time Limit : 9000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  8. Hibernate一级缓存和二级缓存深度比较

    1.什么是缓存 缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据, ...

  9. Android Studio ADB响应失败解决方法(2CTo.com)

    当启动Android Studio时,如果弹出 adb not responding. you can wait more,or kill "adb.exe" process ma ...

  10. 编程实现prim算法和Dijkstra算法。

    网址链接:http://blog.csdn.net/anialy/article/details/7603170