原生的Mybatis是怎么使用的?

只列举关键代码

public static void main(String[] args) throws Exception {Reader reader=Resources.getResourceAsReader("resource/configuration.xml");SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);SqlSession session=sessionFactory.openSession();PersonDao personDao=session.getMapper(PersonDao.class);Person person=new Person("11","Fighter168");personDao.save(person);//这里一定要提交,不然数据无法插入session.commit();session.close();
}

Mybatis+Spring是怎么使用的

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="123abc"/><!-- 连接池启动时候的初始连接数 --><property name="initialSize" value="10"/><!-- 最小空闲值 --><property name="minIdle" value="5"/><!-- 最大空闲值 --><property name="maxIdle" value="20"/><property name="maxWait" value="2000"/><!-- 连接池最大值 --><property name="maxActive" value="50"/><property name="logAbandoned" value="true"/><property name="removeAbandoned" value="true"/><property name="removeAbandonedTimeout" value="180"/></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="configLocation" value="classpath:/resource/cfg.xml"/><property name="dataSource" ref="dataSource"/></bean><bean id="personDao" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="net.itaem.dao.PersonDao"/><property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean>
</beans>
public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("resource/ApplicationContext.xml");PersonDao personDao=(PersonDao) context.getBean("personDao");Person person=new Person("12","Fighter168");personDao.save(person);
}

通过上面的比较,我们发现,在Spring中使用MyBatis是相当方便的,不需要我们去关注sqlSessionFactory以及SqlSession的管理,也不需要我们去操作事务相关。
至于Spring到底做了什么工作,下面让我们进入主题,一探究竟。

spring整合mybatis原理

看spring的配置文件,配置了两个比较关键的类,SqlSessionFactoryBeanMapperFactoryBean

SqlSessionFactoryBean

