Mybatis查询之resultMap和resultType区别

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

结论

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中,因此查询后将不再出现重复数据,达到了去重的效果













版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233918.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号