`

MyBatis映射文件的resultMap如何做表关联

阅读更多

MyBatis的核心是其映射文件,SqlMap文件,里面配置了项目中用到了什么SQL语句,和数据库相关的逻辑都在这个映射文件里.顾名思义,映射文件就是对Java对象和SQL的映射.这里简单介绍一下映射文件中resultMap的用法:resultMap – 它描述如何将结果集映射到Java对象.
resultMap属性:type为java实体类;id为此resultMap的标识:<resultMap id="BaseResultMap" type="com.test.mybatis.vo.MybatisOrder" >
resultMap的子元素:
id – 一般对应到数据库中该行的ID,设置此项可以提高Mybatis性能.
result – 映射到JavaBean 的某个"简单类型"属性,String,int等.
association – 映射到JavaBean 的某个"复杂类型"属性,其他JavaBean类.
collection –复杂类型集合,a collection of complex types
比如现在有一个Order表,Customer表和OrderItem表,它们之间的关系为:一个Order关联到一个Customer(单向关联),一个Order有多个OrderItem(双向关联).

对应的Java对象文件为,

 

[html] view plaincopy
 
  1. public class MybatisOrder {  
  2.     ....  
  3.     private Mybatiscustomer customer;  
  4.     private List<MybatisOrderItem> itemList;  
  5.     ....  
  6. public class MybatisOrderItem {  
  7.     private MybatisOrder order;  
  8.     ...  

对应的mapper文件为:
MybatiscustomerMapper.xml:

[html] view plaincopy
 
  1. <resultMap id="AssociationSelectMap" type="com.test.mybatis.vo.MybatisOrder" >  
  2.     <id column="ORDERID" property="orderid" jdbcType="DECIMAL" />  
  3.     <result column="ORDERTYPE" property="ordertype" jdbcType="VARCHAR" />  
  4.     <result column="ORDERDATE" property="orderdate" jdbcType="DATE" />  
  5.     <association property="customer" column="CUSTOMERID"   
  6.         select="com.test.mybatis.mapper.MybatiscustomerMapper.getCustomerByID"/>   
  7.     <collection property="itemList" column="ORDERID" javaType="ArrayList" ofType="MybatisOrderItem"   
  8.         select="com.test.mybatis.mapper.MybatisOrderItemMapper.selectItemsByOrderID"/>  
  9. </resultMap>  
  10. <select id="getOrderByID" resultMap="AssociationSelectMap" parameterType="java.math.BigDecimal" >  
  11.     select *from MYBATISORDER where ORDERID = #{orderid,jdbcType=DECIMAL}  
  12. </select>  

MybatisOrderItemMapper.xml:

[html] view plaincopy
 
  1.  <resultMap id="AssociationMap" type="com.test.mybatis.vo.MybatisOrderItem" >  
  2.    <id column="ITEMID" property="itemid" jdbcType="DECIMAL" />  
  3.    <result column="ITEMTYPE" property="itemtype" jdbcType="VARCHAR" />  
  4.    <result column="ITEMQUANTITY" property="itemquantity" jdbcType="VARCHAR" />  
  5.    <result column="ITEMCOST" property="itemcost" jdbcType="VARCHAR" />  
  6.    <association property="order" column="ORDERID"   
  7. select="com.test.mybatis.mapper.MybatisOrderMapper.getOrderByID"/>   
  8.  </resultMap>  
  9.  <select id="selectItemByID" resultMap="AssociationMap" parameterType="java.math.BigDecimal" >  
  10.    select *from MYBATISORDERITEMwhere ITEMID = #{itemid,jdbcType=DECIMAL}  
  11.  </select>  

MybatiscustomerMapper.xml:因为不和别的表做关联,只有简单的id,result配置.

[html] view plaincopy
 
  1. <resultMap id="BaseResultMap" type="com.test.mybatis.vo.Mybatiscustomer" >  
  2.   <id column="ID" property="id" jdbcType="DECIMAL" />  
  3.   <result column="NAME" property="name" jdbcType="VARCHAR" />  
  4. </resultMap>  
  5. <select id="getCustomerByID" resultMap="BaseResultMap" parameterType="java.math.BigDecimal" >  
  6.   select *from MYBATISCUSTOMER where ID = #{id,jdbcType=DECIMAL}  
  7. </select>  

 

MybatisOrderMapper的getOrderByID会先从MYBATISORDER取数据,然后根据CUSTOMERID调用MybatiscustomerMapper.getCustomerByID,然后根据ORDERID调用MybatisOrderItemMapper.selectItemsByOrderID,对应每一条MYBATISORDER数据,都会分别访问另外两个表各一次.
通过将association和collection的select功能替换为resultMap,再用join方式的SQL可以用一条SQL语句将关联数据取出来:

 

[html] view plaincopy
 
  1.  <resultMap id="AssociationResultMap" type="com.test.mybatis.vo.MybatisOrder" >  
  2.    <id column="ORDERID" property="orderid" jdbcType="DECIMAL" />  
  3.    <result column="ORDERTYPE" property="ordertype" jdbcType="VARCHAR" />  
  4.    <result column="ORDERDATE" property="orderdate" jdbcType="DATE" />  
  5.   
  6. <association property="customer" column="CUSTOMERID"   
  7.     resultMap="com.test.mybatis.mapper.MybatiscustomerMapper.BaseResultMap"/>   
  8. <collection property="itemList" column="ORDERID" javaType="ArrayList"   
  9.     ofType="com.test.mybatis.vo.MybatisOrderItem"   
  10.     resultMap="com.test.mybatis.mapper.MybatisOrderItemMapper.BaseResultMap"/>  
  11.  </resultMap>  
  12.  <select id="getOrderAssociation" parameterType="String" resultMap="AssociationResultMap">    
  13.     SELECT *    
  14.       FROM mybatisOrder ord LEFT JOIN mybatiscustomer customer ON ord.customerId = customer.ID   
  15.       LEFT JOIN mybatisOrderItem item ON ord.orderid = item.orderid   
  16.      WHERE ord.orderid = #{id}  
  17.   </select>   

 

分享到:
评论

相关推荐

    Mybatis高级-resultMap之collection聚集

    接下来,在MyBatis的映射文件中定义了`resultMap`元素,用于描述数据库结果集与Java对象之间的映射关系: ```xml &lt;!--dpsMatchPlanDetailResultVOMap列表--&gt; &lt;resultMap id="DetailResultVOMap" type=...

    MyBatis关联映射代码

    "关联映射"是MyBatis中的一个重要概念,用于处理数据库中表之间的关联关系,比如一对一、一对多、多对一和多对多的关系。下面将详细介绍MyBatis的关联映射以及如何在代码中实现。 关联映射是MyBatis通过XML配置文件...

    mybatis-demo4-resultMap手动映射.zip

    在MyBatis中,ResultMap是核心配置之一,它用于定义如何将数据库查询结果映射到Java对象。ResultMap的概念是为了提高数据映射的灵活性和效率,避免了简单类型的数据映射过程中的冗余代码。在`mybatis-demo4-...

    mybatis教程之resultmap_动力节点Java学院整理

    MyBatis ResultMap 详解 MyBatis 中的 ResultMap 是一个强大的元素,它描述如何从...ResultMap 是 MyBatis 中一个非常强大的元素,它可以帮助开发者快速地将结果集映射到 Java 实体类中,从而提高开发效率和代码质量。

    mybatis3--4.resultMap高级映射

    ResultMap是MyBatis映射语句中用于定义结果集映射的元素。它允许我们精确控制如何将数据库查询的结果行映射到Java对象。默认情况下,MyBatis会尝试根据结果列名与Java对象的属性名进行匹配,但这种方式并不总是可行...

    Mybatis-03 SQL映射文件

    其中,`namespace`属性是映射器接口的全限定类名,用于关联映射器接口和XML文件。 2. **增删改查操作** - **Insert**:插入数据,使用`&lt;insert&gt;`标签定义SQL语句,并通过`id`属性指定唯一的操作标识。 - **...

    实现Mybatis框架中一对多关联映射的查询操作。

    - 在对应的UserMapper.xml文件中,编写SQL查询语句,并进行关联映射配置。这里会使用`&lt;resultMap&gt;`定义映射规则,`&lt;association&gt;`标签来处理一对多关系。 ```xml &lt;resultMap id="userWithOrdersMap" type="User...

    Mybatis resultMap

    ResultMap的设计旨在提高灵活性,解决对象与数据库表之间的映射问题,尤其是在面对一对多、多对一或自关联等复杂关系时。 ResultMap 的工作原理是通过定义字段到对象属性的映射规则,使得Mybatis能够将SQL查询的...

    Mybatis关联映射

    - 在Mapper XML文件中编写SQL查询语句,并使用`resultMap`来配置关联映射规则。 ##### 2. 自关联查询 - **概念**: 指的是同一类对象之间的关联查询,如菜单项与其子菜单项之间的关联。 - **实现**: - 在实体类中...

    Springboot中mybatis表关联映射关系(一对一)

    Springboot 中 MyBatis 表关联映射关系(一对一) 在 Springboot 中,MyBatis 提供了强大的表关联映射关系机制,可以实现一对一、多对一、多对多等各种关联关系。在本文中,我们将详细介绍 Springboot 中 MyBatis ...

    Mybatis 实体类+Mapper实体映射文件+接口+Config主配置文件+测试类

    此外,Mybatis还支持ResultMap,允许自定义复杂的结果映射,处理一对一、一对多、多对多等复杂的关联关系。 总的来说,这个资源包提供了一个完整的Mybatis应用示例,涵盖了从实体类到数据库操作的整个流程,对于...

    根据MyBatis的ResultMap生成增删改sql

    ResultMap是MyBatis的核心组件之一,用于解决对象关系映射的复杂性,比如一对一、一对多、多对多等关联关系的处理。 首先,ResultMap的概念。ResultMap是MyBatis中定义的一种映射规则,用于解析查询结果并将其映射...

    基于java的企业级应用开发:MyBatis的关联映射.ppt

    MyBatis使用`&lt;resultMap&gt;`元素的`&lt;association&gt;`子元素来处理一对一的关联映射。配置`&lt;association&gt;`时,可以设置`property`属性来指定映射到实体类的对象属性,`column`用于指定数据库中的字段,`javaType`定义对象...

    MyBatis的关联映射

    1. **外键关联**:在从表中有一个字段指向主表的主键,我们可以在主表的映射文件中添加`&lt;association&gt;`标签,指定关联的子类和关联的字段。 2. **主键关联**:主表的主键同时也是从表的一个字段,此时在从表的映射...

    Mybatis高级映射查询

    2. 映射文件与 XML 映射元素:Mybatis 的映射文件通常以 `.xml` 结尾,如 `mybatis3.xml`,它包含了 SQL 语句和结果集映射。在映射文件中,`&lt;select&gt;`, `&lt;insert&gt;`, `&lt;update&gt;`, `&lt;delete&gt;` 元素分别对应 SQL 的查询...

    MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    在本篇关于MyBatis框架的学习中,我们将深入探讨一对一关联映射和一对多关联映射的概念、配置以及在实际开发中的应用。MyBatis是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或者注解中,从而...

    MyBatis高级映射(多对多查询)

    1. **配置映射文件**:在MyBatis的映射文件中,你需要定义两个实体类(例如,Student和Course)的映射,以及它们之间的关联映射。关联映射通常通过`&lt;association&gt;`或`&lt;collection&gt;`标签来实现。 2. **关联查询**:...

    mybatis 高级映射实例

    在本高级映射实例中,我们将深入探讨如何使用XML方式编写Mapper文件,以及如何利用关联嵌套和鉴别器(Discriminator)功能。 首先,让我们了解MyBatis中的Mapper文件。Mapper文件是MyBatis的核心组件之一,它定义了...

    完整版 Java开发实训课程系列-MyBatis框架技术 03.MyBatis关联映射查询与缓存配置(共25页).pptx

    【MyBatis框架关联映射查询与缓存配置】 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在Java开发中,MyBatis简化了DAO(Data Access Object)层的开发工作,使得开发者能够更专注于...

Global site tag (gtag.js) - Google Analytics