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

Mybatis接口编程原理分析(三)

 
阅读更多

前面两篇博客Mybatis接口编程原理分析(一)Mybatis接口编程原理分析(二)我们介绍了MapperProxyFactory、MapperProxy和MapperMethod的操作及源码分析,接下来我们介绍MapperRegistry

MapperRegistry:它是用来注册Mapper接口和获取登出代理类实例的工具类,它通过getMapper函数获得代理类和addMapper函数来注册代理类,

源码如下:

//这个类通过名字就可以看出 是用来注册Mapper接口与获取生成代理类实例的工具类
public class MapperRegistry {
	
  //全局配置文件对象
  private final Configuration config;
  
  //一个HashMap Key是mapper的类型对象, Value是MapperProxyFactory对象
  //这个MapperProxyFactory是创建Mapper代理对象的工厂 
  private final Map<Class<?>, MapperProxyFactory<?>> knownMappers = new HashMap<Class<?>, MapperProxyFactory<?>>();

  public MapperRegistry(Configuration config) {
    this.config = config;
  }
   //获取生成的代理对象
  @SuppressWarnings("unchecked")
  public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
	//通过Mapper的接口类型 去Map当中查找 如果为空就抛异常
    final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type);
    if (mapperProxyFactory == null) {
      throw new BindingException("Type " + type + " is not known to the MapperRegistry.");
    }
    try {
	  //否则创建一个当前接口的代理对象 并且传入sqlSession
      return mapperProxyFactory.newInstance(sqlSession);
    } catch (Exception e) {
      throw new BindingException("Error getting mapper instance. Cause: " + e, e);
    }
  }
  
  public <T> boolean hasMapper(Class<T> type) {
    return knownMappers.containsKey(type);
  }
  //注册Mapper接口
  public <T> void addMapper(Class<T> type) {
    if (type.isInterface()) {
      if (hasMapper(type)) {
        throw new BindingException("Type " + type + " is already known to the MapperRegistry.");
      }
      boolean loadCompleted = false;
      try {
        knownMappers.put(type, new MapperProxyFactory<T>(type));
        // It's important that the type is added before the parser is run
        // otherwise the binding may automatically be attempted by the
        // mapper parser. If the type is already known, it won't try.
        MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type);
        parser.parse();
        loadCompleted = true;
      } finally {
        if (!loadCompleted) {
          knownMappers.remove(type);
        }
      }
    }
  }

  /**
   * @since 3.2.2
   */
  public Collection<Class<?>> getMappers() {
    return Collections.unmodifiableCollection(knownMappers.keySet());
  }

  /**
   * @since 3.2.2
   */
  //注册Mapper接口
  public void addMappers(String packageName, Class<?> superType) {
    ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<Class<?>>();
    resolverUtil.find(new ResolverUtil.IsA(superType), packageName);
    Set<Class<? extends Class<?>>> mapperSet = resolverUtil.getClasses();
    for (Class<?> mapperClass : mapperSet) {
      addMapper(mapperClass);
    }
  }

  /**
   * @since 3.2.2
   */
  //通过包名扫描下面所有接口
  public void addMappers(String packageName) {
    addMappers(packageName, Object.class);
  }
  
}

在DefaultSqlSession中通过getMapper函数从Configuration中获取代理类:

 @Override
  public <T> T getMapper(Class<T> type) {
    return configuration.<T>getMapper(type, this);
  }


在Configuration类中通过getMapper从MapperRegistry来获取代理类

public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    return mapperRegistry.getMapper(type, sqlSession);
  }

这样就完成了mybatis接口编程的构造和调用的全部过程。

分享到:
评论

