• Spring整合mybatis


    spring 整合mybatis,无非主要两点:
    1、spring、mybatis中connection整合
    2、mapper接口的扫描(得自定义扫描类去扫描接口、因spring扫描类会过滤接口)、生成代理类

    一、解决connection整合问题
    1、spring整合mybatis基于配置类,需要指定datasource、SqlSessionFatoryBean(可以理解为SqlSessionFactoryBuilder、只不过功能比起更强大)

    @Configuration
    @ComponentScan(basePackages = "com")
    @MapperScan(basePackages = "com.dao")
    public class MybatisConfig{
    
        @Autowired
        private MybatisProperties mybatisProperties;
        @Bean
        public DataSource dataSource(){
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setDriverClassName(mybatisProperties.getDriver());
            dataSource.setUrl(mybatisProperties.getUrl());
            dataSource.setUsername(mybatisProperties.getUsername());
            dataSource.setPassword(mybatisProperties.getPassword());
            return dataSource;
        }
    
        @Bean
        public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) throws IOException {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSource);
            PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            Resource[] resources = resolver.getResources(mybatisProperties.getMapperLocations());
            sqlSessionFactoryBean.setMapperLocations(resources);
            sqlSessionFactoryBean.setTypeAliasesPackage(mybatisProperties.getTypeAliasesPackage());
            return sqlSessionFactoryBean;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    datasource作用主要就是获取连接
    SqlSessionFactoryBean核心功能点:
    1、解析的配置文件封装到Configuration(mybatis核心)
    2、指定事物工厂这一步指定spring的事物工厂(主要整合connection)
    在这里插入图片描述
    因其实现InitializiBean接口构建bean的时候会执行其afterPropertiesSet()进行构建SqlSessionFactory
    在这里插入图片描述
    而在buildSqlSessionFactory()方法中会指定事物管理器工厂其内部会创建SpringManagedTransactionFactory
    在这里插入图片描述
    在这里插入图片描述

    下面就看看SpringManagedTransactionFactory事物管理器获取connection时候从哪里获取的

    在这里插入图片描述
    在这里插入图片描述
    可以看到connection是从事物管理器中获取的
    在这里插入图片描述

    继续走下去看看从getResource获取什么
    
    • 1

    在这里插入图片描述
    而这个resource是个ThreadLocal这其中就是存放connection当业务从加@Transcation时会生成conncetion放到这个threadlocal中,所以拿到是同一个connection
    在这里插入图片描述

    下面验证下这个resource中的connection什么时候放进去的,看下大概

    (1)spring开启事物会往connectionholder绑定当前生成的connection,并把connectionholder放到resouce中即ThradLocal中
    DataSourceTransactionManager#doBegin方法中会把生成的connectionholder放到resouce中即ThradLocal中
    在这里插入图片描述
    下图可以看到已经绑定到resouce中了即ThreadLocal中、myabtis获取连接就是从这个resource中获取的,记住此时ConnctionHolder的id为16694上图可以看到
    在这里插入图片描述

    下面看下执行到mybatis获取连接时可以看到从resouce中获取,而且ConnctionHolder的id为16694上图可以看到说明spring mybatis中conncetion已经整合

    在这里插入图片描述

    二、spring是怎样把mapper接口生成代理放到容器中的
    spring自带的扫描器只能扫描不是抽象类的、非接口的类才能扫描成bean定义
    PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors
    postProcessor.postProcessBeanDefinitionRegistry中后置处理器的调用过程回去扫描mapper接口

    在这里插入图片描述
    下面扫描mapper接口封装成bean定义做了个偷天换日设置class为MapperFactoryBean用了创建代理具体创建过程可参考

    https://www.cnblogs.com/kjcc/p/14439472.html

    在这里插入图片描述
    下面看看MapperFactoryBean对象、getObject创建代理(实现了FactoryBean接口)、具体创建细节同mybatis
    在这里插入图片描述

    最后

    深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

    因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

    小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。

  • 相关阅读:
    SystemVerilog验证导论
    结合NBA主题,Niantic再寻LBS AR游戏破局之道
    计算机毕业设计——农产品资源展示平台
    堆的使用(堆排序和Top-K问题)
    Shell脚本之awk的用法
    多测师肖sir_高级金牌讲师_python之模块008
    Web前端开发与低代码开发——现状分析与未来发展
    使用 spring-security-oauth2 体验 OAuth 2.0 的四种授权模式
    小说阅读软件阅读界面设计
    【机器学习】期望最大算法(EM算法)解析:Expectation Maximization Algorithm
  • 原文地址:https://blog.csdn.net/web13524385009/article/details/126812173