文档章节

spring中的mybatis(1)

hyssop
 hyssop
发布于 2015/10/29 13:18
字数 1253
阅读 113
收藏 5


开门见山

<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他要做什么呢?

糊涂门之猜呀猜

这件事情我们不妨去猜一猜:

第一猜:spring都是通过自己的容器管管理类的,那么mybatis要想整合,最终要包装成spring能够操控的factorybean。从名字SqlSessionFactoryBean有没有感?(吼吼)

第二猜:如果我们自己使用mybatis,其实就是调用底层他的接口去实现功能,那么spring把这件事情自己封装了,让我们调用他的 方法,他再去调用mybatis的方法,这样是不是就实现了mybatis和spring的整合?(呲牙)

在深入SqlSessionFactoryBean类具体源码之前,我们来看看mybatis的配置通常是什么样子的。

点点mybatis

mybatis的内容包括哪些重要的部分,如果不清楚这些那么我们也无法知道spring是如何包装mybatis的。那么在没有spring之前,mybatis是如何自行工作的呢?
mybatis主要包括以下这七项配置项。如想深入配置具体内容请查看参考文献
 properties:用于配置属性信息。 settings:用于配置MyBatis的运行时方式。 typeAliases:配置类型别名,可以在xml中用别名取代全限定名。 typeHandlers:配置类型处理器。 plugins:配置拦截器,用于拦截sql语句的执行。 environments:配置数据源信息、连接池、事务属性等。 mappers:配置SQL映射文件。没有spring之前,使用mybatis需要以下几步骤。

1、jdk、tomcat(或者其他web容器),必需的。

2、创建一个web项目

3、解压mybatis3.2.3.zip文件,把mybatis-3.2.3.jar和lib目录下的所有jar包复制到WEB-INF/lib

4、复制mysql-connector-java-5.1.14.jar到WEB-INF/lib

5、在mysql创建一个mybatis数据库,新建一个user表,里面有id,name,password。

6、新建一个实体。

7、创建一个mapper接口

8、创建一个mapper.xml,里面写和mapper接口中定义一致的sql语句。

9、在classpath下创建mybatis配置文件mybatis-confi.xml,里面配置

<setting>
<typeAliases>
<environments>
<mappers>

10、新建一个能够生成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之工

spring要想集成mybatis,其实它就是把它拉来当“手下”,spring不去再关心数据持久化的具体过程(那都是mybatis要做的),他只要做的就是讲mybatis拉到自己的“办公室”来,给他“一把椅子”,让他乖乖工作。(然后偷笑!)

spring要想做到这一点其实不是容易的事情,因为spring的办公室很复杂,mybatis穿过办公室的门进入办公室就要大费周章。那么spring是怎么做到的呢?下面我们一起琢磨

1、生成工厂bean

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的实例生成,那么它有是如何注入到容器中的呢?

2、注入容器

有了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是执行的呢?

3、整合mybatis

在我们调用到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


© 著作权归作者所有

hyssop
粉丝 20
博文 102
码字总数 111521
作品 0
昌平
程序员
私信 提问
Spring与MyBatis整合

序言 在MyBatis学习中,我们会发现很多重复性的代码,例如: //创建连接 private SqlSessionFactory sqlSessionFactory = SessionFactoryUtils .getSessionfactory().getSqlSessionFactory(......

开源俱乐部
2014/07/09
458
0
Mybatis应用学习(6)——Spring框架整合与逆向工程

与Spring框架整合 1. 整合思路: 需要spring通过单例方式管理SqlSessionFactory。 spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession。(spring和mybatis整合自动完成)...

江左煤郎
2018/11/27
46
3
Spring Boot [集成-MyBatis]

导读: 在上篇文章中我们介绍了spring-data-jpa的一些常用方法,在这篇文章中我们在介绍关于mybatis与Spring Boot 的集成,及一些常用方法 集成: 这里有两种方式,一种是常规的Spring 应用的...

yangrd
2018/08/27
0
0
springmvc学习笔记(6)-springmvc整合mybatis(IDEA中通过maven构建

springmvc学习笔记(6)-springmvc整合mybatis(IDEA中通过maven构建) 标签: springmvc mybatis [TOC] 本文主要展示如何在intellij IDEA中通过maven构建springmvc+mybatis框架的开发环境。 需求...

brianway
2016/03/10
505
0
JavaEE Spring+Mybatis整合

1. MyBatis整合Spring所需的jar包如下: Spring的jar包 Mybatis的jar包 Mybatis-Spring整合包,即mybatis-spring-1.3.2.jar MySql的数据库驱动jar包 数据库连接池的jar包 2.整合思路 MyBati...

凌浩雨
2018/04/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ES6

ES6:不改变原理的基础上,让API变得更简单 一、let:代替var用于声明变量 1、var的缺点: (1)声明提前 (2)没有块级作用域 2、let的优点: (1)组织了申明提前 (2)让let所在的块({}),...

wytao1995
今天
3
0
kubernetes 环境搭建 —— minikube

创建集群 minikube start 搭建好 k8s 集群后,可以查看集群的状态以及部署应用。主要用到的是 k8s 的 api,这通常需借助于 kutectl 命令行工具 基本操作 kubectl versionkubectl cluster-i...

lemos
今天
9
0
关于js混淆与反混淆还原操作

使用js的混淆加密,其目的是为了保护我们的前端代码逻辑,对应一些搞技术吃饭的公司来说,为了防止被竞争对手抓取或使用自己的代码,就会考虑如何加密,或者混淆js来达到代码保护。 1、为什么...

开源oschina
今天
11
0
用盛金公式解三次方程(ansi c版)

/* cc cubic.c -lm gcc cubic.c -lm Shengjin's Formulas Univariate cubic equation aX ^ 3 + bX ^ 2 + cX + d = 0, (a, b, c, d < R, and a!= 0). Multiple root disc......

wangxuwei
今天
9
0
JBolt开发平台入门(16)- 弹出Dialog显示指定区域的html内容

在JBolt里,有个主从表Demo。 子表中除了普通的table显示,还有其它从表显示形式 比如下方案例:是针对一个升级管理子表中存放版本的changelog富文本信息。 需求是点击左上角的弹出查看按钮,...

山东-小木
今天
46
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部