Implementation of Mini Mybatis (Version 1)
Published: 2024-06-15 10:02:10

### 一、实现的主要功能如下：
1. 通过Dom4J解析核心配置文件和Mapper配置文件，并封装对应的实例。
2. 通过SqlSession门面对外暴露核心的，如CRUD接口，事务接口和生成代理等操作接口。
3. 按照单一职责原则，对功能进行更细粒度的划分，实现Executor执行器，Statement处理器，Parameter处理器，ResultSet处理器。去完成Sql的执行，Sql的准备，参数的绑定，结果集的封装等操作。
4. 实现type处理器。BoundSql生成时进行参数与类型处理器的绑定，参数化时根据类型进行参数的自动处理。
5. 实现log模块，对多种日志框架进行整合。
6. 其他，如transaction模块, 类型别名等。



### 二、实现的核心流程如下：
> tips: 点开图片后在其url上将“width=800”改为“width=2000”就比较清晰

#####初始化阶段：

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5re5ure702p40qnzjant.png)

#####SqlSession执行阶段：

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yemnikw0fzsx539q428d.png)


#####SqlSession的代理对象执行阶段：

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/srib6ti6a443kabh5onm.png)



### 三、实现的代码如下：
```
├─mini-mybatis
│  │  pom.xml      
│  ├─doc
│  │      implement_plan.txt
│  │      
│  ├─src
│  │  ├─main
│  │  │  ├─java
│  │  │  │  └─com
│  │  │  │      └─wxttw
│  │  │  │          └─frameworks
│  │  │  │              └─mybatis
│  │  │  │                  │  Main.java
│  │  │  │                  │  
│  │  │  │                  ├─configuration
│  │  │  │                  │  │  Configuration.java
│  │  │  │                  │  │  XmlConfigBuilder.java
│  │  │  │                  │  │  XmlMapperBuilder.java
│  │  │  │                  │  │  
│  │  │  │                  │  ├─binding
│  │  │  │                  │  │      MapperMethod.java
│  │  │  │                  │  │      MapperProxy.java
│  │  │  │                  │  │      MapperProxyFactory.java
│  │  │  │                  │  │      MapperRegistry.java
│  │  │  │                  │  │      
│  │  │  │                  │  ├─build
│  │  │  │                  │  │      BaseBuilder.java
│  │  │  │                  │  │      
│  │  │  │                  │  └─transaction
│  │  │  │                  │      │  Transaction.java
│  │  │  │                  │      │  TransactionFactory.java
│  │  │  │                  │      │  
│  │  │  │                  │      └─jdbc
│  │  │  │                  │              JdbcTransaction.java
│  │  │  │                  │              JdbcTransactionFactory.java
│  │  │  │                  │              
│  │  │  │                  ├─executor
│  │  │  │                  │  │  Executor.java
│  │  │  │                  │  │  SimpleExecutor.java
│  │  │  │                  │  │  
│  │  │  │                  │  ├─parameter
│  │  │  │                  │  │      DefaultParameterHandler.java
│  │  │  │                  │  │      ParameterHandler.java
│  │  │  │                  │  │      
│  │  │  │                  │  ├─resultset
│  │  │  │                  │  │      DefaultResultSetHandler.java
│  │  │  │                  │  │      ResultSetHandler.java
│  │  │  │                  │  │      
│  │  │  │                  │  └─statement
│  │  │  │                  │          BaseStatementHandler.java
│  │  │  │                  │          PreparedStatementHandler.java
│  │  │  │                  │          RoutingStatementHandler.java
│  │  │  │                  │          SimpleStatementHandler.java
│  │  │  │                  │          StatementHandler.java
│  │  │  │                  │          
│  │  │  │                  ├─io
│  │  │  │                  │      Resources.java
│  │  │  │                  │      
│  │  │  │                  ├─logging
│  │  │  │                  │  │  Log.java
│  │  │  │                  │  │  LogFactory.java
│  │  │  │                  │  │  
│  │  │  │                  │  ├─commons
│  │  │  │                  │  │      JakartaCommonsLoggingImpl.java
│  │  │  │                  │  │      
│  │  │  │                  │  ├─log4j
│  │  │  │                  │  │      Log4jImpl.java
│  │  │  │                  │  │      
│  │  │  │                  │  ├─nologging
│  │  │  │                  │  │      NoLoggingImpl.java
│  │  │  │                  │  │      
│  │  │  │                  │  ├─slf4j
│  │  │  │                  │  │      Slf4jImpl.java
│  │  │  │                  │  │      Slf4jLocationAwareLoggerImpl.java
│  │  │  │                  │  │      Slf4jLoggerImpl.java
│  │  │  │                  │  │      
│  │  │  │                  │  └─stdout
│  │  │  │                  │          StdOutImpl.java
│  │  │  │                  │          
│  │  │  │                  ├─mapping
│  │  │  │                  │      BoundSql.java
│  │  │  │                  │      MappedStatement.java
│  │  │  │                  │      ParameterMapping.java
│  │  │  │                  │      SqlSource.java
│  │  │  │                  │      
│  │  │  │                  ├─parsing
│  │  │  │                  │      GenericTokenParser.java
│  │  │  │                  │      ParameterMappingTokenHandler.java
│  │  │  │                  │      TokenHandler.java
│  │  │  │                  │      
│  │  │  │                  ├─session
│  │  │  │                  │  │  SqlSession.java
│  │  │  │                  │  │  SqlSessionFactory.java
│  │  │  │                  │  │  SqlSessionFactoryBuilder.java
│  │  │  │                  │  │  
│  │  │  │                  │  └─defaults
│  │  │  │                  │          DefaultSqlSession.java
│  │  │  │                  │          DefaultSqlSessionFactory.java
│  │  │  │                  │          
│  │  │  │                  ├─type
│  │  │  │                  │      BooleanTypeHandler.java
│  │  │  │                  │      IntegerTypeHandler.java
│  │  │  │                  │      JdbcType.java
│  │  │  │                  │      LongTypeHandler.java
│  │  │  │                  │      StringTypeHandler.java
│  │  │  │                  │      TypeAliasRegistry.java
│  │  │  │                  │      TypeHandler.java
│  │  │  │                  │      TypeHandlerRegistry.java
│  │  │  │                  │      
│  │  │  │                  └─util
│  │  │  │                          ClassUtil.java
│  │  │  │                          DocumentReader.java
│  │  │  │                          ExecutorType.java
│  │  │  │                          SqlCommandType.java
│  │  │  │                          StatementType.java
│  │  │  │                          
│  │  │  └─resources
```




### 四、版本2中计划实现的功能：
1. 实现其缓存机制，session/mapper cache
2. 实现其插件机制
3. 实现其与spring的整合（通过spring扩展点）
4. 注解式的配置
5. 完善版本一的内容，实现statement日志的输出（代理Connection）；结果集通过TypeHandler进行自动参数映射；支持更多的类型的TypeHandler
6. 使用Mybatis的更完善的反射模块