支持代码生成和多表查询的ORM框架MyORM(一)
一、概述
这里发布一个自己的ORM框架。有兴趣的朋友可以看一下,能留下一些宝贵的意见当然更好了。这个框架有两个版本,第一个版本已经用在了线上的系统中。最近几天重新调整了一下框架的体系结构,也只有这样才能跟大家描述清楚(尽量描述清楚)。毕竟是新版本,希望大家能够为我发现潜在的bug(当然也可以是一些明显的错误)。
由于我的项目是基于mysql的,所以与其他数据库相关的代码都去掉了,如果以后有这个需求的话再加上去。
不去与hibernate和ibatis比较了,存在总是有他的道理,他们已经非常成熟并且深入人心。
写这个框架是基于两个方面来考虑的:开发效率和运行效率。简而言之就是:
开发效率:
1. bean层和dao层代码生成自动化,输入一份数据库设计文档(限定格式),自动生成bean层和dao层的代码。
2. Bean的增删改全自动化,调用对应dao的增删改函数,就会自动生成并执行相应的sql语句。如 DAOManage.sysLogDao.save(log),会生成相应的insert语句并执行。这里的DAOManager是一个dao层自动生成的静态类。
3. Sql查询结果的转换自动化,随便执行一条sql查询语句,执行结果为ResultList,执行ResultList.get(i).get(SysLog.class),不说大家也知道是什么意思。特别适合于多表查询。
运行效率:
1. 对于update和delete,不需要先从数据库查出该对象,这里不用担心update时未更新的字段会被覆盖。
2. 对于insert和update,只有发生了更改的字段才会入库,也就是说,当在一个属性上执行了set函数后该属性所对应的字段才会出现在sql语句中。
3. 对于select,从查询结果到javabean的转换避免了hibernate和ibatis的反射或动态代理。反射或动态代理比直接的java操作慢上200倍,如果用CIGLIB做优化大概慢上10-30倍。
4. 纯JDBC实现。
图片比较大,需要点击图片单独打开才能看得清楚
下载、安装和配置请见下一页
二、体系结构
整个框架的体系结构如图所示:
开发阶段的SQL生成器、代码配置器和代码生成器是一个已经做好的工具,以web形式发布。稍后做详细介绍。
整个体系结构的流程为:
1. SQL生成器分析数据库设计文档(这里用的是EXCEL),提取并执行SQL建表语句
2. 代码配置器读取数据库表信息,配置和生成配置信息,保存为映射文件
3. 代码生成器读取映射文件生成bean和dao代码
4. 系统启动,加载映射文件
5. 执行dao层的增删改,生成相应的sql语句,执行SQL执行器的sql执行(增/删/改)函数,返回受影响的行数或自增一id。
6. 执行SQL执行器的sql查询函数,生成resultset,查询结果处理器将resultset转换为对应的javabean。
三、SQL生成器、代码配置器和代码生成器
1.工具一览
MyORM配置下的Doc->SQL链接是SQL生成器
MyORM配置下的SQL->Bean链接是代码配置配置器和生成器。
2. SQL生成器,从Excel提取并执行sql建表语句
直接把excel中的数据表拷到上面的文本框中就行了。Excel中的表格式如下:
注:N:非空,PK:主键,AC:子增一,K:索引,这里创建的是组合索引。
3.代码配置器
该页面的上半部分,是数据库的基本配置信息。其中分表规则用于指定分表的后缀名,规定为总表名+“_xxx”格式,这里规定得有些死板,以后再改。各分表和总表对应着同一个bean类。
下半部分是数据库中表,分表会被过滤掉。在这里可以配置表所对应的类名、字段所对应的属性名和属性的注释。对于属性名,已经按照java的规则(个别例外)由字段名默认生成。
对于上述图中的默认字段列,在查找、更新、或删除时会用到,可以根据字段进行找、更新、或删除(对应着 sql的where 字段),如果调用时无字段参数,就默认取为该字段。
上述的图中,除了字段注释可以为空外,其他都不能为空。
配置完毕后,点击生成按钮即可生成相应的bean和dao代码。
4.代码生成器
代码生成没有界面可以展现,只有执行完毕后的结果,如图:
5.java类型和sql类型的对应关系
事实上,我这里根本就不关心底层的sql类型,只关心jdbc中的数据类型,对应关系如下:
Jdbc类型 |
Java类型 |
Byte |
byte |
Integer |
int |
Short |
short |
Long |
long |
Float |
float |
Double |
double |
Boolean |
boolean |
String |
String |
Java.sql.Date |
Java.util.Date |
Java.sql.Time |
Java.util.Date |
Java.sql.Timestamp |
Java.util.Date |
Java.math.BigDicimal |
double |
Java.math.BigInteger |
long |
对于其他的数据类型,可以添加。
6.补充
针对每个表生成的bean类包含两个,一个是bean类,另一个是抽象父类beanBase,生成的代码存在于抽象父类中,开发者自己扩展的代码存在于bean子类中,这样在生成代码时就不会覆盖开发者的代码了,因此若要重新生成bean子类,必须先手动删除该子类。对于dao也一样。