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

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‘);??

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>??


其中的一个测试用例:

  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修改后:

  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





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。