提问1:如果没有spring-mybatis,我们如何在spring中使用定义bean,如何使用事务?

mybatis-Spring为我们带来多种方式的Mapper接口的注册,扫描,识别。

如果不使用mybatis-spring也可以。需要手工在配置文件中,注册SqlSessionFactory,SqlSession,注册具体的Mapper

1、我们自己来注册,现在xml中声明一个自定义的factoryBean

<bean id="sqlSessionFactory" class="org.mybatis.example.spring.self.init.SqlSessionBuilderFactory">
<property name="mapperLocation" value="mybatis-config.xml"/>
</bean>

2、自定义的factorybean的代码

package org.mybatis.example.spring.self.init;

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.beans.factory.FactoryBean; public class SqlSessionBuilderFactory implements FactoryBean<SqlSessionFactory> { private String mapperLocation;
@Override
public SqlSessionFactory getObject() throws Exception {
return (new SqlSessionFactoryBuilder()).build(this.getClass().getClassLoader().getResourceAsStream(mapperLocation));
} @Override
public Class<?> getObjectType() {
return null;
} public void setMapperLocation(String mapperLocation) {
this.mapperLocation = mapperLocation;
}
}

3.service层的调用

package org.mybatis.example.spring.service;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.example.mapper.MybatistestMapper;
import org.mybatis.example.model.Mybatistest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource;
import java.util.Date;
import java.util.Random; @Service("daoCallerInjectWithSqlSession")
public class DaoCallerInjectWithSqlSession { @Resource(name="sqlSessionFactory")
SqlSessionFactory sqlSessionFactory; @Transactional
public void updateDb(Mybatistest test){ SqlSession sqlSession = sqlSessionFactory.openSession(); MybatistestMapper mapper =sqlSession.getMapper(MybatistestMapper.class); mapper.selectByPrimaryKey(test.getId()); Random random =new Random();
test.setMykey(String.valueOf(random.nextInt(500)));
test.setMyvalue(random.nextBoolean());
test.setCreateTime(new Date());
test.setCreateUser("ccc");
test.setIsDelete((byte)0);
sqlSession.getMapper(MybatistestMapper.class).updateByPrimaryKey(test);
sqlSession.commit();
}
}

通过以上方式,可以获取sqlSession对象,并完成事务.

使用mybatis-spring,是如何为我们获取Mapper,以及管理事务?

 一、事务的管理过程:

以下序列图,描述了Mapper的创建

1、

  mybatis-Spring初始化sqlSessionFactory,在初始化过程中,

  设置事务管理器为Spring管理的事务管理器。mybatis自带的事务,是通过事务管理器来创建

  先来回顾下,mybatis是如何创建事务的

  1.1 关于事务的创建。mybatis-spring在创建sqlsession时,从transactionManager创建一个事物,赋值给sqlSession,sqlSession在执行过程中,通过这个transaction来获取链接,提交事务。

  1.2 关于sqlSessionTemplate的说明。不适用Spring的时候,每次请求数据库可以创建一个新的sqlSession.并且事务由调用方,手动管理。而在mybatis-spring中,sqlSession这个接口被泛化,

    所有的Mapper需要sqlSession的时候,得到的都是sqlSessionTemplate这个对象,这个对象在真正执行之前,创建sqlSession,并为sqlSession分配spring管理的事务。

    来看一段sqlSessionTemple的代理对象初始化的代码
    

 private class SqlSessionInterceptor implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
SqlSession sqlSession = getSqlSession(
SqlSessionTemplate.this.sqlSessionFactory,
SqlSessionTemplate.this.executorType,
SqlSessionTemplate.this.exceptionTranslator);

  在真正执行sqlSession方法的时候,会初始化sqlSession.从spring的TransactionSynchronizationManager对象,获取sqlsession。

2、来看第二章序列图,当调用Service层,service层调用Mapper的时候,是如何处理请求,管理事务的

  

红色的线,代表Spring的事务管理。

2.1 在Mapper执行开始前,Spring-AOP创建事务,和当前线程绑定

2.2 sqlSessionTemplate创建真正的SqlSession,执行sql时会获取sqlSession中的transaction,通过transaction获取链接

2.3当执行完毕后,AOP通过当前线程获取事务,并提交事务。

二、Mybatis-spring中的MapperBean注册

方式一、Spring配置文件中定义MapperFactoryBean

 <bean id="mybatisTestMapper" class="org.mybatis.spring.mapper.MapperFactoryBean" >
<property name="mapperInterface" value="org.mybatis.example.mapper.MybatistestMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

MapperFactoryBean的类图:

因为继承了InitiaLizingBean ,所以会在afterproperties中初始化Mapper.

继承DaoSupport后,可以获得sqlSessionFactory,用来进行Mapper的初始化。

方式二、通过Spring handler,解析xml中的节点,到指定路径匹配Mapper,转换成MapperFactoryBean

    <mybatis:scan base-package="org.mybatis.example.mapper" factory-ref="sqlSessionFactory" />