public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> {

SqlSessionFactoryBean这个类实现了三个接口,一个是InitializingBean,另一个是FactoryBean,还有就是ApplicationListener接口。下面说明一下实现了这三个接口的,有什么作用

InitializingBean接口:实现了这个接口,那么当bean初始化的时候,spring就会调用该接口的实现类的afterPropertiesSet方法,去实现当spring初始化该Bean 的时候所需要的逻辑。

FactoryBean接口:实现了该接口的类,在调用getBean的时候会返回该工厂返回的实例对象,也就是再调一次getObject方法返回工厂的实例。

ApplicationListener接口:实现了该接口,如果注册了该监听的话,那么就可以了监听到Spring的一些事件,然后做相应的处理

所以我们先来看afterPropertiesSet方法,看看做了什么事

public void afterPropertiesSet() throws Exception {Assert.notNull(this.dataSource, "Property 'dataSource' is required");Assert.notNull(this.sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required");Assert.state(this.configuration == null && this.configLocation == null || this.configuration == null || this.configLocation == null, "Property 'configuration' and 'configLocation' can not specified with together");this.sqlSessionFactory = this.buildSqlSessionFactory();
}

从中我们可以看到,sqlSessionFactory的实例化便在这个方法里面实例化,buildSqlSessionFactory()方法会对我们的sqlSessionFactory做定制的初始化.

再来看getObject方法

public SqlSessionFactory getObject() throws Exception {if (this.sqlSessionFactory == null) {this.afterPropertiesSet();}return this.sqlSessionFactory;
}

可以看到,返回的其实是SqlSessionFactory

MapperFactoryBean

public class MapperFactoryBean<T> extends SqlSessionDaoSupport implements FactoryBean<T> {

MapperFactoryBean继承了SqlSessionDaoSupport,SqlSessionDaoSupport继承DaoSupport,DaoSupport实现了InitializingBean接口,让我们开看看它这接口的实现:

public final void afterPropertiesSet() throws IllegalArgumentException, BeanInitializationException {// Let abstract subclasses check their configuration.checkDaoConfig();// Let concrete implementations initialize themselves.try {initDao();}catch (Exception ex) {throw new BeanInitializationException("Initialization of DAO failed", ex);}
}

该方法主要包含两个功能,一个是调用checkDaoConfig()方法,一个是调用initDao方法。checkDaoConfig方法在DaoSupport是抽象方法,让我看看它在MapperFactoryBean的实现:

 /*** {@inheritDoc}*/@Overrideprotected void checkDaoConfig() {super.checkDaoConfig();notNull(this.mapperInterface, "Property 'mapperInterface' is required");Configuration configuration = getSqlSession().getConfiguration();if (this.addToConfig && !configuration.hasMapper(this.mapperInterface)) {try {configuration.addMapper(this.mapperInterface);} catch (Throwable t) {logger.error("Error while adding the mapper '" + this.mapperInterface + "' to configuration.", t);throw new IllegalArgumentException(t);} finally {ErrorContext.instance().reset();}}}

该方法主要是检查dao的配置,主要是检验sqlSessionFactory和mapperInterface属性不能为空,以及检测接口对于的映射文件是否存在,如果存在,那么就把它添加到configuration里面去,注册mapper。
getObject()
MapperFactoryBean实现了FactoryBean接口,那么在调用getBean方法获取MapperFactoryBean实例的时候,实际上调用的就是getObject方法,让我们来看看getObject的实现:

public T getObject() throws Exception {return getSqlSession().getMapper(this.mapperInterface);
}

看到这里,我们会恍然大悟,原来在这里封装了getMapper操作,返回接口的实例,怪不得在Spring中使用MyBatis不用管理sqlSession了。

总结

spring整合mybatis原理其实就是通过两个类:SqlSessionFactoryBeanMapperFactoryBean,其中SqlSessionFactoryBean通过实现Spring的FactoryBeanFactoryBean两大接口,来定义如何构建和获取SqlSessionFactory,然后我们把SqlSessionFactoryBean注入到MapperFactoryBean里面的时候,其实就相当于注入了SqlSessionFactory,而MapperFactoryBean也实现了FactoryBean接口,通过getObject封装了getMapper的操作.

原文:https://blog.csdn.net/fighterandknight/article/details/51448161

Mybatis与Spring集成原理相关推荐

  1. 【Mybatis+spring整合源码探秘】--- mybatis整合spring事务原理

    文章目录 1 mybatis整合spring事务原理 1 mybatis整合spring事务原理 本篇文章不再对源码进行具体的解读了,仅仅做了下面一张图: 该图整理了spring+mybatis整合后 ...

  2. Mybatis和Spring集成 sessionFactory.openSession() 事务不生效问题

    问题描述 Mybatis和Spring集成,查阅官方文档,得知Spring总会为你处理事务. 官方文档连接:http://mybatis.org/spring/zh/transactions.html ...

  3. MyBatis 3 – Spring集成教程

    作为本教程的第一步(带有MyBatis 3的Spring MVC 3 CRUD示例),我们将定义一个MyBatis服务,该服务将帮助我们在数据库上执行CRUD操作. 我们有一个用于User的域类和一个 ...

  4. Mybatis的Spring集成、Aop整合

    Mybatis的Spring集成.Aop整合pagehelper插件 Mybatis的Spring集成 导入pom依赖 <?xml version="1.0" encodin ...

  5. Mybatis与Spring集成(易百教程)

    整个Mybatis与Spring集成示例要完成的步骤如下: 1.示例功能描述 2.创建工程 3.数据库表结构及数据记录 4.实例对象 5.配置文件 6.测试执行,输出结果 1.示例功能描述 在本示例中 ...

  6. 深入浅出MyBatis:MyBatis与Spring集成及实用场景

    为什么80%的码农都做不了架构师?>>>    本系列是「深入浅出MyBatis:技术原理与实践」书籍的总结笔记. 本篇是「深入浅出MyBatis」系列的最后一篇,主要介绍与Spri ...

  7. Spring集成MyBatis

    将mybatis与spring进行整合,主要解决的问题就是讲SqlSessionFactory对象交由spring来管理,所以,该整合,只需要将SqlSessionFactory的对象生成器SqlSe ...

  8. 使用MyBatis和Spring构建Java Web应用程序

    这篇文章将展示如何在Spring环境中使用带有MyBatis框架的MYSQL DB创建学生注册应用程序. 这是一个简单的应用程序,旨在在注册期间从用户收集输入详细信息,将详细信息保存在MYSQL DB ...

  9. mybatis和spring第一个整合程序

    知识点: 一.mybatis创建dao代理对象 StudentDao dao = sqlSession.getMapper(StudentDao.class); List<Student> ...

最新文章

  1. 教你如何实现c#文件上传下载功能
  2. php mysql两个表合并_php操作mysql两个数据库中表的数据同步
  3. SP1026 FAVDICE - Favorite Dice
  4. android获取string.xml的值(转)
  5. Hibernate Annotation _List/Map
  6. 网易云推出了一组程序猿の真实写照【文末有彩蛋】
  7. 机器学习实验中的编程技术(part1)--numpy
  8. HTTP与HTTPS区别(详细)
  9. 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)
  10. 乘积最大(信息学奥赛一本通-T1275)
  11. oracle10g自带的公共同义词,Oracle10g实战教程第07讲视图、同义词、序列
  12. Notepad++官网下载
  13. c语言ABCDEF前中后序遍历,c语言实现二叉树及前中后序遍历
  14. 康奈尔笔记法,早点认识你我可能去北大了
  15. 抖音短视频在线下载无水印,
  16. G-sensor 介绍
  17. 英语四级词汇量测试软件,大学英语四级词汇量要求及自测卷
  18. Type mismatch: inferred type is MainActivity but FlutterEngine was expected
  19. c语言gets和getchar区别,C语言中 gets 和 getchar 有什么区别
  20. 查看git HEAD

热门文章

  1. 21个经典段子,你得到启示了吗?
  2. pgadmin4信息收集语句
  3. 【css】CSS3有哪些新特性
  4. 这年头还不来尝试线稿图视频??
  5. JS面向对象——利用transform实现扇子效果
  6. 浮动滚动条 slimScroll
  7. mysql 调用js函数_mysql_存储过程和函数
  8. 演进:如何在工作的前三年里快速成长
  9. charCodeAt与fromCharCode
  10. 妈妈买鞋和衬衣一共花了356元