Mybatis 入门示例代码之 Association

 更新时间:2017年02月27日 16:37:55   作者:isea533  
这篇文章主要介绍了Mybatis 入门示例代码之 Association,需要的的朋友参考下

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

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

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

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

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

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

SQL表结构和数据:

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文件:

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

其中的一个测试用例:

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

<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,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • SpringMVC @RequestBody的使用解析

    SpringMVC @RequestBody的使用解析

    这篇文章主要介绍了SpringMVC @RequestBody的使用解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Activiti进阶之组任务实现示例详解

    Activiti进阶之组任务实现示例详解

    这篇文章主要为大家介绍了Activiti进阶之组任务实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 介绍Jersey-Jersey入门基础

    介绍Jersey-Jersey入门基础

    REST不是一种新的技术,而仅仅是一个理论,实践这样的理论可以让我们的应用更加先进。
    2013-02-02
  • Java实现二分查找的变种

    Java实现二分查找的变种

    这篇文章主要为大家详细介绍了Java实现二分查找的变种,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 微信小程序登录状态java后台解密

    微信小程序登录状态java后台解密

    这篇文章主要为大家详细介绍了微信小程序登录状态java后台解密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Springboot整合SpringSecurity的完整案例详解

    Springboot整合SpringSecurity的完整案例详解

    Spring Security是基于Spring生态圈的,用于提供安全访问控制解决方案的框架,Spring Security登录认证主要涉及两个重要的接口 UserDetailService和UserDetails接口,本文对Springboot整合SpringSecurity过程给大家介绍的非常详细,需要的朋友参考下吧
    2024-01-01
  • Java Http请求传json数据乱码问题的解决

    Java Http请求传json数据乱码问题的解决

    这篇文章主要介绍了Java Http请求传json数据乱码问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 一文带你学习Java中的线程

    一文带你学习Java中的线程

    线程是系统调度的最小单元,一个进程可以包含多个线程,线程是负责执行二进制指令的。本文将详细给大家介绍一下Java中的线程,,需要的朋友可以参考下
    2023-05-05
  • Kafka 日志存储实现过程

    Kafka 日志存储实现过程

    这篇文章主要为大家介绍了Kafka 日志存储的实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • JAVA微信扫码支付模式二线上支付功能实现以及回调

    JAVA微信扫码支付模式二线上支付功能实现以及回调

    本篇文章主要介绍了JAVA微信扫码支付模式二线上支付功能实现以及回调,这里整理了详细的代码,有需要的小伙伴可以参考下。
    2016-11-11

最新评论