从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" 是一个关于MyBatis框架的示例项目,它旨在帮助开发者更好地理解和学习如何在实际开发中应用MyBatis。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。通过简化DAO...
1. **配置文件**:包括Spring的配置文件(如`applicationContext.xml`),MyBatis的配置文件(如`mybatis-config.xml`),以及数据库连接相关的配置(如`db.properties`)。 2. **实体类(Entity)**:这些类代表...
1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,...
【标题】"springmvc+mybaits+spring"是一个典型的Java Web开发框架组合,用于构建高效、可维护的Web应用程序。这个源码示例涵盖了MyBatis、Spring MVC和Spring这三个核心组件,它们各自承担着不同的职责。 【描述】...
【SpringMVC+MyBatis+Spring 基础整合详解】 在现代Java Web开发中,...对于初学者来说,"SpringMVC+MyBatis+Spring基础整合 源码 jar包都有"的示例是一个很好的学习起点,能够帮助理解这些框架的实际工作方式。
基于vue-cli+springboot+mybaits的音乐网站源码(含客户端+服务端+管理后台).zip基于vue-cli+springboot+mybaits的音乐网站源码(含客户端+服务端+管理后台).zip基于vue-cli+springboot+mybaits的音乐网站源码(含...
1. **SqlSession与Executor**:在MyBatis中,SqlSession是与数据库交互的主要接口,它提供了执行SQL、提交和回滚事务的方法。Executor是SqlSession的内部实现,分为SimpleExecutor(简单执行器)、ReuseExecutor...
5. **源码学习价值** 深入研究Mybatis Plus源码,可以了解其内部实现机制,包括: - 如何处理动态SQL,构建SQL语句。 - CRUD操作的具体实现细节,如插入、更新、删除的逻辑。 - 分页插件的工作原理。 - 自动...
总的来说,这个压缩包提供的源码示例对于初学者理解SSM整合和MyBatis的自动化配置有着很好的指导作用,同时也适合有经验的开发者参考和学习。通过深入研究和实践,可以提升Java Web开发的能力,更好地应对复杂的企业...
**MyBatis的源码学习:** 理解MyBatis的源码有助于深入掌握其实现原理,例如SqlSessionFactoryBuilder如何解析配置文件,SqlSession如何管理数据库连接,以及Mapper的动态代理机制等。 **与其他ORM框架对比:** ...
通过深入阅读和理解这些源码,我们可以学习到以下知识点: - MyBatis 插件机制的工作原理,以及如何编写一个自定义的拦截器。 - SQL 解析和动态 SQL 在分页中的应用,如何在不改变原始 SQL 的基础上添加分页条件。 ...
1. **环境搭建**:介绍如何在项目中引入 MyBatis 相关依赖,配置 MyBatis 的核心配置文件(mybatis-config.xml),以及数据库连接信息。 2. **Mapper 接口与 XML 映射文件**:讲解如何创建 Mapper 接口,以及对应的...
1. SqlSessionFactory:它是MyBatis的核心,负责创建SqlSession对象,而SqlSession是执行SQL操作的主要接口。SqlSessionFactory通常由SqlSessionFactoryBuilder通过读取配置文件或XML配置构建。 2. SqlSession:...
《基于SpringBoot+MyBatis实现的图书出版平台源码解析及数据库设计》 在现代软件开发领域,SpringBoot和MyBatis框架的组合已成为构建高效、轻量级Web应用的首选方案。本毕业设计项目就是一个很好的实例,它利用这...
你可以学习到如何自定义逆向工程插件,实现更复杂的功能,比如自动添加注释、生成特定格式的代码等。此外,源码分析还可以帮助你更好地理解MyBatis框架的内部机制,提升你的MyBatis使用技能。 在实际项目中,...
通过学习和研究这些源码,你可以了解到如何在实际项目中整合Spring、SpringMVC和Mybatis,理解它们之间的交互机制,以及如何编写符合企业级标准的代码。同时,这个过程也会加深你对数据库操作、事务管理、AOP、DI等...
1. **配置文件**:MyBatis的配置文件主要包含数据源配置、事务管理器配置和SqlSessionFactory配置。数据源定义了连接数据库的信息,包括URL、用户名和密码。事务管理器定义了事务的处理方式,而SqlSessionFactory则...
课程讲解从Mybatis的一些核心要点与实战中的运用,一直过渡到MyBaits源码,由表及里的代入架构思维。一步一案例,一码一实操,学,嘴对嘴指导。从简单到深入,从实战到源码,MyBatis重点、难点、考点一网打尽。
1. SQL映射文件:MyBatis的核心是XML或注解形式的SQL映射文件,它定义了SQL语句、参数绑定和结果映射。在项目中,开发者会学习如何编写这些映射文件,以及如何通过MyBatis的SqlSession接口执行SQL操作。映射文件中的...
通过分析这些源码,我们可以看到SpringMVC如何配置和定义控制器,SpringSecurity3.x如何设置认证和授权规则,以及MyBatis3.x如何编写Mapper接口和XML配置来操作数据库。这不仅是一个学习和研究的例子,也是实际项目...