在学习了《Spring 5 核心原理与 20个类手写实战》的ORM章节中,我想自己写一个简单的ORM框架。前几章部分是按照Tom书中的代码搬到了编辑器中,对Spring的核心原理有了大致的了解。在我看完ORM部分时,我觉得代码有种太过枚举化,所以我想自己写一个半自动化的ORM,而不是书中的全自动化ORM,于是就有了这篇笔记。
在这之前,我看过看过部分的MyBatis的源代码,但是没有太多的了解,我只是对其数据源(DataSource)部分有大致的阅读,本框架中简单的实现数据连接池部分。
在编写的过程中,我体会到了TDD的魅力,指导着我完成这些功能。由于我的ORM参考了MyBatis的Mapper风格,就叫LittleBatis算了。
第零节 开发环境IDEA 2018 + Maven 3.6.1 + JDK 1.8.231 + Git。
第一节 目标描述LittleBatis的目标比较简单,对一个基础数据表进行CRUD,返回的结果支持Map,List,Integer和一个普通对象就可以了,入参的话支持一个对象,或者是直接参数名称。主要是通过以下XML的验证。
第二节 步骤构思insert into USER(ID, NAME , PASSWORD) values(#{user.id},#{user.name}, #{user.password}) update USER set NAME = #{user.name} , PASSWORD = #{user.password} where ID = #{user.id} delete from USER where ID = #{id}
对于第一节的用例,我按以下步骤拆分:
第一步:我需要一个对数据连接池对Connection进行管理。
第二步:我要用一个配置读取器读取到JDBC和Mapper存储信息。
第三步:将扫描Mapper中的信息,将信息存储在Map中,生成对应的方法处理器。
第四步:用JDK动态代理实现接口的代理。
第五步:实现SQL入参处理器,执行SQL后的类型封装器。
第六步:实现SQL的执行器。
第七步:调试。
第三节 框架设计图3.1 架构图
LittleBatis的实现主要是图3.1中九个类组成。
ConfigurationReader是读取database.properties配置的类。
MapperMapping是代理Dao层接口的类,其中包含了各个方法的MethodHandler的Map。
MapperReader是扫描Mapper.xml文件地址,并根据Mapper.xml的配置生成对应的MapperMapping和MethodMapping。
ParameterHandler是处理Dao接口入参的类。
MethodMapping是记录Mapper.xml的方法的配置信息。
MethodHandler是方法处理器。
ResultHandler是返回结果处理器,主要是类型转换。
SQLHandler是SQL和SQL参数的处理,用于生成SQLRunner需要的SQLCommand。
SQLRunner主要负责sql的执行,并返回结果。
第四节 编码实现https://gitee.com/cisnotcpp/learining-orm
第五节 测试验证运行代码中的EnvironmentTest中的测试。



