MyBatis【五】MapperScannerConfigurer的加载
引言在spring-mybatis.xml中还有一条配置:
123456<!-- 配置 MapperScannerConfigurer --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 配置 Dao 接口所在的包 --> <property name="basePackage" value="com.minivision.test.mybatis.mapper"/> </bean>
作用是递归地从基本包开始搜索接口,并将它们注册为MapperFactoryBean。注意,只有具有至少一个方法的接口才会被注册,具体类将被忽略。通过这一步,将MyBatis与Spring联系起来了。
1、MyBatis与Spring关联MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor接口, ...
MyBatis【四】SqlSessionFactoryBean的加载
引言spring-mybatis.xml中配置为:
123456789<!-- 配置 SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 配置 mybatis-config.xml 路径 --> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!-- 给 SqlSessionFactory 配置数据源,这里引用上一篇文章的数据源配置 --> <property name="dataSource" ref="dataSource"/> <!-- 配置 SQL 映射文件 --> ...
MyBatis【三】spring-mybatis.xml配置文件加载入口
引言这篇文章的基础是:mybatis-XML配置官方中文文档,分析源码的前提也是先会使用,之后才是这个东西的实现原理,最终目标还是怎么更好的使用,或者开发其他工具的时候能够借鉴。MyBatis配置文档的顶层结构如下:
1、mybatis-config.xml我用于测试只简单配了一些:mybatis-config.xml。
123456789101112<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <settings> <setting name="cacheEnabled" value="t ...
MyBatis【二】MyBatis的简单使用与分析导读
引言当我们想操作数据库的时候,有多种选择,比如上一篇文章用的JDBC,或者Spring的JdbcTemplate,或者Hibernate,在就是MyBatis。Mybatis是一种半自动ORM框架,需要手动维护SQL,一般是xml文件,优点就是好控制,缺点就是维护的数据多。项目中现在使用springboot+tk-Mybatis,使用起来很方便,对用户屏蔽内部实现,但是对于学习来说,还是使用最基础的配置,能够更好的理解。
1、Spring+Mybatis例子准备这里简单的写个Spring+Mybatis的小例子跑起来,之后分析:
1.1、test库:1234CREATE TABLE `people` ( `id` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
1.2、entity:1234567import lombok.Data;@Datapublic class PeopleEntity { private int id ...
MyBatis【一】JDBC简单例子与源码分析
引言最近想分析一下mybatis源码,但是在这之前呢,先分析一下JDBC操作mysql。
先写个小例子1.在mysql中建表1234CREATE TABLE `people` ( `id` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.获取连接工具方法1234567891011121314 public static Connection getConnection() { Connection conn = null; try { //初始化驱动类com.mysql.cj.jdbc.Driver Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localho ...
Spring-TX【五】Spring事务管理小结
这几天把Spring的事务处理源码分析了一下,基本上了解了其实现方式。在这里做个简单的小结。先概括一下流程:(只分析声明式事务)首先通过解析spring的xml配置文件,让spring支持事务注解,并将事务增强器放入IOC容器中。在bean实例化之前,调用后处理程序,获取到当前类的所有增强器,通过代理获取目标类。
强化的过程都体现在TransactionInterceptor的invoke方法中:开启事务、回滚事务、提交事务,这些逻辑流程的实现都在事务管理器中实现。
因为我是使用的DatasourceTransactionManager事务管理器,所以上面的三个操作,最终都委托它实现。当然逻辑上的功能都在它的父类AbstractPlatformTransactionManager中实现,最终是实现于PlatformTranManager接口。
具体的提交、回滚等操作,都交由数据源处理。
在分析spring管理事务的时候,也好好看了看spring的7种事务传播行为,虽然很多,很复杂,但是从源码中看起来还挺清晰的。
之后有时间会分析一下JDBC的具体实现逻辑。
Spring-TX【四】commit和rollback
提交和回滚的流程依然定义在AbstractPlateformTransactionManager中,具体的提交操作和回滚操作由其子类调用数据源后取得连接实现。
commit12345678910111213141516171819202122232425262728293031323334353637383940/** * 提交的这个实现处理参与现有事务和编程式回滚请求。 * 委托给 {@code isRollbackOnly}, {@code doCommit} and {@code rollback}. * * @see TransactionStatus#isRollbackOnly() * @see #doCommit * @see #rollback */ @Override public final void commit(TransactionStatus status) throws TransactionException { //事务已经完成—不要在每个事 ...
Spring-TX【三】getTransaction之Spring事务传播行为与数据源连接绑定
DataSourceTransactionManager类中的方法是继承自父类AbstractPlatformTransactionManager。现在分析方法:getTransaction(@Nullable TransactionDefinition definition)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 ...
Spring-TX【二】Bean事务增强逻辑处理
事务增强流程:bean实例化之前会调用InfrastructureAdvisorAutoProxyCreator的父类AbstractAutoProxyCreator中实现的方法:postProcessAfterInitialization(@Nullable Object bean, String beanName)
123456789101112131415/** * Create a proxy with the configured interceptors if the bean is * identified as one to proxy by the subclass. * @see #getAdvicesAndAdvisorsForBean */ @Override public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) { if (bean != null) { Object cacheKey = getCacheKey ...
Spring-TX【一】事务管理配置与流程分析
再分析完AOP之后,趁热打铁,再分析一下Spring的事务处理。因为一直都是使用SpringBoot,所以用@EnableTransactionManagement和@Transactional就可以实现简单的例子,但是感觉不太直观,所以本文采用xml的配置来分析事务。
首先贴个简单的配置文件,包含支持十五注解的标签,还有事务管理器和一个半成品dataSource。
123456789101112<!-- 支持事务注解--><tx:annotation-driven transaction-manager="txManager"/><!-- 配置事务管理器 --><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource&q ...