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中,分页查询通常通过动态SQL来实现。动态SQL允许我们在XML映射文件中编写条件语句,根据传入的参数灵活地...
《MyBatis 3.x 源码深度解析与最佳实践》是一份深入探讨MyBatis框架核心原理和实践技巧的资源。MyBatis作为Java领域广泛应用的持久层框架,以其简洁灵活的特性深受开发者喜爱。这份资料旨在帮助开发者更好地理解和...
总结起来,MyBatis源码分析涵盖了从配置加载到数据库操作的全过程,涉及到了配置解析、SQL执行、结果映射等多个关键环节,以及Executor、StatementHandler等核心组件。通过深入学习MyBatis的源码,开发者不仅可以...
解析过程主要由XMLConfigBuilder类完成。 2. **SqlSessionFactoryBuilder**:该类用于构建SqlSessionFactory。它接受配置信息(如XML配置文件或Java配置类),然后创建SqlSessionFactory实例。 3. **...
### MyBatis 工作原理详解 #### 一、引言 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及...此外,对于 MyBatis 的配置文件的解析过程也有一定的了解,这对于在实际项目中进行配置管理非常有帮助。
这一章的内容可能会包括对MyBatis核心组件、动态代理机制以及SQL执行流程的详细解析。 首先,MyBatis的核心组件之一是SqlSessionFactory,它是MyBatis的配置中心,负责创建SqlSession对象,而SqlSession则是与...
以上内容只是MyBatis-Plus实践及架构原理的概述,具体的学习可以通过提供的"mybatis-plus 实践及架构原理.pdf"文件深入学习,这份文档将详细解析MyBatis-Plus的各个方面,帮助你更好地理解和运用这个框架。
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在使用MyBatis时,我们需要理解其核心组件和工作原理,以便更好地进行数据库操作。 一、MyBatis核心配置文件 MyBatis的核心配置文件...
MyBatis 是一款著名的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使你更好地控制 SQL 执行,同时提供更简单的 XML 或注解...
- 封装性:封装了底层的 JDBC 操作,使得数据访问更加简单高效。 - API简洁:提供了较为简单的 API 来进行数据访问。 - 轻量级:通常具有较小的体积和较低的性能开销。 - 持久化对象通常为 POJO 类,易于理解和...
总结起来,MyBatis的初始化原理主要涉及解析XML配置文件,构建`Configuration`对象,以及利用这个对象创建`SqlSessionFactory`。理解这个过程有助于我们在实际项目中更好地配置和使用MyBatis,从而更高效地进行...
通过源码,可以了解它们如何封装 JDBC API,使得开发者能够更方便地进行数据操作。 6. **TypeHandler**:MyBatis 提供了对 Java 类型和数据库类型之间的自动转换,TypeHandler 在其中起到了关键作用。源码分析 Type...
《深入解析mybatis-spring-1.3.0.jar:集成与应用》 在Java开发领域,MyBatis和Spring框架的结合使用是常见的实践,它们的整合使得数据访问层的构建更为便捷和灵活。本篇文章将围绕"mybatis-spring-1.3.0.jar"这一...
2. **源码分析**:针对Mybatis的源码分析,视频中探讨了Mybatis如何处理参数,解释了参数封装到Map的过程,帮助理解Mybatis底层的工作原理。 3. **映射文件**:Mybatis的映射文件是实现SQL动态绑定的核心,视频详细...
理解这个项目,你需要掌握SpringMVC的MVC工作原理、Mybatis的SQL映射机制以及如何将两者整合以实现数据操作。同时,了解数据库设计、SQL语法以及基本的前端知识也是必要的。通过学习和实践这个项目,你能够提升在...
- 研究 MyBatis 的动态 SQL 语法和解析过程。 ### 五、总结 通过对 MyBatis 的源码级学习,不仅可以帮助开发者更深入地理解框架的内部机制,还能够在实际项目中更加灵活地运用该框架。此外,掌握源码级的知识还...
7. **JDBC的封装**:MyBatis在JDBC的基础上进行了抽象和封装,降低了直接操作JDBC的复杂性,如自动管理连接、事务等。同时,MyBatis允许开发者直接写SQL,保留了SQL的灵活性。 通过这个"mybatis基础源码及jar包...
在分析MyBatis-3.5.0源码时,我们可以深入了解其内部工作原理,例如如何解析配置文件、如何构建SqlSessionFactory、如何执行SQL语句、以及如何处理结果映射等。这对于理解和优化MyBatis的应用,以及学习数据库访问的...
3. 表结构解析:MyBatis逆向工程会连接到指定的数据库,读取表结构信息,包括字段名、数据类型、主键等。 4. 代码生成:根据解析到的表结构,逆向工程会生成对应的Mapper接口、XML配置文件和实体类。Mapper接口定义...