提问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. Good Time------打卡让生活更美好

    Section 1团队介绍 Part 1 队员信息 姓名 学号 职务 王怡镔 2016012045 组长 于鑫宇 2016012029 组员 张济吨 2016012072 组员 黄鹤 20160120 ...

  2. ssm配置文件叙述

    spring+springmvc+mybatis框架中用到了三个XML配置文件:web.xml,spring-mvc.xml,spring-mybatis.xml.第一个不用说,每个web项目都会有的 ...

  3. ejabberd之开题篇

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

  4. php 品牌全车零件订购平台( 带采集数据 及 账号自动登陆【已绕过https证书加密】,php源码 ,QQ: 876635409 )

    php捷豹路虎 品牌全车零件订购平台  ( 带采集数据 及 账号自动登陆[已绕过https证书加密],php源码 ,QQ: 876635409 [由于咨询用户太多,请备注:汽车配件]) 一.php+m ...

  5. Ubuntu系统下Anaconda使用方法总结

    前言:个人认为Anaconda比pip使用起来要方便很多,因为它创建虚拟环境和下载各种库都很方便.但是有时候conda的安装方法中没有某些库,必须使用pip来进行安装.所以,主要用Anaconda,偶 ...

  6. [LeetCode&Python] Problem 53. Maximum Subarray

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  7. 20155219付颖卓 Exp3 免杀原理与实践

    1.基础问题回答 (1)杀软是如何检测出恶意代码的? 杀毒软件有一个病毒的特征码库,通过识别恶意代码的特征码或者特征片段检测恶意代码 杀毒软件通过动态检测对象文件的行为来识别恶意代码,如果他的行为在一 ...

  8. PyCharm提交代码到git

  9. c指针存放的是常量的地址

    ''' #include <stdio.h> int main(){    int b = 1;    int c = 2;    int* a = &b;    printf(& ...

  10. switch_case注意事项

    1.switch 语句有至少一个 case 代码块和一个可选的 default 代码块. 这里的 switch 从第一个 case 分支比较 a 的值,值为 3 匹配失败.然后比较 4.匹配,所以从  ...