layout | title | category | tags | keywords | description |
---|---|---|---|---|---|
post |
mybatis操作主体流程 |
技术 |
Mybatis |
{:toc}
- 定位配置文件的位置
- 构建sessionFactory
- 获取数据库操作会话
- 建立数据库连接并执行数据库操作
使用org.apache.ibatis.io.Resources.getResourceAsReader(String)
定位mybatis配置文件的位置,获得文件的输入流。
sequenceDiagram
Reader->>Resources:getResourceAsReader()
Resources->>InputStreamReader:getResourceAsReader()
InputStreamReader->>InputStream:''
InputStream->>Resources:getResourceAsStream()
Resources->>ClassLoaderWrapper:getResourceAsStream()
ClassLoaderWrapper->>ClassLoader:getResourceAsStream()
ClassLoader->>InputStream:''
InputStream->>InputStreamReader:getResourceAsReader
InputStreamReader->>Reader:new InputStreamReader()
构建SqlSessionFactory的时序图,使用SqlSessionFactoryBuilder
创建SqlSessionFactory
对象
sequenceDiagram
SqlSessionFactoryBuilder->>XMLConfigBuilder: build(reader)
XMLConfigBuilder->>XPathParser: XMLConfigBuilder(XPathParser)
XPathParser->>DocumentBuilder:createDocument()
DocumentBuilder->>DOMParser:parse()
DOMParser->>Document:getDocument()
Document->>XMLConfigBuilder:XMLConfigBuilder()
XMLConfigBuilder->>Configuration:parse()
Configuration->>Configuration:parseConfiguration()
Configuration->>Configuration:parseConfiguration()
SqlSessionFactoryBuilder->>SqlSessionFactory:build(Configuration)
根据时序图可以看得出,创建sessionFactory需要
- 将读入的配置文件流解析为Document对象
- 将Document对象解析为Configuration对象
- 使用Configuration对象,通过build()方法完成对SqlSessionFactory对象的创建。
sequenceDiagram
SqlSessionFactory->>DefaultSqlSessionFactory:openSession()
DefaultSqlSessionFactory->>DefaultSqlSessionFactory:openSessionFromDataSource()
DefaultSqlSessionFactory->>SqlSession:new DefaultSqlSession()
sequenceDiagram
SqlSession->>DefaultSqlSession:getMapper()
DefaultSqlSession->>Configuration:getMapper()
Configuration->>MapperRegistry:getMapper()
MapperRegistry->>Proxy:newInstance()
Proxy->>UserMapper:Proxy.newProxyInstance()
sequenceDiagram
UserMapper->>MapperProxy:getUserById()
MapperProxy->>MapperMethod:execute()
MapperMethod->>DefaultSqlSession:selectOne()
DefaultSqlSession->>DefaultSqlSession:selectList()
DefaultSqlSession->>CachingExecutor:query()
CachingExecutor->>SimpleExecutor:query()
SimpleExecutor->>BaseExecutor:queryFromDatabase()
BaseExecutor->>SimpleExecutor:doQuery()
SimpleExecutor->>SimpleExecutor:prepareStatement()
SimpleExecutor->>BaseExecutor:getConnection()
SimpleExecutor->>PreparedStatementHandler:prepare()
SimpleExecutor->>PreparedStatementHandler:query()
PreparedStatementHandler->>PreparedStatement:execute()
PreparedStatement->>DefaultResultSetHandler:handleResultSets()
DefaultResultSetHandler->>UserMapper:''
在执行具体的
org.apache.ibatis.executor.SimpleExecutor.prepareStatement(StatementHandler, Log)
处连接数据库,检查是否能连接成功
数据库连接时序图
sequenceDiagram
SimpleExecutor->>SimpleExecutor:getConnection()
SimpleExecutor->>BaseExecutor:getConnection()
BaseExecutor->>JdbcTransaction:getConnection()
JdbcTransaction->>JdbcTransaction:openConnection()
JdbcTransaction->>DataSource:getConnection()
DataSource->>DataSource:popConnection()
DataSource->>DataSource:new PooledConnection()
DataSource->>UnpooledDataSource:doGetConnection()
UnpooledDataSource->>DriverManager:getConnection()
DriverManager->>DriverInfo:connect()
DriverInfo->>BaseExecutor:newInstance()
BaseExecutor->>SimpleExecutor:''