Mybatis 整合 Spring 的对象初始化

全景预览

在这里插入图片描述

对象管理篇

我们在使用mybatis-spring开发的时候, 通常会写一个mapper接口, 然后写对应的xml 。 用起来就会很方便
那么这里就有几个问题

  1. Mapper是怎么被扫描到spring的呢?
  2. Mapper的动态代理类是什么?

我们在使用接口的时候, 一定要自定义一个接口扫描器.

/**
 *  自定义扫描器
 *  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" >
 *         <property name="basePackage" value="com.company.project.maper"/> 
 *  </bean>
 */
public interface BlogMapper {
	Blog selectByPrimaryKey(Long id);
}

扫描器的主要作用就是把符合条件的接口, 封装成一个bean放到 spring 中,
这里BlogMapper被扫描到了,
实际上和以下的定义方式是没有区别的

<bean id="blogMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" 
          value="com.company.project.maper.BlogMapper"/>
     <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
  </bean>

spring就会管理非常多的 org.mybatis.spring.mapper.MapperFactoryBean

MapperFactoryBean 是什么呢?
MapperFactoryBean 是一个实现了spring的FactoryBean接口。

FactoryBean 是spring提供的一种特殊的定义对象的接口,通过getObject方法创建实际的对象
所以被spring管理的会有两个对象

  1. blogMapper -> BlogMapperProxy(实现目标接口的动态代理类)
  2. &blogMapper -> MapperFactoryBean

SqlSession篇

SqlSession 是mybatis的执行主要接口, 可以理解为一个门面(内部自己进行组件交互实现功能)
在对象创建时SqlSession有两层实现

  1. SqlSessionTemplate 持有sqlSessionFactory,可以创建真正的SqlSession, 这里的相当于一层代理
  2. $SqlSession(这个类不存在) , 这个类是一个JDK动态代理类,也实现了SqlSession接口, 它的InvocationHandler 是SqlSessionTemplate 的一个内部类SqlSessionInterceptor。 这里主要就是结合spring-tx模块的事务

$SqlSessionProxy 就是和spring事务结合的核心逻辑:
如果当前事务中已经创建过SqlSession, 取出SqlSession
否则开启新的SqlSession

也就是说: 事务内无论执行多少次的数据库交互操作, 在mybatis层面,就只开启了一次会话(会话内有一级缓存特性)

巩固篇

理解了以上的过程和开头的对象创建全景图之后, 来验证一下你是否真正理解了吧.

问1: 以下代码会去数据库查询几次?

@Service
public class BlogService{
	 @Resource
    private BlogMapper blogMapper;
    @Transactional
    public void doMessage( String id) throws Exception {
        blogMapper.selectById(id);
        blogMapper.selectById(id);
        blogMapper.selectById(id);
    }
}

相信很多了解一级缓存的朋友已经知道, 只会去数据库查询一次。
这就是因为每次都是通过$SqlSession这个动态代理类, 和spring-tx模块的结合的时候获取到的同一个会话。

  1. spring事务拦截器获取Connection
  2. 第一次,创建会话,获取Connection, 绑定SqlSession到spring-tx
  3. 第二次,从事务中获取会话,从一级缓存中获取
  4. 第三次,从事务中获取会话,从一级缓存中获取
  5. spring提交事务之前, 提交会话,关闭Connection

问2: 取消事务标签后, 会获取几次会话?
答: 3次, mybatis操作数据库和会话绑定,会话和事务绑定。 (和tomcat请求没有关系)

  1. 第一次,创建会话,获取Connection, 执行查询,提交会话
  2. 第二次,创建会话,获取Connection, 执行查询,提交会话
  3. 第三次,创建会话,获取Connection, 执行查询,提交会话

问3: 如何在事务内让一级缓存失效呢?
比如: oracle获取序列

  1. 细粒度设置
	<!-- 加入属性 flushCache="true"  -->
	<select id="selectByPrimarykey" resultMap="ResultMap" flushCache="true">
			select <include refid="Base_comlumn_list"/>
			from BLOG
			where ID = #{id}
	</select>
  1. 粗粒度设置
    在mybatis.xml的settings->setting->localCacheScope=STATEMENT
    这种粗粒度的方式也是分布式场景下的推荐使用方式, 避免数据被其他机器更新后,当前机器的多次查询无法取得正确的结果
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以回答这个问题。MyBatis-Spring-Boot-Starter 是一个 MyBatisSpring Boot 集成的插件,可以方便地在 Spring Boot 项目中使用 MyBatis 进行数据库操作。它提供了自动配置和一些常用的配置选项,使得使用 MyBatis 变得更加简单和便捷。 ### 回答2: MyBatis-Spring-Boot-Starter是一个用于整合MyBatisSpring Boot的工具。它提供了一种方便的方式来配置和使用MyBatis持久化框架,并简化了与Spring Boot的集成过程。 首先,MyBatis-Spring-Boot-Starter支持自动配置。它会根据项目的依赖和配置文件来自动初始化和配置MyBatis,大大减少了手动配置的工作量。只需简单地在配置文件中指定数据库的连接信息和MyBatis的相关配置,就可以轻松地集成MyBatis框架到Spring Boot应用中。 其次,MyBatis-Spring-Boot-Starter还支持事务管理。通过注解的方式,可以很方便地对数据库操作进行事务管理。开发者可以使用@Transactional注解来标记需要进行事务管理的方法,MyBatis-Spring-Boot-Starter会自动为其开启事务并处理事务的提交和回滚。 此外,MyBatis-Spring-Boot-Starter还提供了一些额外的功能,如分页插件、缓存管理等。分页插件可以简化分页查询操作,缓存管理可以提高查询效率。这些功能的开启和配置也是非常简单的,只需在配置文件中进行相应的配置即可。 总而言之,MyBatis-Spring-Boot-Starter是一个极大简化了整合MyBatisSpring Boot的工具,它提供了自动配置、事务管理和其他辅助功能,使开发者可以更加轻松地使用MyBatis作为数据持久化框架,并结合Spring Boot快速构建稳定高效的应用程序。 ### 回答3: mybatis-spring-boot-starter是一个用于集成MyBatisSpring Boot的工具包。它可以极大地简化在Spring Boot项目中使用MyBatis的配置和使用过程。 使用mybatis-spring-boot-starter,我们不再需要手动配置MyBatis的配置文件和数据源等信息。只需要在项目的application.properties(或application.yml)文件中简单配置几个参数,如数据库连接信息、MyBatis的Mapper接口所在的包路径等,就可以自动完成MyBatis初始化工作。 另外,mybatis-spring-boot-starter还集成了一些常用的功能,方便我们在Spring Boot项目中使用MyBatis。例如,它可以自动扫描并注册Mapper接口,并将其注入到Spring容器中。我们可以直接使用@Autowired注解将Mapper接口注入到我们的服务类中,无需手动实例化。 此外,mybatis-spring-boot-starter还提供了一些常见的插件和功能扩展。例如,它支持分页插件、动态SQL插件等,可以方便地对数据库进行操作。同时,它还支持事务管理,保证了数据库操作的一致性和完整性。 总之,mybatis-spring-boot-starter为我们提供了一种更加便捷和高效的方式来集成MyBatisSpring Boot。它减少了我们的配置工作,提高了开发效率,并且提供了一些常用的功能扩展。使用mybatis-spring-boot-starter,我们可以更加专注于业务逻辑的开发,而无需过多关注底层的配置和细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值