MyBatis介绍
MyBatis是一个持久层的ORM框架,使用简单,学习成本较低。可以执行自己手写的SQL语句,比较灵活。但是MyBatis的自动化程度不高,移植性也不高,有时从一个数据库迁移到另外一个数据库的时候需要自己修改配置,所以称只为半自动ORM框架。
Mybaits整体体系图
例子
1 | ini复制代码public class App { |
build
方法
1 | typescript复制代码public SqlSessionFactory build(Reader reader, String environment, Properties properties) { |
可以看到除了XMLConfigBuilder
继承于BaseBuilder
,还有一些其他的解析配置文件的类。
XMLConfigBuilder.parse
方法
1 | csharp复制代码public Configuration parse() { |
parseConfiguration
方法
1 | ini复制代码private void parseConfiguration(XNode root) { |
mapperElement
方法
1 | ini复制代码private void mapperElement(XNode parent) throws Exception { |
addMapper
方法
1 | typescript复制代码/** |
MapperAnnotationBuilder.parser
方法
1 | scss复制代码public void parse() { |
loadXmlResource
方法
1 | typescript复制代码private void loadXmlResource() { |
XMLMapperBuilder.parse
方法
1 | scss复制代码/** |
configurationElement
方法
1 | csharp复制代码/** |
cacheElement
方法
1 | ini复制代码/** |
useNewCache
方法
1 | scss复制代码public Cache useNewCache(Class<? extends Cache> typeClass, |
CacheBuilder.build
方法
1 | scss复制代码public Cache build() { |
setStandardDecorators
方法
1 | scss复制代码private Cache setStandardDecorators(Cache cache) { |
这边使用装饰者模式对cache进行增强。
buildStatementFromContext
方法
1 | php复制代码/** |
XMLStatementBuilder.parseStatementNode
方法
1 | ini复制代码public void parseStatementNode() { |
以上即是mybatis
解析配置文件的全流程源码过程。那么接下来就是openSession
打开数据库会话操作。然后数据库操作过程的源码分析。
openSession
方法
有两种实现,进入DefaultSqlSessionFactory
类。
openSessionFromDataSource
方法
1 | php复制代码/** |
newExecutor
方法
1 | ini复制代码/** |
selectOne
方法
1 | typescript复制代码/** |
selectList
方法
1 | typescript复制代码/** |
wrapCollection
方法
1 | typescript复制代码/** |
CachingExecutor.query
方法
1 | java复制代码/** |
1 | scss复制代码@Override |
BaseExecutor.query
方法
1 | scss复制代码@Override |
queryFromDatabase
方法
1 | scss复制代码private <E> List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException { |
SimpleExecutor.doQuery
方法
1 | ini复制代码public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { |
newStatementHandler
方法
1 | ini复制代码public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { |
prepareStatement
方法
1 | ini复制代码private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException { |
PreparedStatementHandler.query
方法
1 | java复制代码public <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException { |
本文转载自: 掘金