这次讲讲Mybatis与Spring的整合,作为两款优秀的开源框架,被大众广泛使用,自然是需要强强联合的。
使用示例
先看一下怎么使用,首先需要引用这两款框架的jar包:
<dependency>//spring-webmvc会自动去引入其他Spring的核心包<groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-jcl</artifactId><version>${spring.version}</version>
</dependency>
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version>
</dependency>
<dependency>//集成包,是Mybatis和Spring的中间桥梁<groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.2</version>
</dependency>
在Spring的配置文件中需引入集成包的两个类:
org.mybatis.spring.SqlSessionFactoryBean:将Mybatis的SqlSessionFactory注入到Spring的IOC容器中;
org.mybatis.spring.mapper.MapperScannerConfigurer:配置Mybatis接口以及Spring容器中的SqlSessionFactory引用;
配置示例:
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">//配置数据源的引用<property name="dataSource" ref="dataSource"></property>//配置Mybatis对的配置所在类路径(可不配)<property name="configLocation" value="classpath:mybatis-config.xml"></property>//配置Mapper文件所在位置<property name="mapperLocations"><list><value>classpath:com/test/mybatis/dao/*.xml</value></list></property>
</bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">//配置DAO层接口所在位置,多个DAO路径可用,隔开<property name="basePackage" value="com.test.mybatis.dao"></property>//配置SqlSessionFactoryBean引用名称<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"></property>
</bean>
源码分析
Spring集成了Mybatis之后Mybatis的配置文件中的标签配置基本可以不需要配置,都可以在Spring中的配置;
先谈谈这两个类:
SqlSessionFactoryBean
Mybatis中任何属性均在在这个类中可配置:
我们可以发现这个实现了三个接口:
FactoryBean<SqlSessionFactory>:Spring中Bean存在的一种形式;
InitializingBean:Bean的初始化方法;
ApplicationListener<ApplicationEvent>:Spring IOC容器监听方法,分别在容器创建、关闭、刷新、停止时执行;
Bean的初始化方法:
在buildSqlSessionFactory方法中就是将Mybatis的流程加载一遍。
容器的监听方法:
MapperScannerConfigurer
该类实现了:
BeanDefinitionRegistryPostProcessor: BeanDefinitionRegistry的后置处理器,即在Spring容器创建时加载,可以修改Bean一些相关的信息;
InitializingBean:Bean的初始化方法:
ApplicationContextAware:上下文接口的Aware接口,可将容器中上下文对象开放;
BeanNameAware:Bean名称Aware接口,可以修改Bean的名称;
重点谈一下以下两个方法:
过滤器,在Spring当中能够指定过滤某些类或注解等等,在之前的Spring的文章好像没有谈到,那就下次在说吧:
在扫描的方法中,会将扫描接口的一些Bean的属性进行改变:
到了这里会发现将所有的接口Bean中的Class替换成MapperFactoryBean,那么这些接口所有的Class类型都是MapperFactoryBean了。
其实集成包中除了之前的两个类之外,还有一个MapperFactoryBean对象。
MapperFactoryBean
在MapperScannerConfigurer当中将所有的接口类型全部替换成MapperFactoryBean,所以在Spring的配置文件也可以这样配置单个接口:
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="com。test。mybatis。dao。UserDao"></property><property name="SqlSessionFactory" ref="sqlSessionFactoryBean"></property>
</bean>
如果接口过多,就需要配置很多MapperFactoryBean,不方便,所以一般在企业级应用中都是配置MapperScannerConfigurer。
这样我们调用DAO的接口对象就是MapperProxy的代理对象了,就可以操作数据库了
示例:
&将FactoryBean本身的类获取到,之前谈Spring的时候提到过。