开发者社区> yemon> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Mybatis 示例之 Association

简介:
+关注继续查看

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


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


  • association – 一个复杂的类型关联;许多结果将包成这种类型
    • 嵌入结果映射 – 结果映射自身的关联,或者参考一个

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


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



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


SQL表结构和数据:

[sql] view plain copy
 在CODE上查看代码片派生到我的代码片
  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');  

Mapper.xml文件:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  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>  


其中的一个测试用例:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  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.  }  

cars返回值:



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


上面XML中的
carResult和engieResult,brakesResult都是分别定义,carResult引用了另外两个resultMap。
对于不需要重用嵌套对象的情况,还可以直接这么写,把上面的XML修改后:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  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>  
为了对比和区分,这里指修改了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(一)
Mybatis相关介绍
86 0
Mybatis
介绍:         它是一个插件,是一个持久化插件         帮我们简化数据库的操作         mybatis的好处就是可以自定义sql让sq变得很灵活 工程创建: mybatis-config.
1410 0
Mybatis
       Mybatis:是一个持久层框架是用来和关系型数据库进行交互的,java和数据库交互使用jdbc驱动进行连接Mybatis对jdbc进行了封装以便我们更加方便的使用.使用jdbc来进行数据库交互需要创建驱动,建立连接connect,创建statement,参数设置,结果检索等.
1177 0
Mybatis 缓存
简介 一般来说,应用处理请求的速度取决于CPU与应用内存。为了加速我们的应用,我们一般会采取如下措施: 改善应用的算法性能 多台机器,多个CPU进行并行计算 升级CPU等 在应用中,我们需要减少对数据库的访问次数,因为获取数据需要花费时间,如果用能临时的储存获取的数据,供下次再次利用,那对我们将有一些帮助。
1106 0
后台(35)——MyBatis入门示例
探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分...
1099 0
+关注
65
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载