zoukankan      html  css  js  c++  java
  • Mybatis 示例之 Association

    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





  • 相关阅读:
    python flask api
    理解傅里叶变换
    数学建模笔记
    (java)Ansj分词器,Stanford分词器,Jieba分词器,NLPIR汉语分词系统
    《数学之美》读书笔记
    浅谈对机器学习方法(决策树,SVM,knn最近邻,随机森林,朴素贝叶斯、逻辑回归)的理解以及用sklearn工具实现文本分类和回归方法
    《大话数据挖掘》学习笔记——案例教学法
    py调用另一个py
    ros树梅派4bmpu6050
    cleaningrobot_planing
  • 原文地址:https://www.cnblogs.com/wang3680/p/8f4df17fa6f40f4c21f1e56b024a0f03.html
Copyright © 2011-2022 走看看