MyBatis框架核心之Mapper文件使用resultMap及多表查询

resultMap简介

MyBatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库遵循第三范式或BCNF,但实际事与愿违,那么结果集映射就是MyBatis为我们提供这种理想与现实间转换的手段了,而resultMap就是结果集映射的配置标签了。

 

1.从SQL查询结果到领域模型实体                  

  在深入ResultMap标签前,我们需要了解从SQL查询结果集到JavaBean或POJO实体的过程。

  1. 通过JDBC查询得到ResultSet对象

  2. 遍历ResultSet对象并将每行数据暂存到HashMap实例中,以结果集的字段名或字段别名为键,以字段值为值

  3. 根据ResultMap标签的type属性通过反射实例化领域模型

  4. 根据ResultMap标签的type属性和id、result等标签信息将HashMap中的键值对,填充到领域模型实例中并返回

 

2.使用场景

       在项目的实际开发中,有可能会遇到这样两种情况。

1.   实体类中的属性名与列名不相同,不能改但。导致不能自动装配值

2.   多表查询的返回值中可能需要其他对象,或者数组(一对一和一对多)

 

二、resultMap标签解释

标签及属性介绍

<resultMap > 标签:

      id属性 ,resultMap标签的标识。

          type属性 ,返回值的全限定类名,或类型别名。

     autoMapping属性 ,值范围true(默认值)|false, 设置是否启动自动映射功能,自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,则需要在`resultMap`内明确注明映射关系才会调用对应的setter方法。

 

 

 <resultMap>可以设置的子标签映射:

       1).id标签  :ID 结果,将结果集标记为ID,以方便全局调用(适用于指定主键)

column 数据库的列名

Property需要装配的属性名

      2).result标签:将查询到的列的值,反射到指定的JavaBean的 属性上

column 数据库的列名

Property 需要装配的属性名

      3).association标签:复杂类型  , 多表查询(一对一)时,将根据外键或某列信息查询出的对象,直接装配给某个resultMap指定的属性。

column 数据库的列名

Property 需要装配的属性名

select  指定用来多表查询的sqlmapper

 

      4).Collection标签:复杂类型,多表查询(一对多),将查询出的结果集合直接装配给某个对应的集合

column 数据库的列名

Property 需要装配的属性名

javaType 指定用什么类型接受返回的值(必要)

select  指定用来多表查询的sqlmapper

      5).constructor– 用来将结果反射给一个实例化好的类的构造器

a) idArg –ID 参数;将结果集标记为ID,以方便全局调用
b) arg –反射到构造器的通常结果

      6).discriminator – 使用一个结果值以决定使用哪个resultMap

a) case – 基本一些值的结果映射的case 情形

i. nestedresult mappings –一个case 情形本身就是一个结果映射,因此也可以包括一些相同的元素,也可以引用一个外部resultMap。

 

 

<resultMap type="" id="">
<id column="" property=""/>
<result column="" property="" />
       <association property="" column="" select=""></association>
       <collection property="" column="" javaType="" select=""></collection>
       <constructor></constructor>
    </resultMap>
 

     

 

三、各标签使用

1.id、result

       id、result是最简单的映射,id为主键映射;result其他基本数据库表字段到实体类属性的映射。

实体字段                    表的列名     
sid                            stuid
sname                      stuname
gid                            gid
grade                       grade  
<resultMap type="student" id="studentMap" autoMapping="true">
    <!-- 主键建议用id标签   -->
    <id column="stuid" property="sid"/>
    <!-- 其他列可以用result标签 -->
    <result column="stuname" property="sname"/>
</resultMap>
 
 

id、result语句属性配置细节:

 

属性
描述
 
property
需要映射到JavaBean 的属性名称。
 
column
数据表的列名或者标签别名。
 
javaType
一个完整的类名,或者是一个类型别名。如果你匹配的是一个JavaBean,那MyBatis 通常会自行检测到。然后,如果你是要映射到一个HashMap,那你需要指定javaType 要达到的目的。
 
jdbcType
数据表支持的类型列表。这个属性只在insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果你是直接针对JDBC 编码,且有允许空的列,而你要指定这项。
 
typeHandler
使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名,也可以是一个类型别名。
 
 

支持的JDBC类型
       为了将来的引用,MyBatis支持下列JDBC 类型,通过JdbcType 枚举:
BIT,FLOAT,CHAR,TIMESTAMP,OTHER,UNDEFINED,TINYINT,REAL,VARCHAR,BINARY,BLOB,NVARCHAR,SMALLINT,DOUBLE,LONGVARCHAR,VARBINARY,CLOB,NCHAR,INTEGER,NUMERIC,DATE,LONGVARBINARY,BOOLEAN,NCLOB,BIGINT,DECIMAL,TIME,NULL,CURSOR

 

2.association联合

联合元素用来处理“一对一”的关系。

需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。
不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种方式加载:

1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;
2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值