Mybatis查询之resultMap和resultType区别

2024-06-22 05:32

本文主要是介绍Mybatis查询之resultMap和resultType区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

结论

resultType:适合使用返回值得数据类型是非自定义的,即jdk的提供的类型,resultType中的内容就是pojo在本项目中的位置。当使用resultType做SQL语句返回结果类型处理时,对于SQL语句查询出的字段在相应的pojo中必须有和它相同的字段对应,因此对于单表查询的话resultType是最合适的。


resultMap:适合使用返回值是自定义实体类的情况,如果在写pojo时,不想用数据库表中定义的字段名称,也是可以使用resultMap进行处理对应的。多表连接查询时,若是一对一的连接查询,那么需要新建一个pojo,pojo中包括两个表中需要查询出的所有的字段,这个地方的处理方式通常为创建一个继承一个表字段的pojo,再在里面添加另外一个表内需要查询出的字段即可。若是一对多查询时,若是使用内连接查询,则很可能出现查询出的字段有重复。使用双重for循环嵌套处理即可。

映射实体类的数据类型

resultMap的唯一标识

column: 库表的字段名

property: 实体类里的属性名


实战举例

配置映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:当前库表映射文件的命名空间,唯一的不能重复 -->
<mapper namespace="com.hao947.sql.mapper.PersonMapper">  <!-- type:映射实体类的数据类型 id:resultMap的唯一标识 -->  <resultMap type="person" id="BaseResultMap">   <!-- column:库表的字段名 property:实体类里的属性名 -->   <id column="person_id" property="personId" />   <result column="name" property="name" />   <result column="gender" property="gender" />   <result column="person_addr" property="personAddr" />   <result column="birthday" property="birthday" />  </resultMap>  <!--id:当前sql的唯一标识   parameterType:输入参数的数据类型   resultType:返回值的数据类型   #{}:用来接受参数的,如果是传递一个参数#{id}内容任意,如果是多个参数就有一定的规则,采用的是预编译的形式select   * from person p where p.id = ? ,安全性很高 -->
 
  <!-- sql语句返回值类型使用resultMap -->
 <select id="selectPersonById" parameterType="java.lang.Integer"   resultMap="BaseResultMap">   select * from person p where p.person_id = #{id}  </select>
 
  <!-- resultMap:适合使用返回值是自定义实体类的情况  resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型 -->  <select id="selectPersonCount" resultType="java.lang.Integer">   select count(*) from   person  </select>  <select id="selectPersonByIdWithMap" parameterType="java.lang.Integer"   resultType="java.util.Map">   select * from person p where p.person_id= #{id}   </select> </mapper>

实体类Person.Java

<pre name="code" class="java">package com.hao947.model;
import java.util.Date; public class Person {  private Integer personId;  private String name;  private Integer gender;  private String personAddr;  private Date birthday;  @Override  public String toString() {   return "Person [personId=" + personId + ", name=" + name + ", gender="     + gender + ", personAddr=" + personAddr + ", birthday="     + birthday + "]";  } }

resultMap:当使用resultMap做SQL语句返回结果类型处理时,通常需要在mapper.xml中定义resultMap进行pojo和相应表字段的对应。

[java]  view plain copy
  1. <!-- 订单查询关联用户的resultMap  
  2.     将整个查询的结果映射到cn.itcast.mybatis.po.Orders中  
  3.      -->  
  4.     <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">  
  5.         <!-- 配置映射的订单信息 -->  
  6.         <!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id  
  7.             column:订单信息的唯 一标识 列  
  8.             property:订单信息的唯 一标识 列所映射到Orders中哪个属性  
  9.           -->  
  10.         <id column="id" property="id"/>  
  11.         <result column="user_id" property="userId"/>  
  12.         <result column="number" property="number"/>  
  13.         <result column="createtime" property="createtime"/>  
  14.         <result column="note" property="note"/>         
  15.     </resultMap>  

resultMap对于一对一表连接的处理方式通常为在主表的pojo中添加嵌套另一个表的pojo,然后在mapper.xml中采用association节点元素进行对另一个表的连接处理。例如:

[html]  view plain copy
  1. <!-- 订单查询关联用户的resultMap  
  2.     将整个查询的结果映射到cn.itcast.mybatis.po.Orders中  
  3.      -->  
  4.     <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">  
  5.         <!-- 配置映射的订单信息 -->  
  6.         <!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id  
  7.             column:订单信息的唯 一标识 列  
  8.             property:订单信息的唯 一标识 列所映射到Orders中哪个属性  
  9.           -->  
  10.         <id column="id" property="id"/>  
  11.         <result column="user_id" property="userId"/>  
  12.         <result column="number" property="number"/>  
  13.         <result column="createtime" property="createtime"/>  
  14.         <result column="note" property=note/>  
  15.           
  16.         <!-- 配置映射的关联的用户信息 -->  
  17.         <!-- association:用于映射关联查询单个对象的信息  
  18.         property:要将关联查询的用户信息映射到Orders中哪个属性  
  19.          -->  
  20.         <association property="user"  javaType="cn.itcast.mybatis.po.User">  
  21.             <!-- id:关联查询用户的唯 一标识  
  22.             column:指定唯 一标识用户信息的列  
  23.             javaType:映射到user的哪个属性  
  24.              -->  
  25.             <id column="user_id" property="id"/>  
  26.             <result column="username" property="username"/>  
  27.             <result column="sex" property="sex"/>  
  28.             <result column="address" property="address"/>  
  29.           
  30.         </association>  
  31.     </resultMap>  

若是一对多的表连接方式,比如订单表和订单明细表即为一对多连接,若是不对sql语句进行处理,由于一个订单对应多条订单明细,因此查询出的结果对于订单表数据来说将会出现重复,例如:

resultMap的处理方式为在订单表数据的pojo中添加一个list,list中为订单明细表的属性,在mapper.xml中采用如下的处理方式:

[html]  view plain copy
  1. !-- 订单及订单明细的resultMap  
  2.     使用extends继承,不用在中配置订单信息和用户信息的映射  
  3.      -->  
  4.     <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">  
  5.         <!-- 订单信息 -->  
  6.         <!-- 用户信息 -->  
  7.         <!-- 使用extends继承,不用在中配置订单信息和用户信息的映射 -->  
  8.           
  9.           
  10.         <!-- 订单明细信息  
  11.         一个订单关联查询出了多条明细,要使用collection进行映射  
  12.         collection:对关联查询到多条记录映射到集合对象中  
  13.         property:将关联查询到多条记录映射到cn.itcast.mybatis.po.Orders哪个属性  
  14.         ofType:指定映射到list集合属性中pojo的类型  
  15.          -->  
  16.          <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">  
  17.             <!-- id:订单明细唯 一标识  
  18.             property:要将订单明细的唯 一标识 映射到cn.itcast.mybatis.po.Orderdetail的哪个属性  
  19.               -->  
  20.             <id column="orderdetail_id" property="id"/>  
  21.             <result column="items_id" property="itemsId"/>  
  22.             <result column="items_num" property="itemsNum"/>  
  23.             <result column="orders_id" property="ordersId"/>  
  24.          </collection>  
  25.           
  26.       
  27.     </resultMap>  

在查询时,虽然一条订单信息对应多条订单明细,由于将多条信息明细存储到了list中,因此查询后将不再出现重复数据,达到了去重的效果





这篇关于Mybatis查询之resultMap和resultType区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

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的版本

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

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

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片