Mybatis源码分析--返回值ResultType和ResultMap
这一篇博客我们来介绍一下Mybatis执行sql语句返回的结果值的到实体对象的映射机制。首先ResultType和ResultMap的使用方式是不同的。
ResultType的使用方式:
resultType的值为实体类
- <select id="getUser" parameterType="int" resultType="com.tianjunwei.learn.learn1.entity.User">
- select * from users where id=#{id}
- </select>
ResultMap的使用方式:
首先要定义resultMap的对应关系
- <resultMap type="com.tianjunwei.learn.learn1.entity.User" id="user">
- <id column="id" property="id" javaType="int" jdbcType="INTEGER"></id>
- <result column="name" property="names" javaType="string" jdbcType=VARCHAR/>
- <result column="age" property="age" javaType="int" jdbcType="INTEGER"/>
- </resultMap>
接下来直接使用id值resultMap="user"
- <select id="getById" parameterType="int" resultMap="user">
- select * from users where id=#{id} and 1=1
- </select>
以上就完成了resultType和resultMap的使用。其实mybatis的默认实现机制是首先会自动使用resultType模式,当表中的字段值和实体中的名称不一致时再使用ResultMap方式,如上面的实体User中的names和表中字段name中的对应关系,所以使用resultType方式实体类中User的names属性值为空,而使用resultMap方式实体类中就会有值。
当强制使用resultMap而不是ResultType是需要进行如下配置:增加了autoMapping=false,默认值为null
- <resultMap type="com.tianjunwei.learn.learn1.entity.User" id="user" autoMapping="false">
- <id column="id" property="id" javaType="int" jdbcType="INTEGER"></id>
- <result column="name" property="names" javaType="string" jdbcType="VARCHAR"/>
- <result column="age" property="age" javaType="int" jdbcType="INTEGER"/>
- </resultMap>
接下来我们介绍一下其实现机制:
其具体实现是在DefaultResultSetHandler中,在获取每行数据时会根据resultType或者resultMap来给对象赋值,返回resultObject。
- private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap) throws SQLException {
- final ResultLoaderMap lazyLoader = new ResultLoaderMap();
- Object resultObject = createResultObject(rsw, resultMap, lazyLoader, null);
- if (resultObject != null && !hasTypeHandlerForResultObject(rsw, resultMap.getType())) {
- final MetaObject metaObject = configuration.newMetaObject(resultObject);
- boolean foundValues = !resultMap.getConstructorResultMappings().isEmpty();
- //判断是否可以使用resultType,如果不做任何额外设置,返回true
- if (shouldApplyAutomaticMappings(resultMap, false)) {
- foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, null) || foundValues;
- }
- //使用resultMap方式
- foundValues = applyPropertyMappings(rsw, resultMap, metaObject, lazyLoader, null) || foundValues;
- foundValues = lazyLoader.size() > 0 || foundValues;
- resultObject = foundValues ? resultObject : null;
- return resultObject;
- }
- return resultObject;
- }
Mybatis源码分析--返回值ResultType和ResultMap的更多相关文章
- mybatis <sql /> 配置中 返回值 resultType 与resultMap的区别
mybatis的objectMapper.xml中, 1) 若<sql /> 查询语句中配置的是resultType=“实体类/DTO” ,则从mybatis返回的键值对结果集(Map)会 ...
- MyBatis源码分析-SQL语句执行的完整流程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
- 【MyBatis源码分析】select源码分析及小结
示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是 ...
- mybatis源码分析(一)
mybatis源码分析(sqlSessionFactory生成过程) 1. mybatis框架在现在各个IT公司的使用不用多说,这几天看了mybatis的一些源码,赶紧做个笔记. 2. 看源码从一个d ...
- MyBatis 源码分析 - 缓存原理
1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...
- MyBatis 源码分析 - 映射文件解析过程
1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...
- MyBatis 源码分析 - 配置文件解析过程
* 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAl ...
- (一) Mybatis源码分析-解析器模块
Mybatis源码分析-解析器模块 原创-转载请说明出处 1. 解析器模块的作用 对XPath进行封装,为mybatis-config.xml配置文件以及映射文件提供支持 为处理动态 SQL 语句中的 ...
- 精尽 MyBatis 源码分析 - MyBatis 初始化(三)之 SQL 初始化(上)
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
随机推荐
- 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不同版本之间的差别还是 ...
- MySQL协议学习(1):准备工作
MySQL Client/Server协议 准确的说应该是MySQL Client/Server协议,另一个叫X Protocol的暂不涉及.地址如下:MySQL Client/Server Prot ...
- Java基础详解
从写Java系列的第一篇到现在已经三个月了,因为在网络上或书籍中没有见到一些很适合初学者的学习流程,所以下决心自己写一写,也当作回顾一下Java的知识.网上有许多Java教程之类的内容,都是从概念起步 ...
- SQL Server 查询性能优化——创建索引原则(一)(转载)
索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索引 ...
- [LeetCode] Candy Crush 糖果消消乐
This question is about implementing a basic elimination algorithm for Candy Crush. Given a 2D intege ...
- Scrapy选择器的用法
1.构造选择器: >>> response = HtmlResponse(url='http://example.com', body=body) >>> Sele ...
- python学习记录2
一.两个模块(sys和os) #!/usr/bin/env python # _*_ coding: UTF-8 _*_ # Author:taoke import sys print(sys.pat ...
- [JSOI2008]Blue Mary开公司
Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词“Query”或“Project”. 若单词为Query,则后接一个整数T,表示Bl ...
- codesforces 671D Roads in Yusland
Mayor of Yusland just won the lottery and decided to spent money on something good for town. For exa ...
- HDU - 3037:Saving Beans
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...