Mybatis源码阅读之数据库连接

前面我介绍了SqlSessionFactory和SqlSession的创建,感兴趣的童鞋可以看看我写的这两篇博客:

mybatis源码阅读之SqlSessionFactory创建

Mybatis源码阅读之SqlSession创建

最近接着在看Mybatis的源码,想知道Mybatis是如何对数据库进行操作的(最底层当然还是回归JDBC),这里做个学习笔记,也想跟大家分享下:

执行代码如图1:

这里写图片描述

图1.

通过sqlSession.selectList(“xxxx”)来一步步跟踪Mybatis是如何完成对数据库的操作的。之前的文章有说到,SqlSession是个接口,创建的时候使用的是DefaultSqlSession。图2是自己断点SqlSession获得的信息:

这里写图片描述

图2.

我在mybatis-config.xml中的配置如图3:我选择的TransactionManager类型是JDBC,数据源是PooledDataSource。这也就解释了图2中的executor的Transaction为什么是JdbcTransaction,JdbcTransaction的数据源为什么是PooledDataSource。
这里写图片描述

图3.

我之前的文章已经说明了JdbcTransactionFactory和PooledDataSource是如何创建的。
new SqlSessionFactoryBuilder().build(InputStream)
–> XMLConfigBuilder.parse()
–>XMLConfigBuilder.parseConfiguration(XNode root)
这里写图片描述

图4.

这里写图片描述

图5.

mybatis是如何获取到配置文件的用户名和密码,然后连接获取数据库连接的呢?我们来看一下XMLConfigBuilder.transactionManagerElement(XNode context)和XMLConfigBuilder.dataSourceElement(XNode context)

这里写图片描述

图6.

看看DataSourceFactory的Properties props = context.getChildrenAsProperties();做了哪些操作
这里写图片描述

图7.

XNode.getChildren()中有一句children.add(new XNode(xpathParser,node,variables)),这里的variables是一个Properties,这个variables值的初始化是通过解析mybatis-config.xml的properties标签得到的。如下图,先加载properties标签下的property,再加载properties文件中的属性,最后,判断原来是否存在一些属性,是的话就两个合并返回,否则直接返回。
这里写图片描述

图8.

再来看看DataSourceFactory的factory.setProperties(props);做了哪些操作
进行赋值前:
这里写图片描述

图9.

进行赋值后:
这里写图片描述

图10.

再回去看图2,session.selectList(“xxx”)实际上调用的是DefaultSqlSession.selectList(“xxx”);这里的executor的实现类是CachingExecutor。
这里写图片描述

图11.

调用的CachingExecutor.selectList()方法如图12,先查看缓存中是否有值,有的话从缓存中获取,没有的话查询数据库。这里的delegate属性调用的是SimpleExecutor,SimpleExecutor继承了抽象类BaseExecutor。
这里写图片描述

图12.

调用父类BaseExecutor.query()方法如图13,
这里写图片描述

图13.

调用父类BaseExecutor.queryFromDatabase()方法如图14,BaseExecutor是个抽象类,doQuery()调用的是实现类SimpleExecutor的方法。
这里写图片描述

图14.

调用子类SimpleExecutor.doQuery()方法如图15,
这里写图片描述

图15.

调用子类SimpleExecutor.prepareStatement()方法如图16,
这里写图片描述

图16.

调用父类BaseExecutor.getConnection()方法如图17,从图2中可以看到transaction的实现类是JdbcTransaction。
这里写图片描述

图17.

在创建SqlSession的时候调用了DefaultSqlSession类的openSessionFromDataSource()方法,而transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit)调用了JdbcTransactionFactory的方法来创建JdbcTransaction。见图18和图19。
这里写图片描述

图18.

这里写图片描述

图19.

调用的数据源是在mybatis-config.xml配置的PooledDataSource。
这里写图片描述

图20.

PooledDataSourceFactory的创建图6说明了。PooledDataSourceFactory继承了UnpooledDataSourceFactory,PooledDataSourceFactory的无参构造函数初始化了属性dataSource的值为PooledDataSource,而PooledDataSource的无参构造函数初始化了属性dataSource的值是UnPooledDataSource。见图19和图20。加载顺序是:PooledDataSourceFactory.dataSource–>PooledDataSource.dataSource–>unPooledDataSource.dataSource。
这里写图片描述

图21.

这里写图片描述

图22.

PooledDataSource的getConnection()方法,调用UnpooledDataSource的用户名和密码连接数据库。
这里写图片描述

图22.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis是一个轻量级的Java持久层开源框架,它封装了JDBC操作数据库的底层细节,提供了一个简单易用的数据库访问方式。 Mybatis源码分为核心模块和附加模块两部分,核心模块主要包括配置解析、SQL解析、SQL执行等功能,附加模块包括连接池、缓存、事务管理等功能。 在Mybatis源码中,配置解析是其中的关键部分。通过解析mybatis-config.xml配置文件,可以获取到数据库连接信息、映射器配置、插件配置等。在配置解析过程中,Mybatis会对配置文件进行校验,确保配置的正确性。 SQL解析是Mybatis的另一个重要功能。Mybatis通过解析Mapper接口中的注解或XML配置文件中的SQL语句,将SQL语句解析为ParameterMapping、BoundSql等对象,并将其封装成一个MappedStatement对象,供后续的SQL执行使用。 SQL执行是Mybatis的核心功能之一。在SQL执行阶段,Mybatis会根据MappedStatement中的信息,获取数据库连接,并执行对应的SQL语句。在执行过程中,Mybatis会通过TypeHandler对参数进行类型转换,并使用ResultSetHandler将查询结果封装成Java对象。 除了核心模块,Mybatis源码还包括了连接池、缓存、事务管理等附加模块的实现。连接池模块负责管理数据库连接的获取和释放,缓存模块负责缓存查询结果以提高性能,而事务管理模块则负责管理数据库的事务处理。 总之,Mybatis源码解析涉及多个关键模块的实现,包括配置解析、SQL解析、SQL执行、连接池、缓存、事务管理等。通过了解这些模块的实现原理,我们可以更好地理解和使用Mybatis框架。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值