数据层框架的发展史
JDBC编码的几大问题和MyBatis等框架的发展支持原因?
在最初编写JDBC连接数据库的时候,各种代码操作较为复杂,而且有很多缺陷。缺陷总结如下:
- 方法的封装问题
- 数据源的支持
- 映射结果集的接收和处理
- SQL语句硬编码
- 程序参数只能按照顺序传入(占位符)
- 没有实现实体类到数据库记录的映射
- 没有提供缓存等功能
工具类封装的出现解决了一部分问题
相应的工具类如:springjdbc、jdbcutils、Apache DbUtils等。这样的工具类主要解决了一下几个问题:
工具类的响应实现解决了部分JDBC的缺陷,但是并不完美。每一次的改进和工具类的出现的就是我们框架的前身出现,框架也是工具。在越来越完善的解决方案的出现之后,ORM框架基本就成型了。同时解决了以上JDBC列出来的各种问题。
ORM框架,全称Object Relational Mapping,对象关系的映
面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
ORM框架的基本准则
- A. 简单:ORM以最基本的形式建模数据。比如ORM会将MySQL的一张表映射成一个Java类(模型),表的字段就是这个类的成员变量
- B. 精确:ORM使所有的MySQL数据表都按照统一的标准精确地映射成java类,使系统在代码层面保持准确统一
- C.易懂:ORM使数据库结构文档化。比如MySQL数据库就被ORM转换为了java程序员可以读懂的java类,java程序员可以只把注意力放在他擅长的java层面(当然能够熟练掌握MySQL更好)
- D.易用:ORM包含对持久类对象进行CRUD操作的API,例如create(), update(), save(), load(), find(), find_all(), where()等,也就是讲sql查询全部封装成了编程语言中的函数,通过函数的链式组合生成最终的SQL语句。通过这种封装避免了不规范、冗余、风格不统一的SQL语句,可以避免很多人为Bug,方便编码风格的统一和后期维护。
最早的ORM框架hibernate
Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象!
Hibernate 优势
- 类别到数据库表格中,并且不用编写任何代码。
- 为在数据库中直接储存和检索 Java 对象提供简单的 APIs。
- 如果在数据库中或任何其它表格中出现变化,那么仅需要改变 XML 文件属性。
- 抽象不熟悉的 SQL 类型,并为我们提供工作中所熟悉的 Java 对象。
- Hibernate 不需要应用程序服务器来操作。
- 操控你数据库中对象复杂的关联。
- 最小化与访问数据库的智能提取策略。
- 提供简单的数据询问。
Hibernate 响应的一些问题
- 无法自定义SQL,优化相对困难
- 不制动动态的SQL
- 复杂的表关系会导致Hibernate开发难度
- 加载问题
什么是 MyBatis?
是一款面向对象和返回集关系的数据层封装,有效的减少jdbc的代码。
缺点:
- 不方便移植,数据库更换需要字段比较麻烦,需要改写sql
- 对开发人员所写的SQL依赖很强。
优点:
- 使用连接池对连接进行管理
- SQL和代码分离,集中管理
- 参数映射和动态SQL
- 结果集映射
- 缓存管理
- 重复SQL的提取
- 插件机制
- 手写sql,能够有效的精准把控查询的速度,便于优化查询速度
- mybatis不会对应用程序或者数据库的现有设计强加任何影响
- 通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。
- 保证名称相同,配置好映射关系即可自动映射或者,不配置映射关系,通过配置列名=字段名也可完成自动映射。
什么是 Spring Data JPA(本文JPA只写Spring Data JPA)
Spring Data JPA是更大的Spring Data系列的一部分,可以轻松实现基于JPA的存储库。此模块处理对基于JPA的数据访问层的增强支持。它使构建使用数据访问技术的Spring驱动应用程序变得更加容易。
选择什么样的ORM框架参考:
- 业务相对简单项目可以使用Hibernate
- 需要灵活SQL的选择可以使用MyBatis(SQL过长和SQL很复杂的情况)
- 对性能要求比较高可以使用JDBC(如:我们写的项目很小,或者说就是需要几个接口,这个时候我们选择框架就会过于臃肿和复杂)
- Sping JDBC可以和 ORM框架混合使用(这种情况很少,但是如果某些业务可能单独需要数据源对接某一个接口,这个时候可能要适配器兼容JDBC接入)