概述
先腾的研发框架定位为一个业务研发,而不是技术框架;对于所采用的技术我们一直秉承着“相信大家的眼光”选择最成熟、使用最为广泛的技术;绝大多数来自于开源社区,更是集中在apache和spring两个阵营。一般我们不选择冷门的技术,更不会自己重复制造一个“轮子”。
然而先腾的研发框架定位于自动办公业务,所以项目中对数据库持久化操作使用的非常频繁,框架在v4.5之前对持久化平台并没有要求统一,可以使用Hibernate、mybatis和spring jdbc,并且框架也提供了对应的utils包来简化相关的持久化操作。项目参见江苏南大先腾J2EE持久化框架。在长期的研发过程中我们发现它们各有优缺点:
Hibernate
Hibernate作为使用最为广泛(中日韩除外)的orm框架,功能最为强大,最主要的几个优点有:
- 可以屏蔽不同数据库的方言,项目在不同数据库之前迁移非常方便。
- 通过注解的方式将数据库和表关联,减少非常多的sql语句拼接,几乎不需要编写增删改的sql语句。
- 对数据库对象进行了缓存,既提高了效率也避免的脏数据的访问。
- 可以对数据库进行版本管理,可以比较灵活的做数据库重构。
它的主要缺点有:
- Hibernate功能强大,必然导致它比较复杂,学习比较困难,虽然这个不能算它的缺点,但我认为在我们这样以业务为核心的项目型开发公司,开发人员需要花大量的时间学习业务,如果还要花大量的时间学习技术确实比较困难。所以我认为这是Hibernate最严重的缺点。
- 查询效率底,这个是被最多人诟病的缺点。其实我也不认为这是一个缺点,这个大多数是使用的方式不对。退一步讲即使引入Hibernate框架,开发人员依然可以使用原生的sql。
- hql是一个重复的轮子,这个一点不假,但是如果想兼容不同的数据库就没有免费的午餐。
在我们公司的基于jdbc的orm框架研发前,我强烈推荐使用Hibernate,所以对Hibernate可能情有独钟,这儿可能有点偏颇。让我放弃Hibernate的唯一的原因,就是太难学了,我用了至少5年也不敢说精通。如果要求团队都去使用Hibernate我觉得太难为大家。
Mybatis
Mybatis可能是国内最为流行的持久化平台了,并且还有丰富的插件。先腾框架也做一个Mybatis的utils包,并且开发一个Mybatis的插件,用于和参数驱动sql对接。Mybatis优点:
- 灵活、上手容易,会写sql就会用。
- sql语句和代码分离,可以做非常细致的sql优化。
主要缺点有:
- 开发效率低(不是程序执行效率),由于不像jpa(比如:Hibernate)那样自动化crud操作。
- 编写XML配置文件,虽然有很多工具可以生成这个文件,但是如果对表进行重构还是需要到处修改,非常繁琐。如果考虑不同的数据库兼容,就要编写更多配置文件,配置文件也就更加复杂。
先腾持久化框架的研发策略
针对上面Hibernate和Mybatis的优缺点分析,觉得一个学习有点复杂,一个开发效率较低,所以我们想自己编写一个针对以业务为中心的项目开发的orm框架。主要的思路如下:
- 采用jpa来完成业务对象的和数据库表的映射关系(orm),对jpa中的注解实现一个最常用的子集。力争做到不用编写增删改和单表查询相关的sql语句,并且做到数据库兼容。
- 和是spring jdbc整合,使用jdbc所有的优点。
- 使用spring-tx进行事务管理。
- 引入先腾的参数驱动sql语句的支持,来替代Mybatis中的sql语句拼接操作。
- 针对常用的业务场景对jpa进行扩展。
支持jpa的一个常用子集
仅支持OneToOne、OneToMany两种关联关系,ManyToOne等同于OneToOne处理,不支持ManyToMany关联关系。
对jpa的扩展
- Id注解的用法,一个对象用中可以有多个属性使用id注解,这样表示这个对象对应的表是符合主键,同是依然支持EmbeddedId注解,只是这样更方便,少一个主键类开发效率更高。
- 添加了一个ValueGenerator注解,这个注解不仅可以用在主键上,可以用在任何字段上,并且内置了多种生成规则和生成策略。
- 丰富了属性类型的支持,添加对boolean、Emun和对象属性的支持;支持对象属性可以在不修改表结构的情况下重构业务对象的属性。目前不支持collection类型的属性,因为觉得没有必要。
参数驱动SQL语句与sql语句外置
用驱动参数sql代替Mybatis的xml文件根据参数条件拼接sql语句的特性,并且比mybatis的xml文件更简洁;框架也可以将sql语句外置到XML文件中,便于在项目执行过程中对sql语句进行优化。
先腾持久化平台其他关联资料
参数驱动sql
https://blog.youkuaiyun.com/code_fan/article/details/81388777
https://blog.youkuaiyun.com/code_fan/article/details/81451156
https://blog.youkuaiyun.com/code_fan/article/details/81452933
https://blog.youkuaiyun.com/code_fan/article/details/81456138
动态数据源
https://blog.youkuaiyun.com/code_fan/article/details/81363806
先腾J2EE持久化框架
https://blog.youkuaiyun.com/code_fan/article/details/81507175
https://blog.youkuaiyun.com/code_fan/article/details/81542615
https://blog.youkuaiyun.com/code_fan/article/details/81387061
源代码
https://github.com/ndxt/centit-commons
https://github.com/ndxt/centit-persistence