Rumah  >  Artikel  >  Java  >  详细分析mybatis中resultType和resultMap的区别与联系

详细分析mybatis中resultType和resultMap的区别与联系

巴扎黑
巴扎黑asal
2017-07-17 13:21:583928semak imbas

在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解

 

比如,我们平时使用的单表查询,很多时候使用的就是resultType

下来,看一段代码吧

 1 package org.cxxy.base.cxsc.entity; 2  3 public class TbClass { 4     private Integer id; 5  6     private String classname; 7  8     private String deptname; 9 10     public Integer getId() {11         return id;12     }13 14     public void setId(Integer id) {15         this.id = id;16     }17 18     public String getClassname() {19         return classname;20     }21 22     public void setClassname(String classname) {23         this.classname = classname == null ? null : classname.trim();24     }25 26     public String getDeptname() {27         return deptname;28     }29 30     public void setDeptname(String deptname) {31         this.deptname = deptname == null ? null : deptname.trim();32     }33 }

上面的PO类我使用的是我的一个小Demo

下来开始贴我的XML Mapper

 

2fcf37cc8639c0835f2a112fe5f93a849eef2c25b88ca2d81d394f11ec96c407e7278c69b1e0021e9427bf255a0086f7bb49b36718ffba6c40aa7d011fafcc356ebaf93ccf0a7eb73abf17f5d66f496d

这个resultMap是对应的我的po类的属性

下来,贴出我的xml的单表查询statement

669abfcbe0c33fe8796fe4e80dcc38da
select 
 id, classname, deptname
from tb_class
where id = #{id,jdbcType=INTEGER}
18bb6ffaf0152bbe49cd8a3620346341
 <br>

parameterType代表的是输入参数(比如:select * from tb_class where id = "xxxx"),resultMap表示映射的结果集,从命名中也可以看到Map,当然是结果集了,

上述代码所代表的单表查询(一对一),当然,在一般开发的时候,像这种映射,我们一般会使用下述的写法

a2aa3edd282ebb7d674f208ca16e6482select 
 id, classname, deptname
from tb_class
where id = #{id,jdbcType=INTEGER}18bb6ffaf0152bbe49cd8a3620346341

即是说所得到的结果一样,一般在我们理解方面,尽量还是选择后者

但是如果根据客户的需求的变化,比如说写出了类的扩展类

org.cxxy.base.cxsc.entity.TbClassDatail

如果,在扩展类中引入了外类(其他的表的属性(和本类没有共同的属性)),我们可以使用resultMap,但是也并非完全

resultMap

定义po类
在Orders类中加入User属性。
在Orders类中加入List<Orderdetail> orderdetails属性

 订单查询清单

67b7af552f22717e0a27bb8ca8afddafSELECT
    orders.*,
    user.username,
    user.address,
    orderdetail.id orderdetail_id,
    orderdetail.items_id,
    orderdetail.items_num
    FROM orders,user,orderdetail
    WHERE orders.user_id = user.id
    AND orders.id = orderdetail.orders_id18bb6ffaf0152bbe49cd8a3620346341 

 08453ccc8c7ca3a3f48f07c76b1952a6

1bc9007c1b08a5a41bb5ee9be64a55c77cb486de3528c1e544b606da1e2164ae6cf1cda1774140b1bf7e54614c8f58e9e08450006b72f6e37b32564ebf7e3714e38a9cf50eb8e25da5892c8813ca0011a1a7d4d2b193733ef0c15d86ce05f5537d6d4df2e47d8c9389fee9b1f90ca509285d3778291c3d7aa6eafe5c70300921113aecbcc56d2525429c3d61b48a1d346cc0a7625caa65b9709a1e50bbd52c945e983f6196ee2a11899ac257ac4a761a62a82c88b9c7d4583fd468de5781adfc29510f87cb44cd62c70fc7046aedde68501f605e20e4cedea353a3c24c992da491fc0312a46e774fade754e0d6bf5f586ebaf93ccf0a7eb73abf17f5d66f496d

上面的代码,我是贴的某培训机构的订单查询代码,

  上面的实体类的关系是:Order----->User  一对一(一个用户一个订单)      Order------->OrderDetail  一对多(一个订单有多条订单明细)

像这种的一对多、多对多查询的映射,我们尽量使用resultMap

注:collection 标签是一对多的映射,常用于一对多中扩展类下的List26f8748aa4657b998cc4ad34c80d1a5b的属性
   association标签适用扩展类包含的一对一的po类对象属性

MyBatis中关于resultType和resultMap的区别

  MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key-->value关系),但是resultType跟resultMap不能同时存在。
  在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
  ①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
  ②当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

总结一下

resultType:

作用:

         将查询结果按照sql列名pojo属性名一致性映射到pojo中(适用于单表仅查询)。

场合:

         常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

Atas ialah kandungan terperinci 详细分析mybatis中resultType和resultMap的区别与联系. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn