`
simon.liubin
  • 浏览: 14129 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

开始mybaits源码学习 1

阅读更多

    从org.apache.ibatis.binding.MapperProxy开始。

    MapperProxy是一个代理类实现java标准代理接口,私有构造,另提供一个获得动态代理的静态方法。

 

    1. newMapperProxy

  @SuppressWarnings("unchecked")
public static <T> T newMapperProxy(Class<T> mapperInterface, SqlSession sqlSession) {
    ClassLoader classLoader = mapperInterface.getClassLoader();
    Class<?>[] interfaces = new Class[]{mapperInterface};
    MapperProxy proxy = new MapperProxy(sqlSession);
    return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy);
  }

 newMapperProxy是一个java动态代理,支持泛型。mapperInterface就是自己定义的Mapper接口,SqlSession则从外部生成,传入。以后再学习、研究。现在主要来看MapperProxy.invoke。

 

    2.  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable

 

final Class<?> declaringInterface = findDeclaringInterface(proxy, method);
final MapperMethod mapperMethod = new MapperMethod(declaringInterface, method, sqlSession);
final Object result = mapperMethod.execute(args);

 主要是获得被代理对象的接口,委托org.apache.ibatis.binding.MapperMethod执行,并获得结果。重点转到MapperMethod对象。

 

    3.

 

  public MapperMethod(Class<?> declaringInterface, Method method, SqlSession sqlSession) {
   //........
    this.config = sqlSession.getConfiguration();
 }

 在构造方法里将自定义的Mapper接口的方法(方法定义、传参数、返回值、方法相关的注解)与配置文件(config)关联起来:

 

//代码不连续,只选择部分关键代码
//完整的 类名.方法名 组成commandName
 this.commandName = declaringInterface.getName() + "." + method.getName();
//通过commandName关联配置信息
//type为:public enum SqlCommandType { UNKNOWN, INSERT, UPDATE, DELETE, SELECT; }
MappedStatement ms = config.getMappedStatement(commandName);
 type = ms.getSqlCommandType(); 
//参数的注解信息,顺序
paramName = ((Param) paramAnnos[j]).value();
//返回值信息
 if (List.class.isAssignableFrom(method.getReturnType()))

 在Object execute(Object[] args)方法中根据type调用SqlSession不同的方法

 

  public Object execute(Object[] args) {
    Object result = null;
    if (SqlCommandType.INSERT == type) {
      Object param = getParam(args);
      result = sqlSession.insert(commandName, param);
    }//......
    } else if (SqlCommandType.SELECT == type) {
      if (returnsVoid && resultHandlerIndex != null) {
        executeWithResultHandler(args);//取交集 ???
      } else if (returnsList) {
        result = executeForList(args);//委托sqlSession.selectList
      } else if (returnsMap) {
        result = executeForMap(args);//委托sqlSession.selectMap
      } else {    //可能返回一个自定义的类
        Object param = getParam(args);
        result = sqlSession.selectOne(commandName, param);
      }
    return result;
  }

目前为止,自定义的Mapper接口的使命就完成了,所有的查询都交给SqlSession处理。那么SqlSession怎么生成的,怎么处理即成为了重点。

 

a.连接的生成、结果集的封转。

b.配置文件的解析,动态sql生成、缓存、事务

 

分享到:
评论

相关推荐

    mybaits demo

    【标题】"mybaits demo" 是一个关于MyBatis框架的示例项目,它旨在帮助开发者更好地理解和学习如何在实际开发中应用MyBatis。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。通过简化DAO...

    Springmvc+mybaits+mysql的Demo源码

    1. **配置文件**:包括Spring的配置文件(如`applicationContext.xml`),MyBatis的配置文件(如`mybatis-config.xml`),以及数据库连接相关的配置(如`db.properties`)。 2. **实体类(Entity)**:这些类代表...

    基于Spring+SpringMVC+Mybaits的小区停车场车牌识别系统源码+项目说明.zip

    1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,...

    springmvc+mybaits+spring

    【标题】"springmvc+mybaits+spring"是一个典型的Java Web开发框架组合,用于构建高效、可维护的Web应用程序。这个源码示例涵盖了MyBatis、Spring MVC和Spring这三个核心组件,它们各自承担着不同的职责。 【描述】...

    SpringMVc+mybaits+Spring基础整合 源码 jar包都有

    【SpringMVC+MyBatis+Spring 基础整合详解】 在现代Java Web开发中,...对于初学者来说,"SpringMVC+MyBatis+Spring基础整合 源码 jar包都有"的示例是一个很好的学习起点,能够帮助理解这些框架的实际工作方式。

    基于vue-cli+springboot+mybaits的音乐网站源码(含客户端+服务端+管理后台).zip

    基于vue-cli+springboot+mybaits的音乐网站源码(含客户端+服务端+管理后台).zip基于vue-cli+springboot+mybaits的音乐网站源码(含客户端+服务端+管理后台).zip基于vue-cli+springboot+mybaits的音乐网站源码(含...

    MyBatis源代码.zip

    1. **SqlSession与Executor**:在MyBatis中,SqlSession是与数据库交互的主要接口,它提供了执行SQL、提交和回滚事务的方法。Executor是SqlSession的内部实现,分为SimpleExecutor(简单执行器)、ReuseExecutor...

    尚硅谷Mybatis Plus笔记+源码

    5. **源码学习价值** 深入研究Mybatis Plus源码,可以了解其内部实现机制,包括: - 如何处理动态SQL,构建SQL语句。 - CRUD操作的具体实现细节,如插入、更新、删除的逻辑。 - 分页插件的工作原理。 - 自动...

    使用springMVC+spring+mybaits 整合源码(mybatis 自动生成)

    总的来说,这个压缩包提供的源码示例对于初学者理解SSM整合和MyBatis的自动化配置有着很好的指导作用,同时也适合有经验的开发者参考和学习。通过深入研究和实践,可以提升Java Web开发的能力,更好地应对复杂的企业...

    MyBatis学习

    **MyBatis的源码学习:** 理解MyBatis的源码有助于深入掌握其实现原理,例如SqlSessionFactoryBuilder如何解析配置文件,SqlSession如何管理数据库连接,以及Mapper的动态代理机制等。 **与其他ORM框架对比:** ...

    mybatis分页插件源码

    通过深入阅读和理解这些源码,我们可以学习到以下知识点: - MyBatis 插件机制的工作原理,以及如何编写一个自定义的拦截器。 - SQL 解析和动态 SQL 在分页中的应用,如何在不改变原始 SQL 的基础上添加分页条件。 ...

    mybaits入门(含实例教程和源码)Java开发Java

    1. **环境搭建**:介绍如何在项目中引入 MyBatis 相关依赖,配置 MyBatis 的核心配置文件(mybatis-config.xml),以及数据库连接信息。 2. **Mapper 接口与 XML 映射文件**:讲解如何创建 Mapper 接口,以及对应的...

    mybatis-3.2.7源代码

    1. SqlSessionFactory:它是MyBatis的核心,负责创建SqlSession对象,而SqlSession是执行SQL操作的主要接口。SqlSessionFactory通常由SqlSessionFactoryBuilder通过读取配置文件或XML配置构建。 2. SqlSession:...

    毕业设计基于springboot+mybaits 实现的图书出版平台源码+数据库

    《基于SpringBoot+MyBatis实现的图书出版平台源码解析及数据库设计》 在现代软件开发领域,SpringBoot和MyBatis框架的组合已成为构建高效、轻量级Web应用的首选方案。本毕业设计项目就是一个很好的实例,它利用这...

    mybaits逆向工程jar包

    你可以学习到如何自定义逆向工程插件,实现更复杂的功能,比如自动添加注释、生成特定格式的代码等。此外,源码分析还可以帮助你更好地理解MyBatis框架的内部机制,提升你的MyBatis使用技能。 在实际项目中,...

    《Spring+Mybatis企业应用实战》源码

    通过学习和研究这些源码,你可以了解到如何在实际项目中整合Spring、SpringMVC和Mybatis,理解它们之间的交互机制,以及如何编写符合企业级标准的代码。同时,这个过程也会加深你对数据库操作、事务管理、AOP、DI等...

    mybatis学习文档

    1. **配置文件**:MyBatis的配置文件主要包含数据源配置、事务管理器配置和SqlSessionFactory配置。数据源定义了连接数据库的信息,包括URL、用户名和密码。事务管理器定义了事务的处理方式,而SqlSessionFactory则...

    动力节点老杜MyBatis教程学习资料分享

    课程讲解从Mybatis的一些核心要点与实战中的运用,一直过渡到MyBaits源码,由表及里的代入架构思维。一步一案例,一码一实操,学,嘴对嘴指导。从简单到深入,从实战到源码,MyBatis重点、难点、考点一网打尽。

    mybaits cms项目第9天

    1. SQL映射文件:MyBatis的核心是XML或注解形式的SQL映射文件,它定义了SQL语句、参数绑定和结果映射。在项目中,开发者会学习如何编写这些映射文件,以及如何通过MyBatis的SqlSession接口执行SQL操作。映射文件中的...

    springMVC+springSecurity3.x+Mybaits3.x旧版蓝缘后台管理系统源代码

    通过分析这些源码,我们可以看到SpringMVC如何配置和定义控制器,SpringSecurity3.x如何设置认证和授权规则,以及MyBatis3.x如何编写Mapper接口和XML配置来操作数据库。这不仅是一个学习和研究的例子,也是实际项目...

Global site tag (gtag.js) - Google Analytics