`
gaojingsong
  • 浏览: 1201702 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【Mybatis源码阅读之MappedStatement 】

阅读更多



 

源码阅读:

package org.apache.ibatis.mapping;

 

import org.apache.ibatis.cache.Cache;

import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator;

import org.apache.ibatis.executor.keygen.KeyGenerator;

import org.apache.ibatis.executor.keygen.NoKeyGenerator;

import org.apache.ibatis.session.Configuration;

 

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

 

public class MappedStatement {

 

  private String resource;

  private Configuration configuration;

  private String id;

  private Integer fetchSize;

  private Integer timeout;

  private StatementType statementType;

  private ResultSetType resultSetType;

  private SqlSource sqlSource;

  private Cache cache;

  private ParameterMap parameterMap;

  private List<ResultMap> resultMaps;

  private boolean flushCacheRequired;

  private boolean useCache;

  private SqlCommandType sqlCommandType;

  private KeyGenerator keyGenerator;

  private String keyProperty;

  private boolean hasNestedResultMaps;

 

  private MappedStatement() {

  }

 

  public static class Builder {

    private MappedStatement mappedStatement = new MappedStatement();

 

    public Builder(Configuration configuration, String id, SqlSource sqlSource,

                SqlCommandType sqlCommandType) {

      mappedStatement.configuration = configuration;

      mappedStatement.id = id;

      mappedStatement.sqlSource = sqlSource;

      mappedStatement.statementType = StatementType.PREPARED;

      mappedStatement.parameterMap = new ParameterMap.Builder(configuration,

              "defaultParameterMap", Object.class, new ArrayList<ParameterMapping>()).build();

      mappedStatement.resultMaps = new ArrayList<ResultMap>();

      mappedStatement.timeout = configuration.getDefaultStatementTimeout();

      mappedStatement.sqlCommandType = sqlCommandType;

      mappedStatement.keyGenerator = configuration.isUseGeneratedKeys()

          && SqlCommandType.INSERT.equals(sqlCommandType) ? new Jdbc3KeyGenerator() : new NoKeyGenerator();

    }

 

    public Builder resource(String resource) {

      mappedStatement.resource = resource;

      return this;

    }

 

    public String id() {

      return mappedStatement.id;

    }

 

    public Builder parameterMap(ParameterMap parameterMap) {

      mappedStatement.parameterMap = parameterMap;

      return this;

    }

 

    public Builder resultMaps(List<ResultMap> resultMaps) {

      mappedStatement.resultMaps = resultMaps;

      for (ResultMap resultMap : resultMaps) {

        mappedStatement.hasNestedResultMaps = mappedStatement.hasNestedResultMaps || resultMap.hasNestedResultMaps();

      }

      return this;

    }

 

    public Builder fetchSize(Integer fetchSize) {

      mappedStatement.fetchSize = fetchSize;

      return this;

    }

 

    public Builder timeout(Integer timeout) {

      mappedStatement.timeout = timeout;

      return this;

    }

 

    public Builder statementType(StatementType statementType) {

      mappedStatement.statementType = statementType;

      return this;

    }

 

    public Builder resultSetType(ResultSetType resultSetType) {

      mappedStatement.resultSetType = resultSetType;

      return this;

    }

 

    public Builder cache(Cache cache) {

      mappedStatement.cache = cache;

      return this;

    }

 

    public Builder flushCacheRequired(boolean flushCacheRequired) {

      mappedStatement.flushCacheRequired = flushCacheRequired;

      return this;

    }

 

    public Builder useCache(boolean useCache) {

      mappedStatement.useCache = useCache;

      return this;

    }

 

    public Builder keyGenerator(KeyGenerator keyGenerator) {

      mappedStatement.keyGenerator = keyGenerator;

      return this;

    }

 

    public Builder keyProperty(String keyProperty) {

      mappedStatement.keyProperty = keyProperty;

      return this;

    }

 

    public MappedStatement build() {

      assert mappedStatement.configuration != null;

      assert mappedStatement.id != null;

      assert mappedStatement.sqlSource != null;

      mappedStatement.resultMaps = Collections.unmodifiableList(mappedStatement.resultMaps);

      return mappedStatement;

    }

 

  }

 

  public String getKeyProperty() {

    return keyProperty;

  }

 

  public KeyGenerator getKeyGenerator() {

    return keyGenerator;

  }

 

  public SqlCommandType getSqlCommandType() {

    return sqlCommandType;

  }

 

  public String getResource() {

    return resource;

  }

 

  public Configuration getConfiguration() {

    return configuration;

  }

 

  public String getId() {

    return id;

  }

 

  public boolean hasNestedResultMaps() {

    return hasNestedResultMaps;

  }

 

  public Integer getFetchSize() {

    return fetchSize;

  }

 

  public Integer getTimeout() {

    return timeout;

  }

 

  public StatementType getStatementType() {

    return statementType;

  }

 

  public ResultSetType getResultSetType() {

    return resultSetType;

  }

 

  public SqlSource getSqlSource() {

    return sqlSource;

  }

 

  public ParameterMap getParameterMap() {

    return parameterMap;

  }

 

  public List<ResultMap> getResultMaps() {

    return resultMaps;

  }

 

  public Cache getCache() {

    return cache;

  }

 

  public boolean isFlushCacheRequired() {

    return flushCacheRequired;

  }

 

  public boolean isUseCache() {

    return useCache;

  }

 

  public BoundSql getBoundSql(Object parameterObject) {

    BoundSql boundSql = sqlSource.getBoundSql(parameterObject);

    List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();

    if (parameterMappings == null || parameterMappings.size() <= 0) {

      boundSql = new BoundSql(configuration, boundSql.getSql(), parameterMap.getParameterMappings(), parameterObject);

    }

    

    // check for nested result maps in parameter mappings (issue #30)

    for (ParameterMapping pm : boundSql.getParameterMappings()) {

        String rmId = pm.getResultMapId();

        if (rmId != null) {

            ResultMap rm = configuration.getResultMap(rmId);

            if (rm != null) {

                hasNestedResultMaps |= rm.hasNestedResultMaps();

            }

        }

    }

    

    return boundSql;

  }

 

 

}

 

  • 大小: 72 KB
0
1
分享到:
评论

相关推荐

    MyBatis源码分析.pdf

    MyBatis源码分析 MyBatis是一款流行的Java持久层框架,提供了强大的数据库访问能力,本文将对MyBatis的源码进行深入分析,从而帮助读者更好地理解MyBatis的工作机理。 1. MyBatis入门 MyBatis是一款基于Java的...

    Mybatis源码分析.pdf

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

    阿里巴巴P7架构师纯手工打造MyBatis源码——1小时解密底层源码.txt

    ### MyBatis源码解析——由阿里巴巴P7架构师纯手工打造 #### 一、前言 在现代软件开发过程中,持久层框架如MyBatis因其简单易用、灵活高效的特点而受到广泛欢迎。作为一款优秀的Java持久层框架,MyBatis通过SQL...

    mybatis源码.rar

    源码分析是理解框架工作原理的重要途径,通过阅读MyBatis的源码,我们可以深入学习其内部机制,包括SQL动态生成、结果映射、事务管理等方面。 1. SQL动态生成:MyBatis的核心之一是SQL动态语句。在XML配置文件或...

    mybatis源码

    在深入MyBatis源码之前,我们需要了解一些基础概念。MyBatis的核心组件包括SqlSessionFactory、SqlSession和Mapper接口。SqlSessionFactory是MyBatis的主要工厂类,用于创建SqlSession实例,而SqlSession则负责执行...

    mybatis源码分析

    通过对MyBatis源码的分析,开发者可以更深入地理解其内部运作机制,从而更好地优化应用,解决实际问题。同时,这也是一种提升个人技术水平和解决问题能力的有效途径。在阅读源码过程中,可能会遇到各种设计模式和...

    mybatis源码(可以直接导入idea)

    深入学习MyBatis源码,可以让我们在开发过程中更好地利用它,避免潜在的问题,并且能够根据项目需求进行扩展和定制。对于有经验的开发者,源码分析有助于优化数据库操作,提高应用程序的性能。总之,"mybatis-3-...

    MyBatis官方包和源码包.zip

    通过阅读这些源码,开发者不仅可以掌握MyBatis的基本用法,还能深入理解其内部机制,提高开发效率,解决实际项目中的问题。同时,对于希望成为MyBatis专家的人来说,这份源码包是不可多得的学习资料,可以为深入学习...

    Mybatis源码研究之BoundSql.pdf

    ### Mybatis源码研究之BoundSql #### 一、引言 在MyBatis框架中,`BoundSql` 是一个非常重要的概念。它主要用于封装SQL语句及其参数映射信息,是MyBatis执行数据库操作时的核心组件之一。本文旨在通过对`BoundSql`...

    mybatis-3-mybatis-3.5.8.zip源码

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。...同时,源码阅读也是提升自身编程技能和理解框架底层运作的好机会。

    mybatis源码加注释

    以下是一些关于MyBatis源码的重要知识点: 1. **SqlSessionFactoryBuilder**:这个类用于构建SqlSessionFactory,它是MyBatis的核心工厂,负责创建SqlSessionFactory实例。你可以通过它来加载配置文件或者提供一个...

    一本小小的MyBatis源码分析书.rar

    通过对《一本小小的MyBatis源码分析书》的阅读和学习,开发者不仅能掌握MyBatis的基本使用,还能深入了解其内部机制,提升在实际项目中的应用能力,为成为高级开发者打下坚实基础。这本书的详细分析将帮助你解决实际...

    mybatis-3-mybatis-3.4.5 源码

    通过对MyBatis源码的学习,我们可以了解到MyBatis如何解析配置,如何构建SQL,如何处理参数和结果,以及如何利用缓存提高性能。这对于理解和优化MyBatis的应用,甚至开发自己的持久层框架都有极大的帮助。在阅读源码...

    mybatis3 源码

    MyBatis的核心组件之一是SqlSessionFactoryBuilder,它负责创建SqlSessionFactory。SqlSessionFactoryBuilder从配置文件或XML配置读取信息,构建出SqlSessionFactory实例。源码中可以看到它解析配置文件的细节,...

    mybatis源码学习代码

    本资源“mybatis源码学习代码”是针对MyBatis框架源码的学习材料,主要关注其SQL映射机制。下面将详细探讨MyBatis的核心功能和SQL映射的相关知识点。 首先,MyBatis的核心设计理念是将SQL语句与Java代码分离,通过...

    Mybatis源码分析

    Mybatis源码分析 Mybatis是一款流行的持久化框架,提供了强大的SQL映射和缓存机制。本文将对Mybatis的源码进行分析,探究其运行原理、缓存机制和设计模式。 Mybatis简介 Mybatis是一个第一类持久化框架,支持...

    java-ORM框架Mybatis源码分析

    本篇文章将深入探讨MyBatis的源码,帮助你理解其内部工作机制。 首先,MyBatis的初始化过程始于`SqlSessionFactoryBuilder`,它负责读取配置文件,构建`SqlSessionFactory`。配置文件通常包含数据源信息、Mapper ...

    Mybatis源码分析-上课笔记1

    在分析MyBatis源码时,可以采用宏观和微观两种视角。宏观上理解整个框架的架构和流程,微观上深入到具体的类和方法,通过阅读和调试代码来理解其实现细节。同时,绘制流程图或UML图能帮助更好地梳理组件间的交互。 ...

    mybatis源码分析笔记

    MyBatis缓存机制分析笔记 MyBatis是一种优秀的持久层框架,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以对配置和原生Map使用简单的XML或注解,将接口和Java的POJOs映射成数据库中的记录。 ...

Global site tag (gtag.js) - Google Analytics