`

Mybatis数据封装过程原理解析

阅读更多
mybatis封装数据过程:mybatis中大量使用了装饰设计模式。
1、最简单的一种情况:xml中没有配置resultMap也就是查询出来直接封装到javabean中。
mybatis源码:
DefaultResultSetHandler.class
//从resultSet的包装类ResultSetWrapper中查询出sql中写的所有column.
final List<String> unmappedColumnNames = rsw.getUnmappedColumnNames(resultMap, columnPrefix);
    boolean foundValues = false;
    for (String columnName : unmappedColumnNames) {
      String propertyName = columnName;
      if (columnPrefix != null && columnPrefix.length() > 0) {
        // When columnPrefix is specified,
        // ignore columns without the prefix.
        if (columnName.toUpperCase(Locale.ENGLISH).startsWith(columnPrefix)) {
          propertyName = columnName.substring(columnPrefix.length());
        } else {
          continue;
        }
      }
      //从metaObject中查询出Object中是否有该property。metaObject是ObjectWrapper的包装类.ObjectWrapper是Object的包装类
      final String property = metaObject.findProperty(propertyName, configuration.isMapUnderscoreToCamelCase());
      if (property != null && metaObject.hasSetter(property)) {
	//拿到字段类型
        final Class<?> propertyType = metaObject.getSetterType(property);
        if (typeHandlerRegistry.hasTypeHandler(propertyType)) {
	  //获取处理字段类型的typeHandler	
          final TypeHandler<?> typeHandler = rsw.getTypeHandler(propertyType, columnName);
	  //获取值
          final Object value = typeHandler.getResult(rsw.getResultSet(), columnName);
          if (value != null || configuration.isCallSettersOnNulls()) { // issue #377, call setter on nulls
            if (value != null || !propertyType.isPrimitive()) {
	    //设置值
              metaObject.setValue(property, value);
            }
            foundValues = true;
          }
        }
      }
    }

2、封装collection一对多关系或者一对一关系的原理:
    首先项目加载的时候读取xml中的<resultMap>标签封装到ResultMap其中ResultMap中的每一个result对应ResultMapping.
public class ResultMap {
  private String id;
  private Class<?> type;
  private List<ResultMapping> resultMappings;
  private List<ResultMapping> idResultMappings;
  private List<ResultMapping> constructorResultMappings;
  private List<ResultMapping> propertyResultMappings;
  private Set<String> mappedColumns;
  private Discriminator discriminator;
  private boolean hasNestedResultMaps; //是否有嵌套标签
  private boolean hasNestedQueries;
  private Boolean autoMapping;
resultMap对应<resultMap>标签


public class ResultMapping {

  private Configuration configuration;
  private String property;
  private String column;
  private Class<?> javaType;
  private JdbcType jdbcType;
  private TypeHandler<?> typeHandler;
  private String nestedResultMapId;
  private String nestedQueryId;
  private Set<String> notNullColumns;
  private String columnPrefix;
  private List<ResultFlag> flags;
  private List<ResultMapping> composites;
  private String resultSet;
  private String foreignColumn;
  private boolean lazy;
ResultMapping 对应<ResultMap>标签下的<result标签><collection标签等>

public class DefaultResultSetHandler implements ResultSetHandler这个类是处理结果集映射的类,其中定义了两个Map:
private final Map<CacheKey, Object> nestedResultObjects = new HashMap<CacheKey, Object>(); 保存实体类对象在一对多关系映射的时候,首先从该Map中取对象,如果有就取出来,如果没有就新建。CacheKey根据主键生成。

  private final Map<CacheKey, Object> ancestorObjects = new HashMap<CacheKey, Object>();保存实体嵌套类的对象,先从该Map中根据CacheKey判断是否有对象,有则取出,没有则新建。CacheKey根据嵌套类的id生成。这也是为什么当配置collection的时候一定要配置id标签,因为封装一对多关系的时候是根据id来判断是否存在同一对象进而封装。
 
分享到:
评论

相关推荐

    MyBatis 最简单的分页+原理解析

    本文将深入探讨MyBatis如何实现最简单的分页查询,并解析其工作原理。 一、MyBatis 分页基础 在MyBatis中,分页查询通常通过动态SQL来实现。动态SQL允许我们在XML映射文件中编写条件语句,根据传入的参数灵活地...

    mybatis 3.x源码深度解析与最佳实践1.html.zip

    《MyBatis 3.x 源码深度解析与最佳实践》是一份深入探讨MyBatis框架核心原理和实践技巧的资源。MyBatis作为Java领域广泛应用的持久层框架,以其简洁灵活的特性深受开发者喜爱。这份资料旨在帮助开发者更好地理解和...

    Mybatis源码分析.pdf

    总结起来,MyBatis源码分析涵盖了从配置加载到数据库操作的全过程,涉及到了配置解析、SQL执行、结果映射等多个关键环节,以及Executor、StatementHandler等核心组件。通过深入学习MyBatis的源码,开发者不仅可以...

    mybatis-3-mybatis-3.2.6

    解析过程主要由XMLConfigBuilder类完成。 2. **SqlSessionFactoryBuilder**:该类用于构建SqlSessionFactory。它接受配置信息(如XML配置文件或Java配置类),然后创建SqlSessionFactory实例。 3. **...

    MyBatis 的工作原理.pdf

    ### MyBatis 工作原理详解 #### 一、引言 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及...此外,对于 MyBatis 的配置文件的解析过程也有一定的了解,这对于在实际项目中进行配置管理非常有帮助。

    深入浅出MyBatis技术原理与实战 第六章 源代码

    这一章的内容可能会包括对MyBatis核心组件、动态代理机制以及SQL执行流程的详细解析。 首先,MyBatis的核心组件之一是SqlSessionFactory,它是MyBatis的配置中心,负责创建SqlSession对象,而SqlSession则是与...

    mybatis-plus&实践&及架构原理

    以上内容只是MyBatis-Plus实践及架构原理的概述,具体的学习可以通过提供的"mybatis-plus 实践及架构原理.pdf"文件深入学习,这份文档将详细解析MyBatis-Plus的各个方面,帮助你更好地理解和运用这个框架。

    MyBatis基本使用总结

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在使用MyBatis时,我们需要理解其核心组件和工作原理,以便更好地进行数据库操作。 一、MyBatis核心配置文件 MyBatis的核心配置文件...

    mybatis mybatis-spring source jar

    MyBatis 是一款著名的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使你更好地控制 SQL 执行,同时提供更简单的 XML 或注解...

    Mybatis讲义

    - 封装性:封装了底层的 JDBC 操作,使得数据访问更加简单高效。 - API简洁:提供了较为简单的 API 来进行数据访问。 - 轻量级:通常具有较小的体积和较低的性能开销。 - 持久化对象通常为 POJO 类,易于理解和...

    面试官:讲一下 Mybatis 初始化原理.docx

    总结起来,MyBatis的初始化原理主要涉及解析XML配置文件,构建`Configuration`对象,以及利用这个对象创建`SqlSessionFactory`。理解这个过程有助于我们在实际项目中更好地配置和使用MyBatis,从而更高效地进行...

    mybatis-3.5.9 源码(mybatis-3-mybatis-3.5.9.tar.gz)

    通过源码,可以了解它们如何封装 JDBC API,使得开发者能够更方便地进行数据操作。 6. **TypeHandler**:MyBatis 提供了对 Java 类型和数据库类型之间的自动转换,TypeHandler 在其中起到了关键作用。源码分析 Type...

    mybatis-spring-1.3.0.jar 下载

    《深入解析mybatis-spring-1.3.0.jar:集成与应用》 在Java开发领域,MyBatis和Spring框架的结合使用是常见的实践,它们的整合使得数据访问层的构建更为便捷和灵活。本篇文章将围绕"mybatis-spring-1.3.0.jar"这一...

    尚硅谷Mybatis视频教程21-30

    2. **源码分析**:针对Mybatis的源码分析,视频中探讨了Mybatis如何处理参数,解释了参数封装到Map的过程,帮助理解Mybatis底层的工作原理。 3. **映射文件**:Mybatis的映射文件是实现SQL动态绑定的核心,视频详细...

    springMVC+Mybatis(登录+数据操作)

    理解这个项目,你需要掌握SpringMVC的MVC工作原理、Mybatis的SQL映射机制以及如何将两者整合以实现数据操作。同时,了解数据库设计、SQL语法以及基本的前端知识也是必要的。通过学习和实践这个项目,你能够提升在...

    2017_尚硅谷MyBatis最新视频

    - 研究 MyBatis 的动态 SQL 语法和解析过程。 ### 五、总结 通过对 MyBatis 的源码级学习,不仅可以帮助开发者更深入地理解框架的内部机制,还能够在实际项目中更加灵活地运用该框架。此外,掌握源码级的知识还...

    mybatis基础源码及jar包

    7. **JDBC的封装**:MyBatis在JDBC的基础上进行了抽象和封装,降低了直接操作JDBC的复杂性,如自动管理连接、事务等。同时,MyBatis允许开发者直接写SQL,保留了SQL的灵活性。 通过这个"mybatis基础源码及jar包...

    mybatis-3.5.0源码

    在分析MyBatis-3.5.0源码时,我们可以深入了解其内部工作原理,例如如何解析配置文件、如何构建SqlSessionFactory、如何执行SQL语句、以及如何处理结果映射等。这对于理解和优化MyBatis的应用,以及学习数据库访问的...

    mybatis逆向工程生成项目

    3. 表结构解析:MyBatis逆向工程会连接到指定的数据库,读取表结构信息,包括字段名、数据类型、主键等。 4. 代码生成:根据解析到的表结构,逆向工程会生成对应的Mapper接口、XML配置文件和实体类。Mapper接口定义...

Global site tag (gtag.js) - Google Analytics