MyBatis映射文件的resultMap如何做表级联查询

2024-02-13 04:38

本文主要是介绍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对象文件为,

public class MybatisOrder {....private Mybatiscustomer customer;private List<MybatisOrderItem> itemList;....
public class MybatisOrderItem {private MybatisOrder order;...

 对应的mapper文件为:

MybatisOrderMapper.xml:

<resultMap id="AssociationSelectMap" type="com.test.mybatis.vo.MybatisOrder" ><id column="ORDERID" property="orderid" jdbcType="DECIMAL" /><result column="ORDERTYPE" property="ordertype" jdbcType="VARCHAR" /><result column="ORDERDATE" property="orderdate" jdbcType="DATE" /><association property="customer" column="CUSTOMERID" select="com.test.mybatis.mapper.MybatiscustomerMapper.getCustomerByID"/> <collection property="itemList" column="ORDERID" javaType="ArrayList" ofType="MybatisOrderItem" select="com.test.mybatis.mapper.MybatisOrderItemMapper.selectItemsByOrderID"/>
</resultMap>
<select id="getOrderByID" resultMap="AssociationSelectMap" parameterType="java.math.BigDecimal" >select *from MYBATISORDER where ORDERID = #{orderid,jdbcType=DECIMAL}
</select>

 MybatisOrderItemMapper.xml:

  <resultMap id="AssociationMap" type="com.test.mybatis.vo.MybatisOrderItem" ><id column="ITEMID" property="itemid" jdbcType="DECIMAL" /><result column="ITEMTYPE" property="itemtype" jdbcType="VARCHAR" /><result column="ITEMQUANTITY" property="itemquantity" jdbcType="VARCHAR" /><result column="ITEMCOST" property="itemcost" jdbcType="VARCHAR" /><association property="order" column="ORDERID" select="com.test.mybatis.mapper.MybatisOrderMapper.getOrderByID"/> </resultMap><select id="selectItemByID" resultMap="AssociationMap" parameterType="java.math.BigDecimal" >select *from MYBATISORDERITEMwhere ITEMID = #{itemid,jdbcType=DECIMAL}</select>

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

  <resultMap id="BaseResultMap" type="com.test.mybatis.vo.Mybatiscustomer" ><id column="ID" property="id" jdbcType="DECIMAL" /><result column="NAME" property="name" jdbcType="VARCHAR" /></resultMap><select id="getCustomerByID" resultMap="BaseResultMap" parameterType="java.math.BigDecimal" >select *from MYBATISCUSTOMER where ID = #{id,jdbcType=DECIMAL}</select>

 MybatisOrderMapper的getOrderByID会先从MYBATISORDER取数据,然后根据CUSTOMERID调用MybatiscustomerMapper.getCustomerByID,然后根据ORDERID调用MybatisOrderItemMapper.selectItemsByOrderID,对应每一条MYBATISORDER数据,都会分别访问另外两个表各一次.

通过将association和collection的select功能替换为resultMap,再用join方式的SQL可以用一条SQL语句将关联数据取出来:

  <resultMap id="AssociationResultMap" type="com.test.mybatis.vo.MybatisOrder" ><id column="ORDERID" property="orderid" jdbcType="DECIMAL" /><result column="ORDERTYPE" property="ordertype" jdbcType="VARCHAR" /><result column="ORDERDATE" property="orderdate" jdbcType="DATE" /><association property="customer" column="CUSTOMERID" resultMap="com.test.mybatis.mapper.MybatiscustomerMapper.BaseResultMap"/> <collection property="itemList" column="ORDERID" javaType="ArrayList" ofType="com.test.mybatis.vo.MybatisOrderItem" resultMap="com.test.mybatis.mapper.MybatisOrderItemMapper.BaseResultMap"/></resultMap><select id="getOrderAssociation" parameterType="String" resultMap="AssociationResultMap">  SELECT *  FROM mybatisOrder ord LEFT JOIN mybatiscustomer customer ON ord.customerId = customer.ID LEFT JOIN mybatisOrderItem item ON ord.orderid = item.orderid WHERE ord.orderid = #{id}</select> 

 

这篇关于MyBatis映射文件的resultMap如何做表级联查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/704495

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

mybatis-plus如何根据任意字段saveOrUpdateBatch

《mybatis-plus如何根据任意字段saveOrUpdateBatch》MyBatisPlussaveOrUpdateBatch默认按主键判断操作类型,若需按其他唯一字段(如agentId、pe... 目录使用场景方法源码方法改造首先在service层定义接口service层接口实现总结使用场景my

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I