在 Spring 集成 MyBatis 的场景中,MyBatis 的 XML 文件(包括 MyBatis 配置文件和 Mapper 映射文件)是通过 Spring 的配置机制加载的。以下是具体的加载过程:
1. 配置 SqlSessionFactoryBean
在 Spring 的配置文件或 Java 配置类中,需要定义一个 SqlSessionFactoryBean
的 Bean。SqlSessionFactoryBean
是 MyBatis 和 Spring 集成的核心组件之一,它负责加载 MyBatis 的配置文件和映射文件,并构建 SqlSessionFactory
。
使用 XML 配置文件
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="mapperLocations" value="classpath*:com/example/mapper/*.xml" />
</bean>
使用 Java 配置类
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:com/example/mapper/*.xml"));
return sessionFactory.getObject();
}
2. 加载 MyBatis 配置文件
SqlSessionFactoryBean
会加载指定路径下的 MyBatis 配置文件(mybatis-config.xml
)。该文件中定义了数据库连接信息、事务管理方式、环境配置等。
3. 加载 Mapper 映射文件
SqlSessionFactoryBean
会根据 mapperLocations
属性指定的路径加载所有的 Mapper 映射文件(*.xml
)。这些映射文件中定义了 SQL 语句以及输入输出参数的映射关系。
4. 构建 SqlSessionFactory
SqlSessionFactoryBean
会解析 MyBatis 配置文件和映射文件的内容,并将它们注册到 MyBatis 的 Configuration
对象中。然后,它会使用这个 Configuration
对象来构建 SqlSessionFactory
。
5. 扫描 Mapper 接口
Spring 会通过 MapperScannerConfigurer
扫描指定包路径下的 Mapper 接口,并为每个接口生成对应的代理对象。
使用 XML 配置文件
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
使用 Java 配置类
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setBasePackage("com.example.mapper");
configurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
return configurer;
}
6. 动态代理机制
当调用 Mapper 接口的方法时,Spring 会通过 MyBatis 的动态代理机制调用底层的 SqlSession
来执行 SQL 语句。MapperProxy
会拦截方法调用,并通过 SqlSession
执行对应的 SQL 语句。
总结
在 Spring 集成 MyBatis 的场景中,MyBatis 的 XML 文件是通过 SqlSessionFactoryBean
加载的。SqlSessionFactoryBean
会加载 MyBatis 配置文件和映射文件,并构建 SqlSessionFactory
。然后,MapperScannerConfigurer
会扫描 Mapper 接口,并为每个接口生成代理对象。