相关推荐

    Spring整合Mybatis与SpringBoot整合Mybatis原理分析

    **Spring整合Mybatis原理分析** 在Java Web开发中,Spring框架以其强大的依赖注入和面向切面编程能力,成为了事实上的核心框架。Mybatis则是一个轻量级的持久层框架,它简化了数据库操作,提供了直观的SQL映射。将...

    深入浅出MyBatis技术原理与实战

    《深入浅出MyBatis技术原理与实战》这本书旨在为Java开发者提供MyBatis框架的全面理解,无论你是初级还是中高级开发人员,都可以从中受益。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。...

    深入理解mybatis原理

    为了适应面向接口编程的趋势,MyBatis提供了第二种交互方式,即使用Mapper接口。在MyBatis配置文件中,每一个节点对应一个Mapper接口,这个接口声明的方法名称和参数类型与配置文件中|update|delete|insert&gt;节点项相...

    深入浅出MyBatis技术原理与实战(高清带书签)

    《深入浅出MyBatis技术原理与实战》是一本针对Java开发者深度解析MyBatis框架的专业书籍。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,旨在简化Java开发中的数据库操作。这本书通过理论...

    mybatis源码分析

    4. Executor:执行器是MyBatis内部处理SQL的接口,有简单执行器、复用执行器和批量执行器三种实现。它们负责SQL的预编译、执行和结果集的处理。 5. MappedStatement:每个SQL语句对应一个MappedStatement对象,包含...

    MyBatis 中文帮助文档以及MyBatis包

    阅读《MyBatis 3 User Guide Simplified Chinese.pdf》和《MyBatis3用户指南中文版.pdf》这两份文档,开发者可以深入理解MyBatis的工作原理,掌握其配置、使用和优化技巧,从而在项目开发中得心应手地运用这一强大的...

    mybatis-3.2.2-src.rar 源码

    通过深入研究Mybatis 3.2.2的源码,开发者可以了解到其内部的工作原理,提升自己的编程技能,也能更好地理解和解决在实际开发中遇到的问题。源码阅读可以让你看到Mybatis是如何优雅地处理ORM,如何实现SQL的动态生成...

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

    3. **Mapper 接口和动态代理**:MyBatis 允许我们定义接口来操作数据库,然后通过动态代理机制,将方法调用转换为 SQL 执行。源码分析这部分,可以理解到 MyBatis 如何利用 Java 的反射和动态代理技术来实现这一特性...

    mybatis-3.4.1源码

    通过研究其源码,开发者可以深入理解MyBatis的工作原理,提高编程技能,并优化自己的应用。 在MyBatis 3.4.1源码中,我们可以关注以下几个核心知识点: 1. **SqlSessionFactoryBuilder**: 这是创建...

    mybatis项目练习及流程文档

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC...实践中,尝试创建一个简单的CRUD操作,理解每个步骤的作用,这将有助于你更好地理解MyBatis的工作原理。

    mybatis-3-mybatis-3.4.1源码

    通过对MyBatis源码的阅读和分析,开发者能够深入理解数据库操作的底层细节,提高编程效率,同时也能更好地应对性能优化、异常处理和扩展需求。对于任何想成为优秀Java开发者的程序员来说,研究MyBatis源码都是一个...

    mybatis架包与源码

    "源码"部分则是MyBatis的Java源代码,深入研究源码可以帮助我们了解MyBatis的工作原理,如: 1. **SqlSession的实现**:查看SqlSession是如何管理数据库连接和事务的。 2. **Executor的实现**:分析不同类型的...

    mybatis3.4.1jar包和源码

    通过分析源码,你可以深入理解MyBatis的工作原理,例如如何解析XML配置文件,如何执行SQL,以及如何处理结果集。此外,对于自定义拦截器、动态SQL等功能的实现,源码也会提供宝贵的参考。 总之,MyBatis 3.4.1的jar...

    mybatis项目

    本项目结合MySQL数据库,将提供一个完整的实践环境,帮助学习者从实际操作中理解MyBatis的工作原理和用法。通过这个项目,你可以深入学习如何在Java应用中集成MyBatis,实现数据持久化的高效处理。

    mybatis-3.4.4

    而源代码压缩包则提供了MyBatis框架的所有源码,这对于学习和理解MyBatis的工作原理、进行自定义扩展或者排查问题非常有帮助。 MyBatis的主要特点包括: 1. **动态SQL**:MyBatis允许在映射文件中编写动态SQL,...

    逆向工程mybatis-generator-1.3.2

    MyBatis Generator(MBG)是一个强大的工具,能够自动生成MyBatis接口和映射器XML文件,以及Java实体类,从而减轻开发人员的手动编码工作。 MyBatis Generator的核心功能是通过解析数据库表结构,自动生成与之对应...

    mybatis-3.2.8 java api

    `mybatis-3.2.8-sources.jar`文件包含MyBatis框架的源代码,可以帮助开发者深入理解其内部工作原理,进行定制化开发或调试。 **10. API文档** `mybatis-3.2.8-javadoc.jar`是MyBatis 3.2.8版本的API文档,提供了...

    mybatis源码.rar

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

    mybatis-plus源码(mybatis-plus-3.5.1.zip)

    此源码包`mybatis-plus-3.5.1.zip`包含了MyBatis-Plus 3.5.1版本的全部源代码,有助于我们深入理解其内部实现机制和工作原理。 MyBatis-Plus的主要功能包括: 1. **CRUD操作**:MyBatis-Plus提供了简化版的CRUD...

    spring+mybatis开发实战

    1. **Mybatis简介**:阐述Mybatis的基本原理,以及与传统JDBC相比的优势。 2. **SqlSessionFactory和SqlSession**:解释这两个核心接口的作用,以及如何通过它们执行SQL操作。 3. **Mapper接口和Mapper XML文件**:...

Global site tag (gtag.js) - Google Analytics