这一篇博客我们来介绍一下Mybatis执行sql语句返回的结果值的到实体对象的映射机制。首先ResultType和ResultMap的使用方式是不同的。

ResultType的使用方式:

resultType的值为实体类

  1. <select id="getUser" parameterType="int" resultType="com.tianjunwei.learn.learn1.entity.User">
  2. select * from users where id=#{id}
  3. </select>

ResultMap的使用方式:

首先要定义resultMap的对应关系

  1. <resultMap type="com.tianjunwei.learn.learn1.entity.User" id="user">
  2. <id column="id" property="id" javaType="int" jdbcType="INTEGER"></id>
  3. <result column="name" property="names" javaType="string" jdbcType=VARCHAR/>
  4. <result column="age" property="age" javaType="int" jdbcType="INTEGER"/>
  5. </resultMap>

接下来直接使用id值resultMap="user"

  1. <select id="getById" parameterType="int" resultMap="user">
  2. select * from users where id=#{id} and 1=1
  3. </select>

以上就完成了resultType和resultMap的使用。其实mybatis的默认实现机制是首先会自动使用resultType模式,当表中的字段值和实体中的名称不一致时再使用ResultMap方式,如上面的实体User中的names和表中字段name中的对应关系,所以使用resultType方式实体类中User的names属性值为空,而使用resultMap方式实体类中就会有值。

当强制使用resultMap而不是ResultType是需要进行如下配置:增加了autoMapping=false,默认值为null

  1. <resultMap type="com.tianjunwei.learn.learn1.entity.User" id="user" autoMapping="false">
  2. <id column="id" property="id" javaType="int" jdbcType="INTEGER"></id>
  3. <result column="name" property="names" javaType="string" jdbcType="VARCHAR"/>
  4. <result column="age" property="age" javaType="int" jdbcType="INTEGER"/>
  5. </resultMap>

接下来我们介绍一下其实现机制:

其具体实现是在DefaultResultSetHandler中,在获取每行数据时会根据resultType或者resultMap来给对象赋值,返回resultObject。

  1. private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap) throws SQLException {
  2. final ResultLoaderMap lazyLoader = new ResultLoaderMap();
  3. Object resultObject = createResultObject(rsw, resultMap, lazyLoader, null);
  4. if (resultObject != null && !hasTypeHandlerForResultObject(rsw, resultMap.getType())) {
  5. final MetaObject metaObject = configuration.newMetaObject(resultObject);
  6. boolean foundValues = !resultMap.getConstructorResultMappings().isEmpty();
  7. //判断是否可以使用resultType,如果不做任何额外设置,返回true
  8. if (shouldApplyAutomaticMappings(resultMap, false)) {
  9. foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, null) || foundValues;
  10. }
  11. //使用resultMap方式
  12. foundValues = applyPropertyMappings(rsw, resultMap, metaObject, lazyLoader, null) || foundValues;
  13. foundValues = lazyLoader.size() > 0 || foundValues;
  14. resultObject = foundValues ? resultObject : null;
  15. return resultObject;
  16. }
  17. return resultObject;
  18. }

Mybatis源码分析--返回值ResultType和ResultMap的更多相关文章

  1. mybatis <sql /> 配置中 返回值 resultType 与resultMap的区别

    mybatis的objectMapper.xml中, 1) 若<sql /> 查询语句中配置的是resultType=“实体类/DTO” ,则从mybatis返回的键值对结果集(Map)会 ...

  2. MyBatis源码分析-SQL语句执行的完整流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  3. 【MyBatis源码分析】select源码分析及小结

    示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是 ...

  4. mybatis源码分析(一)

    mybatis源码分析(sqlSessionFactory生成过程) 1. mybatis框架在现在各个IT公司的使用不用多说,这几天看了mybatis的一些源码,赶紧做个笔记. 2. 看源码从一个d ...

  5. MyBatis 源码分析 - 缓存原理

    1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...

  6. MyBatis 源码分析 - 映射文件解析过程

    1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...

  7. MyBatis 源码分析 - 配置文件解析过程

    * 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAl ...

  8. (一) Mybatis源码分析-解析器模块

    Mybatis源码分析-解析器模块 原创-转载请说明出处 1. 解析器模块的作用 对XPath进行封装,为mybatis-config.xml配置文件以及映射文件提供支持 为处理动态 SQL 语句中的 ...

  9. 精尽 MyBatis 源码分析 - MyBatis 初始化(三)之 SQL 初始化(上)

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

随机推荐

  1. CentOS 7下Flannel安装与配置

    1. 安装前的准备 etcd 3.2.9 Docker 17.12.0-ce 三台机器10.100.97.236, 10.100.97.92, 10.100.97.81 etcd不同版本之间的差别还是 ...

  2. MySQL协议学习(1):准备工作

    MySQL Client/Server协议 准确的说应该是MySQL Client/Server协议,另一个叫X Protocol的暂不涉及.地址如下:MySQL Client/Server Prot ...

  3. Java基础详解

    从写Java系列的第一篇到现在已经三个月了,因为在网络上或书籍中没有见到一些很适合初学者的学习流程,所以下决心自己写一写,也当作回顾一下Java的知识.网上有许多Java教程之类的内容,都是从概念起步 ...

  4. SQL Server 查询性能优化——创建索引原则(一)(转载)

    索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索引 ...

  5. [LeetCode] Candy Crush 糖果消消乐

    This question is about implementing a basic elimination algorithm for Candy Crush. Given a 2D intege ...

  6. Scrapy选择器的用法

    1.构造选择器: >>> response = HtmlResponse(url='http://example.com', body=body) >>> Sele ...

  7. python学习记录2

    一.两个模块(sys和os) #!/usr/bin/env python # _*_ coding: UTF-8 _*_ # Author:taoke import sys print(sys.pat ...

  8. [JSOI2008]Blue Mary开公司

    Description Input 第一行 :一个整数N ,表示方案和询问的总数.  接下来N行,每行开头一个单词“Query”或“Project”.  若单词为Query,则后接一个整数T,表示Bl ...

  9. codesforces 671D Roads in Yusland

    Mayor of Yusland just won the lottery and decided to spent money on something good for town. For exa ...

  10. HDU - 3037:Saving Beans

    #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...