方式三、直接配置MapperScannerConfigurer,实现方式同上

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>

方式四、通过注解方式配置basePackage,手段不同,实现方式同二、三

@Configuration
@MapperScan("org.mybatis.spring.sample.mapper")
public class AppConfig {
}

mybatis与Spring的更多相关文章

  1. MyBatis6:MyBatis集成Spring事物管理(下篇)

    前言 前一篇文章<MyBatis5:MyBatis集成Spring事物管理(上篇)>复习了MyBatis的基本使用以及使用Spring管理MyBatis的事物的做法,本文的目的是在这个的基 ...

  2. MyBatis5:MyBatis集成Spring事物管理(上篇)

    前言 有些日子没写博客了,主要原因一个是工作,另一个就是健身,因为我们不仅需要努力工作,也需要有健康的身体嘛. 那有看LZ博客的网友朋友们放心,LZ博客还是会继续保持更新,只是最近两三个月LZ写博客相 ...

  3. 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】

    一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...

  4. Mybatis整合Spring

    根据官方的说法,在ibatis3,也就是Mybatis3问世之前,Spring3的开发工作就已经完成了,所以Spring3中还是没有对Mybatis3的支持.因此由Mybatis社区自己开发了一个My ...

  5. MyBatis学习(四)MyBatis和Spring整合

    MyBatis和Spring整合 思路 1.让spring管理SqlSessionFactory 2.让spring管理mapper对象和dao. 使用spring和mybatis整合开发mapper ...

  6. Mybatis与Spring整合,使用了maven管理项目,作为初学者觉得不错,转载下来

    转载自:http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype ...

  7. mybatis,Spring等工具对xml文件正确性的验证

    我们知道mybatis或者spring都是使用xml文件作为配置文件,配置文件的格式都是定义在叫做.dtd或者.xsd文件中的,当工具在解析用户自己定义的xml文件的时候,如何才能知道用户自定义的文件 ...

  8. 重构Mybatis与Spring集成的SqlSessionFactoryBean(1)

    一般来说,修改框架的源代码是极其有风险的,除非万不得已,否则不要去修改.但是今天却小心翼翼的重构了Mybatis官方提供的与Spring集成的SqlSessionFactoryBean类,一来是抱着试 ...

  9. Mybatis学习--spring和Mybatis整合

    简介 在前面写测试代码的时候,不管是基于原始dao还是Mapper接口开发都有许多的重复代码,将spring和mybatis整合可以减少这个重复代码,通过spring的模板方法模式,将这些重复的代码进 ...

  10. Mybatis 与 spring mvc

    本文是用来小结一下自己mybatis 和spring mvc 学习过程. 在写的过程中发现 http://www.phperz.com/article/15/0127/48684.html 这篇文章里 ...

随机推荐

  1. ejabberd之开题篇

    ejabberd是基于Jabber/XMPP协议的即时通讯服务器.采用Erlang/OTP开发.它的特点是,跨平台,容错,集群和模块化.     因为自己本身是基于erlang工作,而且听到有不少的公 ...

  2. phoneshop cs6破解

    一.以“试用”方式安装photoshop: 二.下载amtlib.dll破解文件,密码:ubx2: 三.备份photoshop目录下的amtlib.dll文件,将下载的amtlib.dll文件拷贝到p ...

  3. windows安装oracle-odbc驱动错误原因

    在windows7上准备使用powerdesigner16连接oracle逆向生成表结构,确发现一直无法连接oracle,其原因是本机没有ODBC驱动. 第一步 安装oracle11g客户端,这里是具 ...

  4. Springboot 部署到linux(二)

    之前写了一篇部署的文章,但是打包时会运行所有的单元测试,如果不想测试的话,可以采用这种方式. 第一部分:打包 1.pom.xm添加配置 <plugin> <groupId>or ...

  5. 计算python中对象的内存大小

    一般的sys.getsizeof()显示不了复杂的字典. 查看类中的内容: def dump(obj): for attr in dir(obj):#dir显示类的所有方法 print(" ...

  6. html5 知识点简单总结02

    三个列表: 1.无序列表 默认样式  实心小圆点 ul type属性 "square" 实心方形 type属性  "circle" 空心圆 type属性  &q ...

  7. vue day7 table checkbox 全选

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. Appium环境搭建——安卓真机调试注意点

    1.安卓设备连接失败 通过adb devices命令 查看安卓设备的连接情况,如图,未成功连接 解决方法: (1)关闭360安全卫士和360手机助手(2)查看5037端口是否被占用 netstat - ...

  9. 听说https更安全

    0--介绍: 现在人们对网络的依赖越来越重,那么对于网络安全的要求也越来越高,传统的http协议实现了网络中的快速传输,完整传输,保证了信息的完整性,但是对于网络的安全性却没有那么强,很容易被人劫持, ...

  10. 关于pycharm中导入自己写的模块没有智能提示的解决办法

    在pycharm界面中右击py文件所在的文件夹,选择Make Directory as文件,选择其中一个即可