<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:com/mybatis/mapping/*.xml" />
</bean>
咱们知道这个类SqlSessionFactoryBean明显就是一个spring的类。咱们也知道mybatis是持久化数据的框架。那么spring若是要整合mybatis他要作什么呢?html
这件事情咱们不妨去猜一猜:java
第一猜:spring都是经过本身的容器管管理类的,那么mybatis要想整合,最终要包装成spring可以操控的factorybean。从名字SqlSessionFactoryBean有没有感?(吼吼)mysql
第二猜:若是咱们本身使用mybatis,其实就是调用底层他的接口去实现功能,那么spring把这件事情本身封装了,让咱们调用他的 方法,他再去调用mybatis的方法,这样是否是就实现了mybatis和spring的整合?(呲牙)git
在深刻SqlSessionFactoryBean类具体源码以前,咱们来看看mybatis的配置一般是什么样子的。github
mybatis的内容包括哪些重要的部分,若是不清楚这些那么咱们也没法知道spring是如何包装mybatis的。那么在没有spring以前,mybatis是如何自行工做的呢?
mybatis主要包括如下这七项配置项。如想深刻配置具体内容请查看参考文献
properties:用于配置属性信息。 settings:用于配置MyBatis的运行时方式。 typeAliases:配置类型别名,能够在xml中用别名取代全限定名。 typeHandlers:配置类型处理器。 plugins:配置拦截器,用于拦截sql语句的执行。 environments:配置数据源信息、链接池、事务属性等。 mappers:配置SQL映射文件。没有spring以前,使用mybatis须要如下几步骤。
web
一、jdk、tomcat(或者其余web容器),必需的。spring
二、建立一个web项目sql
三、解压mybatis3.2.3.zip文件,把mybatis-3.2.3.jar和lib目录下的全部jar包复制到WEB-INF/lib数据库
四、复制mysql-connector-java-5.1.14.jar到WEB-INF/libtomcat
五、在mysql建立一个mybatis数据库,新建一个user表,里面有id,name,password。
六、新建一个实体。
七、建立一个mapper接口
八、建立一个mapper.xml,里面写和mapper接口中定义一致的sql语句。
九、在classpath下建立mybatis配置文件mybatis-confi.xml,里面配置
<setting>
<typeAliases>
<environments>
<mappers>
十、新建一个可以生成mybatis工厂的单例类
public class MybatisUtil {
private static SqlSessionFactory sqlMapper; private static Reader reader; static { try { reader = Resources.getResourceAsReader("mybatis-config.xml"); sqlMapper = new SqlSessionFactoryBuilder().build(reader); } catch (Exception e) { e.printStackTrace(); } } public static SqlSessionFactory getInstance() { return sqlMapper; } }
最后,使用方式就是
建立工厂类-》打开session-》执行mapper接口中的语句(insert、update、select、delete)-》关闭session
spring要想集成mybatis,其实它就是把它拉来当“手下”,spring不去再关心数据持久化的具体过程(那都是mybatis要作的),他只要作的就是讲mybatis拉到本身的“办公室”来,给他“一把椅子”,让他乖乖工做。(而后偷笑!)
spring要想作到这一点其实不是容易的事情,由于spring的办公室很复杂,mybatis穿过办公室的门进入办公室就要大费周章。那么spring是怎么作到的呢?下面咱们一块儿琢磨
SqlSessionFactoryBean类实现了接口FactoryBean<SqlSessionFactory>, InitializingBean。最终spring在调用getBean的时候返回的并非类SqlSessionFactoryBean,而是他的属性类SqlSessionFactory的实例,代码以下:
public void afterPropertiesSet() throws Exception { notNull(dataSource, "Property 'dataSource' is required"); notNull(sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required"); this.sqlSessionFactory = buildSqlSessionFactory(); }public SqlSessionFactory getObject() throws Exception { if (this.sqlSessionFactory == null) { afterPropertiesSet(); } return this.sqlSessionFactory; }
至此,咱们看到了sqlSessionFactory的实例生成,那么它有是如何注入到容器中的呢?
有了sqlSessionFactory 就要把它放置到容器中去管理。那么spring的容器如何载入这个类实例的哪?这里说的sqlSessionFactory是配置文件中SqlSessionFactoryBean对应的id。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:com/mybatis/mapping/*.xml" /></bean>
第一步:查看到web,来看看spring容器启动的入口类:org.springframework.web.context.ContextLoaderListener
这个类直接调用了方法contextInitialized初始化WebApplicationContext
最终xml中配置的mybatis类都成为了BeanDefinition放入到了spring容器中去管理。那么最终咱们去执行sql语句的时候spring是执行的呢?
在咱们调用到sql语句的时候,会把相应的mybatis代理类封装到HandlerMethod类中
设置到拦截器链条中(如图)
//类:AbstractHandlerMapping public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { Object handler = getHandlerInternal(request); if (handler == null) { handler = getDefaultHandler(); } if (handler == null) { return null; } // Bean name or resolved handler? if (handler instanceof String) { String handlerName = (String) handler; handler = getApplicationContext().getBean(handlerName); } return getHandlerExecutionChain(handler, request); }
而后spring的代理工厂会根据这个拦截器链条去调用mybatis的代理类去执行sql语句。
//MapperProxy<T> final MapperMethod mapperMethod = cachedMapperMethod(method); return mapperMethod.execute(sqlSession, args); }

下面的章节我会详细分析各个部分。
参考文献:
http://my.oschina.net/u/1269959/blog/521703
http://blog.csdn.net/etttttss/article/details/8902125
http://mybatis.github.io/mybatis-3/zh/configuration.html
http://www.luoshengsha.com/266.html