多年以来,关系型数据库一直是Java企业级应用中的统治者。对关系型数据库的操作从最开始的直接使用原生JDBC开始,到后来Spring基于JDBC开发了JDBC模板,再到一大批ORM框架的出现,大大简化了对数据库的操作,包括Hibernate,iBATIS,JDO以及JPA等,最后是Spring Data JPA几乎给我们提供了一个完美的数据库操作方案,开发应用非常方便。这里对这几种类型的框架做一个简单的总结,详细代码可以参考《Spring实战》(第四版)。
1. 原生JDBC
直接使用原生的JDBC操作数据库的API,你需要处理与数据库访问相关的所有事情,包括数据库资源的管理和异常的处理。
使用原生JDBC进行一次插入操作的代码的80%都是样板代码,包括获取和关闭数据库链接,SQL语句,异常处理等等,这些都是可以被自动生成的。
2. JDBC模板
Spring将JDBC中的样板代码抽象到了模板类中,提供了JDBC模板,用于承担数据库资源的管理和异常处理工作,简化了JDBC代码。
Spring提供了两种模板类以供选择:JdbcTemplate和NamedParameterJdbcTemplate。
3. ORM框架
我们发现JDBC Template中还是有很多样板代码,需要我们自己将对象属性映射到数据库实体的列上。
这时ORM(对象/关系映射,object-relational mapping)帮我们简化了这些问题,使得我们可以将精力集中于业务代码的开发。ORM框架包括Hibernate,MyBatis,JDO(Java Data Objects)和JPA(Java Persistence API),Spring对这些框架均提供了支持。
ORM框架除了可以将Java对象和数据库实体进行映射,而且提供了延迟加载、预先抓取、级联操作等高级特性,Spring对这些ORM的集成又提供了很多额外的特性,如声明式事务和透明的异常处理等。
4. Spring Data JPA
使用ORM框架虽然大大简化了Java对象和数据库实体映射相关的代码,但是我们还是需要对大量数据库操作编写自己的实现代码,这些代码都是模式化的,很容易编写。因此Spring Data在JPA的基础之上实现了Spring Data JPA框架,用以自动生成数据库操作代码,我们只需要编写Repository接口就可以了,不需要实现类。另外还有一个在MyBatis基础上开发的MyBatis Plus框架也实现了类似的功能,也可以尝试一下。
在平时的应用开发中,我大多使用SpringBoot进行开发,此时使用Spring Data JPA框架进行数据库操作特别方便。
之前一直在帮业务团队做一些软件工程实践相关的事情,感觉数据持久化框架的演变过程跟软件工程实践还是有一些共通之处,都是将一些重复的模式化的操作进行自动化,在底层框架或者由自动化脚本来实现,这样我们就可以将更多的精力集中于核心业务逻辑的开发,以此提升软件开发效率。