MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
那么我比较困惑的一点是,mybatis的mapper接口并没有任何实现它的实例,那它是怎么利用动态代理来进行mapper xml与接口的连接呢?下面我将从源码成名说明一下整个流程,同时将会给一个简单的例子来说明它实现的原理。
先来看一段例子:
public class DynamicProxyTest {
static interface IHello {
public String sayHello();
}
static class DynaProxy implements InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("dynamic proxy");
return new String("123");
}
}
public static void main(String[] args) {
IHello hello = (IHello) Proxy.newProxyInstance(IHello.class.getClassLoader(), new Class[] { IHello.class }, new DynaProxy());
String str = hello.sayHello();
System.out.println(str);
}
}
请注意上面的例子,HelloImpl并未实现IHello,所以在DynaProxy中的invoke方法中不能调用method.invoke(Object obj, Object[] args),因为Java的动态代理机制要求obj上面的method调用的前提是obj实现了接口。此处虽然用了反射中的动态代理结构来组织代码实际上,此例子并非动态代理,这样就做到了IHello在没有任何实现的情况下,获得返回值。这主要就是MyBatis-3的mapper接口和xml的连接原理。
下面来翻一下MyBatis的源码,便于大家今后更方面的阅读。
MyBatis-3的使用,伪代码表示
String mapperResource = "mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(mapperResource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
session = sessionFactory.openSession();
AccountSecurityMasterMapper mapper = session.getMapper(AccountSecurityMasterMapper.class);
List<AccountSecurityMaster> result = mapper.selectAll();
mapper类
public interface AccountSecurityMasterMapper extends Mapper {
List<AccountSecurityMaster> selectAll();
}
关于此段代码的配置文件
<!-- mybatis-config.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="AccountSecurityMaster" type="org.mark.domain.AccountSecurityMaster"/>
</typeAliases>
<mappers>
<mapper resource="org/mark/mapper/AccountSecurityMaster.xml"/>
</mappers>
</configuration>
<!-- AccountSecurityMaster.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mark.mapper.AccountSecurityMasterMapper">
<cache />
<resultMap type="AccountSecurityMaster" id="AccountSecurityMasterResult">
<id column="ACCT_SEC_ID" property="acctSecId" />
<result column="FUND_ID" property="fundId" />
<result column="SECURITY_ID" property="securityId" />
</resultMap>
<select id="selectAll" parameterType="String"
resultMap="AccountSecurityMasterResult">
SELECT * FROM ACCOUNT_SECURITY_MASTER
</select>
</mapper>
DefaultSqlSession: SqlSession的子类,定义一些列的数据库操作。
XMLConfigBuilder : 读取mybatis-config.xml,并将xml中配置的内容映射成相应的java代码。
XMLMapperBuilder:读取AccountSecurityMaster.xml,并将其中的mapper的接口映射成MapperProxyFactory,并保存在MapperRegistry中。
Configuration:用来操作配置的一系列内容
MapperRegistry:处理与保持xml中Mapper对应的MapperProxyFactory。
MapperProxyFactory:创建mapper的接口的伪实例
MapperProxy:负责代理mapper的接口,并在invoke方法内返回MapperMethod的执行结果
MapperMethod:此类用于将AccountSecurityMaster.xml中的insert,update,delete,select配置直接映射成jdbc的statement操作。
分享到:
相关推荐
1. **配置解析**:MyBatis的配置文件(mybatis-config.xml)被解析成Configration对象,这个对象包含了所有的全局配置信息,如数据源、事务管理器、Mappers等。解析过程主要由XMLConfigBuilder类完成。 2. **...
SqlSessionFactory 的创建通常通过 SqlSessionFactoryBuilder,它解析配置文件或 XML 配置流来生成。 - SqlSession 提供了执行 SQL 语句和管理事务的方法,例如:selectOne、insert、update 和 delete。 2. **...
(3)配置Spring:在Spring的配置文件中,声明SqlSessionFactoryBean,并通过mybatis-spring的SqlSessionTemplate或SqlSessionDaoSupport来创建Mapper接口的代理。 (4)注入Mapper:在需要使用Mapper的Spring Bean...
3. **Mapper 接口和动态代理**:MyBatis 允许我们定义接口来操作数据库,然后通过动态代理机制,将方法调用转换为 SQL 执行。源码分析这部分,可以理解到 MyBatis 如何利用 Java 的反射和动态代理技术来实现这一特性...
总的来说,`mybatis-3-master` 源码分析可以帮助我们理解 MyBatis 内部的工作原理,提高我们对 SQL 执行流程、对象映射机制的理解,从而更好地优化数据库操作,提升系统性能。同时,通过阅读源码,开发者还能学习到...
在MyBatis-Spring中,我们可以通过定义Mapper接口并添加@Mapper注解,然后在Spring配置文件中使用MapperScannerConfigurer进行扫描,这样就可以直接在Service层注入Mapper接口,无需关心具体的SqlSession操作。...
它允许你在 Spring 配置文件中设置数据源、MyBatis 配置文件路径等属性。 - `SqlSessionTemplate`:它是 MyBatis 的 `SqlSession` 的线程安全实现,可以直接注入到 DAO 类中,用于执行 SQL 语句。 - `...
标题"mybatis-3-master.rar"指的是MyBatis框架的3.x主分支的源码,这通常是开发人员为了深入理解框架内部工作原理,或者进行二次开发时会下载和研究的资源。这个压缩包包含了MyBatis的核心源代码,包括MyBatis的构建...
当我们在代码中调用Mapper接口的方法时,MyBatis会动态生成代理对象,执行对应的SQL并返回结果。 3.4.1版本的MyBatis源码中,我们可以关注以下几个关键模块: 1. **Configuration**:这是MyBatis的全局配置,包含...
在压缩包子文件的文件名称列表中,我们只看到了"mybatis-3-mybatis-3.2.0"这一项,这可能意味着压缩包内主要包含了MyBatis 3.2.0版本的所有源代码文件,包括核心库、文档、示例等。开发者可以通过解压并阅读这些源...
通过这些文件,我们可以了解到MyBatis的模块划分,例如SqlSessionFactoryBuilder、SqlSessionManager、Mapper接口及动态代理等核心组件的工作方式。 总之,这个MyBatis 3.4.0的源码压缩包是Java开发者深入了解...
在"spring-mybatis-spring-1.3.2"中,MyBatis主要负责数据库操作,通过XML配置文件或者注解方式定义SQL语句,将Java对象与数据库记录进行映射,简化了数据访问层的开发工作。MyBatis与Spring的整合,实现了DAO(Data...
在本压缩包“mybatis-3-mybatis-3.5.4-src-read.zip”中,包含了作者对MyBatis 3.5.4版本源码的阅读理解,特别进行了关键部分的注解和流程解析,对于学习和深入理解MyBatis的工作原理非常有帮助。 1. **MyBatis架构...
在 `mybatis-3-mybatis-3.5.13` 这个版本中,我们可以探索以下几个重要的知识点: 1. **SQL 映射机制**:MyBatis 的核心是 SQL 映射文件,它允许开发者直接编写 SQL 语句,通过 XML 或注解方式定义在接口的方法上。...
2. **XML配置与注解**:MyBatis支持两种映射方式,一种是XML配置文件,另一种是注解。XML配置文件中,我们可以定义SQL语句、参数映射和结果映射;注解方式则可以直接在Mapper接口的方法上标注,简化了配置。 3. **...
例如,Mapper接口的动态代理机制、XML映射文件解析、SQL语句的动态拼接等。 3. **mybatis-3.5.7-tests.jar**:测试库,用于验证MyBatis的功能。通过这些测试用例,我们可以理解MyBatis如何处理各种场景,如插入、...
3. **Mapper接口与Mapper XML文件**:MyBatis允许我们定义Mapper接口,每个方法对应一个SQL查询,其对应的XML配置文件定义了SQL语句和映射规则。 4. **动态SQL**:MyBatis支持动态SQL,可以在XML配置文件中使用if、...
配合教程使用时,你可以逐步理解MBG如何工作,通过修改配置文件,观察生成的代码有何变化,从而深入理解MyBatis和MBG的工作原理。此外,还可以学习如何自定义MBG插件,以满足特定的编码风格或业务需求。 总的来说,...
在`mybatis-3-mybatis-3.2.7`源码中,我们可以深入理解MyBatis的工作原理和核心机制。以下是一些关键知识点: 1. **SqlSessionFactoryBuilder**:它是构建SqlSessionFactory的工厂类,通过读取配置文件(XML或Java ...
1. **配置文件**:MyBatis的核心配置文件(mybatis-config.xml)定义了数据源、事务管理器、环境配置、Mappers等。其中,Mappers是映射文件的集合,它们定义了SQL语句和Java方法之间的映射关系。 2. **映射文件...