`

MyBatis association的两种形式

阅读更多

 

一、嵌套的resultMap

      这种方法本质上就是上篇博文介绍的方法,只是把教师实体映射从association元素中提取出来,用一个resultMap元素表示。然后association元素再引用这个resultMap元素。修改上篇博文示例的StudentMapper.xml如下:
<?xml version="1.0" encoding="utf8"?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
     <mapper namespace="com.abc.mapper.StudentMapper"> 
        
     <select id="getById" parameterType="int"  resultMap="studentResultMap"> 
          select s.id s_id,  
                 s.name s_name,  
                 s.gender s_gender,  
                 s.major s_major,  
                 s.grade s_grade,  
                 t.id t_id,  
                 t.name t_name,  
                 t.gender t_gender,  
                 t.title t_title,  
                 t.research_area t_research_area  
          from student s left join teacher t  
          on s.supervisor_id = t.id  
          where s.id=#{id}  
     </select> 
 
     <resultMap id="studentResultMap" type="Student"> 
          <id property="id" column="s_id"/> 
          <result property="name" column="s_name"/> 
          <result property="gender" column="s_gender"/> 
          <result property="major" column="s_major"/>   
          <result property="grade" column="s_grade"/> 
            
          <!--使用resultMap属性引用下面的教师实体映射--> 
          <association property="supervisor" javaType="Teacher" 
          resultMap="supervisorResultMap"/> 
            
     </resultMap> 
       
     <!--教师实体映射--> 
     <resultMap id="supervisorResultMap" type="Teacher"> 
         <id property="id" column="t_id"/> 
         <result property="name" column="t_name"/> 
         <result property="gender" column="t_gender"/> 
         <result property="researchArea" column="t_research_area"/>   
         <result property="title" column="t_title"/> 
     </resultMap> 
           
   </mapper> 
 
 在这里,为了让select语句更加清晰可读,每个字段都使用了别名。association元素的属性javaType="Teacher"可以不要,不像上篇博文示例那样,没有此属性即报错。这大概是因为引用的resultMap元素已经指明了映射的类型为“Teacher”。另外,今天偶然发现,把StudentMapper.xml的encoding属性由“UTF-8”改为“utf8”即可添加中文注释。
      运行结果如下:
 

      这种方式的好处是此resultMap元素可在其它地方被重用(可在博文下方附件下载处下载示例源码)。

二、嵌套的select语句

      这种方式是使用一条单独的select语句来加载关联的实体(在本例中就是教师实体),然后在association元素中引用此select语句。修改StudentMapper.xml如下:
<?xml version="1.0" encoding="utf8"?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
     <mapper namespace="com.abc.mapper.StudentMapper"> 
        
     <select id="getById" parameterType="int"  resultMap="studentResultMap"> 
          select id,name,gender,major,grade,supervisor_id from student where id=#{id}  
     </select> 
 
     <select id="selectSupervisor" parameterType="int"  resultMap="supervisorResultMap"> 
          select id,name,gender,title,research_area  
          from teacher where id=#{id}  
     </select> 
 
     <resultMap id="studentResultMap" type="Student"> 
          <id property="id" column="id"/> 
          <result property="name" column="name"/> 
          <result property="gender" column="gender"/> 
          <result property="major" column="major"/>   
          <result property="grade" column="grade"/> 
            
          <!--column="supervisor_id"不能少。此列的值作为参数  
          传递给要引用的select语句,用来查询相应学生的指导教师  
          的信息。select属性指定要引用的select语句--> 
          <association property="supervisor" javaType="Teacher" 
          column="supervisor_id" select="selectSupervisor"/> 
     </resultMap> 
       
     <!--教师实体映射--> 
     <resultMap id="supervisorResultMap" type="Teacher"> 
         <id property="id" column="id"/> 
         <result property="name" column="name"/> 
         <result property="gender" column="gender"/> 
         <result property="researchArea" column="research_area"/>   
         <result property="title" column="title"/> 
     </resultMap> 
           
   </mapper> 
 

       association元素的属性javaType="Teacher"也可以不要,这大概也是因为引用的select语句中已经指明了要用到的resultMap。

分享到:
评论

相关推荐

    mybatis-association.zip

    4. **懒加载与立即加载**:MyBatis 提供了懒加载和立即加载两种策略。懒加载会在真正需要关联数据时才执行查询,而立即加载则在初始加载主对象时一并加载关联数据。这可以通过 `fetchType` 属性来设置。 5. **关联...

    Mybatis基于注解和XML两种方式的单(多)表操作 源码。(使用MySQL数据库)

    本项目涵盖了 Mybatis 基于注解和 XML 的两种方式,来实现对单表和多表的操作,特别适合初学者进行学习和实践。 首先,我们来探讨基于注解的单表操作。在 Mybatis 中,我们可以使用 @Mapper 和 @Select、@Insert、@...

    mybatis两个重要的dtd文件 batis-3-config.dtd mybatis-3-mapper.dtd

    MyBatis是一个流行的Java持久层框架,它简化了数据库操作,通过XML或注解的方式将SQL与Java代码绑定,提供了一种简洁的API来处理数据库交互。在MyBatis中,`batis-3-config.dtd` 和 `mybatis-3-mapper.dtd` 是两个至...

    mybatis利用association或collection传递多参数子查询

    在MyBatis中,association和collection是两种常用的标签,用于实现延迟加载和子查询。association标签用于实现一对一查询,而collection标签用于实现一对多查询。 使用association标签 association标签用于实现一...

    mybatis知识点.docx

    在 MyBatis 中,数据库列名和实体类属性名不一致是一个常见的问题,可以使用以下两种方式来解决: * 开启驼峰命名法:可以将数据库列名映射到实体类属性名。 * 使用 @Column 注解:可以将数据库列名映射到实体类...

    MyBatis的关联映射

    本篇文章将深入探讨这三种关系以及如何通过嵌套查询和嵌套结果两种方式在MyBatis中实现它们。 ### 一对一关系映射 一对一关系通常存在于主从表或者详细信息与基本信息之间。在MyBatis中,可以通过`&lt;resultMap&gt;`...

    Mybatis中collection和association的使用区别详解

    在 Mybatis 中,Collection 和 Association 是两个重要的概念,它们都是用于描述对象之间的关系,但是它们之间有着很大的区别。 Association 在 Mybatis 中,Association 是用于描述一对一或多对一的关系。它通常...

    MyBatis3.2.4完全自学手册

    #### 四、MyBatis开发中的两种方式 在使用MyBatis进行开发时,有两种主要方式: 1. **基于XML映射文件**:这是传统的使用方式,适合于复杂查询场景。在该方式下,SQL语句写在XML映射文件中,并通过Java接口调用...

    Mybatis高级映射查询

    3. 参数映射:Mybatis 支持两种参数映射方式,分别是传入 Java 对象和 Map。使用 `@Param` 注解可以为传入的参数命名,便于在 SQL 中引用。对于 Map 参数,键作为参数名,值作为参数值。 4. resultMap:`...

    mybatis 基础代码(非spring)

    - MyBatis支持两种参数映射方式:`#`和`$`。前者用于预编译参数,后者将参数直接拼接在SQL字符串中。通常推荐使用预编译参数以防止SQL注入。 8. **事务控制**: - 由于该项目没有整合Spring,事务管理需要手动...

    MyBatis3DTD约束

    MyBatis3DTD约束是MyBatis框架中用于定义XML映射文件的一种规范,它描述了XML文件的结构和元素。DTD(Document Type Definition)是XML文档类型定义,用于规定XML文档的合法构建块,包括元素、属性以及它们之间的...

    mybatis关联映射源码

    总的来说,MyBatis的关联映射功能提供了灵活且强大的方式来处理复杂的对象关系。通过深入理解并实践`chapter10_oneToOne`、`chapter10_oneToMany`和`chapter10_ManyToMany`中的例子,你将能够熟练地在项目中应用这些...

    springmybatis

    1. 在MyBatis 里面创建两个源码目录,分别为 src_user,test_src, 用如下方式建立,鼠标右键点击 JavaResource. 2. 设置mybatis 配置文件:Configuration.xml, 在src_user目录下建立此文件,内容如下: 程序代码 程序...

    MyBatis 3.2.3中文版SDK

    - MyBatis提供了本地缓存和二级缓存两种方式,可以提高数据读取速度。本地缓存只存在于SqlSession生命周期内,而二级缓存可以跨SqlSession共享数据。 6. **插件支持**: - MyBatis允许开发者编写拦截器插件,对...

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

    在MyBatis中,一对一查询主要通过以下两种方式实现: 1. 映射文件配置:在MyBatis的Mapper XML文件中,我们可以使用`&lt;resultMap&gt;`标签定义一个结果映射,然后使用`&lt;association&gt;`标签来指定一对一的关系。`...

    mybatis笔记

    可以通过`&lt;typeAliases&gt;`标签进行配置,支持单个别名定义和包扫描两种方式。 #### 四、接口映射配置 - **接口映射**:MyBatis支持通过接口来映射SQL语句,这种方式称为DAO模式。通过定义接口并在映射文件中引用该...

    尚硅谷_myBatis

    6. **参数映射**:myBatis支持两种参数映射方式,一种是通过注解@Param来指定参数名,另一种是在XML映射文件中使用`&lt;parameterMap&gt;`和`&lt;parameter&gt;`元素。 7. **缓存机制**:myBatis内置了两级缓存,一级缓存是...

    MyBatis中文参考文档

    4. Executor执行器:负责执行SQL,有简单和分页两种模式。 5. ParameterHandler参数处理器:处理SQL语句中的参数。 6. ResultSetHandler结果集处理器:处理查询结果,将其转化为Java对象。 二、MyBatis主要功能 1. ...

    MyBatis关联映射代码

    关联映射分为嵌套查询(Nested Select)和嵌套结果(Nested ResultMap)两种方式。 1. 嵌套查询:在查询主表数据时,通过子查询来获取关联的子表数据。这种方式通常用于一对多关系,例如一个用户有多个订单。在XML...

    MyBatis一对多映射

    MyBatis提供两种加载方式:立即加载(Eager)和懒加载(Lazy)。默认情况下,MyBatis采用立即加载策略,即在查询主表时同时加载关联的从表数据。如果希望延迟加载,可以在`&lt;collection&gt;`标签中设置`fetchType="lazy...

Global site tag (gtag.js) - Google Analytics