6.4应用程序与数据库的交互
前言
通常我们可以通过打开数据库管理系统(比如MYSQL),直接输入SQL即可访问数据,但我们需要开发应用软件呀,那要怎么通过程序去访问数据呢?我们不能让用户自己上DBMS去查吧。
概述
常见的应用程序与数据库的数据交互方式有:库函数、嵌入式SQL、通用数据接口标准和对象关系映射(ORM)等,其概述对比如下。
为了方便对比,我修改了教程的顺序,按照抽象层次由低到高排序。
总结
1、库函数级别访问接口
通常为某个特定数据库设计,比如 OCI 仅用于 Oracle 数据库,他的优点有高性能、精细控制数据库,缺点是开发复杂、可移植性差、维护成本高,适用于高性能应用、复杂数据库的处理。
2、嵌入式SQL:
将SQL直接嵌入到高级语言中(C语言) ,需要预编译。特点是便于处理复杂的业务、直接SQL控制数据库,缺点是需要预编译器、移植不同数据库需要大量修改,且SQL与业务混合维护复杂。
3、通用数据接口标准
用统一的方式可以访问不同的数据库,ODBC(C语言)、JDBC(java)可以跨平台、跨DBMS访问数据库,更方便的有DAO、RDO、ADO。开发者编写SQL并通过API发送到数据库系统,具有较高的灵活性和控制权。
4、ORM访问接口
实现对象与关系型数据库之间的数据映射和转换。特点有持久化、数据映射、简化了数据库操作、支持跨数据库,主要的java ORM框架有Hibernate、Mybatis、JPA
6.4.1-库函数级别访问接口
1、 定义
定义:直接提供与数据库进行通信的函数调用。
谁提供的:数据库管理系统(DBMS)或编程语言为开发者提供的最底层的接口。
2. 特点
- 底层控制:提供直接的函数调用接口,开发者可以精细控制数据库操作,包括连接管理、SQL执行、事务、错误处理等。
- 数据库专用:通常为某个特定数据库设计,比如 OCI 仅用于 Oracle 数据库。
3. 优缺点
优点:
- 高性能:因为直接调用数据库的低级接口,减少了中间层的开销。
- 精细控制:开发者可以完全控制数据库操作的每个细节,如连接生命周期、事务管理、锁机制等。
- 灵活性:提供了丰富的函数,允许对数据库进行复杂且自定义的操作,适合处理特殊需求和优化性能的场景。
- 资源控制:可以手动管理内存、连接等资源,适合高要求的资源管理场景。
缺点:
- 开发复杂性高:由于提供底层控制,开发者需要编写大量复杂的代码来管理连接、处理错误、执行SQL等操作,增加了开发难度。
- 可移植性差:库函数级别接口通常与特定数据库绑定,跨数据库的应用难以实现。例如,OCI 只能用于 Oracle 数据库。
- 维护成本高:对数据库的细节和版本变化敏感,维护难度大,尤其是在数据库系统升级或扩展时。
- 学习曲线陡峭:开发人员需要对数据库内部机制有深入的理解,学习成本高。
4. 使用场景
库函数级别访问接口适用于需要高度灵活性、精确控制数据库操作,或对性能要求极高的场景。具体场景包括:
- 高性能应用:需要优化数据库访问性能的系统,例如交易系统、实时处理系统等,尤其是需要处理大量并发事务或高频数据库读写的应用。
- 数据库驱动开发:开发数据库驱动程序、数据库中间件或数据库工具时,需要直接与数据库交互。
- 复杂数据库操作:需要进行批量数据处理、大规模数据迁移、流式处理、游标操作等复杂操作时,可以通过低层次接口获得更高的灵活性和控制力。
- 数据库专用系统:当应用程序仅面向某种特定数据库(如Oracle)时,可以通过OCI实现高度优化的数据库操作。
6.4.2-嵌入式SQL
1、定义:
嵌入式SQL(Embedded SQL)是一种将SQL语句直接嵌入到高级编程语言(如C、Java等)中的编程方法。
2、工作原理:(了解预编译)
在嵌入式SQL中,SQL语句是直接写在宿主语言(如C或Java)代码中的。然而,由于宿主语言的编译器无法识别SQL语句,因此需要通过预编译器来将这些SQL语句转换为宿主语言能够理解的函数调用。
预编译过程:
- 预编译器处理:嵌入式SQL代码 -> 宿主语言中的函数调用。
- 宿主语言编译:编译器将函数进行编译,生成可执行的程序。
- 连接数据库库函数:编译后的代码会链接到数据库厂商提供的库函数(如OCI、DB2的CLI等),以便最终执行SQL语句。
3、嵌入式SQL的核心特性
- 宿主变量:用来接收SQL查询的结果或传递输入参数。
- 数据库访问与事务控制:通过宿主语言控制数据库的连接、事务管理(如提交、回滚)等操作。
- 游标操作:对于需要逐行处理查询结果的场景(例如处理多行结果集),提供了游标的概念,可以在查询结果集中逐行遍历。
- 数据类型转换:由于宿主语言和数据库中的数据类型不一定相同,嵌入式SQL提供了数据类型的转换机制,以便在宿主语言与数据库之间正确传递数据。
4、优缺点
优点:
- 集成SQL与宿主语言: 允许将SQL语句直接嵌入宿主语言中,便于处理复杂的业务逻辑与数据库操作。
- 减少上下文切换:开发人员可以在同一程序中同时处理数据库访问和应用程序逻辑,而不需要频繁切换环境。
- 精细控制: 开发者可以直接通过SQL控制数据库的操作,灵活度较高。
缺点:
- 预编译器依赖: 嵌入式SQL需要通过预编译器来处理,这增加了开发和编译过程的复杂性。每个数据库厂商的预编译器都可能有所不同,这增加了数据库之间的依赖性。
- 移植性差: 嵌入式SQL依赖于具体的数据库厂商的实现,代码移植到其他数据库系统上时可能需要做大量修改。
- 维护复杂性:SQL语句与程序逻辑混合在一起,可能导致代码难以维护,特别是当应用程序中的SQL语句较多时,程序的可读性会降低。
5、常见场景
- 大型系统开发:嵌入式SQL常用于需要高性能数据库操作的场景,比如金融系统、ERP系统等。这些系统往往需要直接操控数据库,同时结合复杂的业务逻辑。
- 批量数据处理:当应用程序需要批量处理数据库中的数据时,嵌入式SQL通过游标等机制可以逐行处理结果集,适合进行大规模数据处理操作。
嵌入式SQL主要出现在C、COBOL等语言应用中,而JAVA更多依赖于JDBC。
6.4.3-通用数据接口标准
1、定义
通用数据接口标准:为了解决不同数据库系统之间的兼容性问题,它提供了一种统一的数据访问方式,但操作相对底层和抽象。
库函数级别的访问接口往往依赖于通用数据接口标准,它们的关系类似于“基础协议”和“应用层工具”之间的关系。
2、常见的通用数据接口标准:
- ODBC (Open DataBase Connectivity) :C语言,提供了一个统一接口,用于访问不同DBMS(数据库管理系统)管理的数据,支持异构数据库的访问,允许通过SQL语句直接操作数据库而无需关注具体DBMS的实现。
- JDBC (Java Database Connectivity) :Java中的数据库访问接口,提供统一访问关系数据库的方式,通过SQL执行查询和更新操作,作为Java应用与数据库交互的基础接口。
- DAO (Database Access Object):微软为访问Jet引擎数据库(如Access、dBase等)而提供的接口,适用于单系统或小范围分布式应用。
- RDO (Remote Database Object):DAO的改进版,支持远程数据库的访问,性能更佳,主要用于访问ODBC兼容的远程数据库。
- ADO (ActiveX Data Objects):简化了数据库访问,支持关系和非关系数据库,广泛用于ASP(Active Server Pages)应用中,可以轻松连接ODBC兼容数据库。
- ADO.NET:微软为.NET框架设计的一组面向对象类库,支持与各种数据源(包括关系数据库和XML)的交互,具有良好的扩展性和性能。
每种技术都在其特定的应用场景下表现出色,ODBC为跨平台、跨DBMS的数据访问提供了标准,而更高级的接口如ADO和JDBC则进一步简化了应用程序与数据库之间的交互
6.4.4- ORM访问接口
1、概念:
实现对象与关系型数据库之间的数据映射和转换。
2、核心思想
对象关系映射(ORM):通过使用元数据(如XML或注解)描述对象与数据库表之间的映射,ORM将内存中的对象与关系数据库中的数据关联起来。它解决了面向对象编程与关系型数据库之间的异构性问题,允许开发者在编程时只需考虑对象,而无需关心底层数据库的细节或SQL语句。
3、主要特点
持久化:ORM框架的核心功能是将对象的状态持久化到数据库中,处理数据的存取,避免开发人员手动编写SQL语句。
数据映射:通过元数据(如XML或注解)定义对象属性与数据库字段之间的映射关系。
简化数据库操作:开发者可以直接操作对象,而不必处理复杂的SQL逻辑,降低了对数据库知识的要求。
跨数据库支持:通过ORM,应用程序能与不同类型的数据库兼容,适应多种数据库管理系统。
4、主要的Java ORM框架
1)Hibernate:
特点:全自动化的ORM框架,功能强大、灵活性高,但同时也较为复杂,学习成本较高。
使用场景:适用于需要高度抽象和复杂对象关系映射的项目。
2)Mybatis:
特点:半自动的ORM框架,需要开发人员手动编写SQL语句,但它提供了较大的控制和灵活性。
使用场景:适用于开发人员希望对SQL有更多掌控,且项目不需要高度复杂的对象关系映射时。
3)JPA (Java Persistence API):
特点:Java自带的持久化API,通过注解或XML描述对象与数据库表的映射关系。它是一个规范,常用的实现包括Hibernate。
使用场景:适合需要遵循Java标准并且希望有更简洁配置的项目。
5、优势
- 提高开发效率:开发人员可以专注于业务逻辑,而不必深入到数据库的操作层。
- 降低数据库耦合:ORM框架提供了数据库无关性,使得应用更容易迁移到其他数据库系统。
- 减少冗余代码:减少手动编写SQL的需求,自动处理CRUD(创建、读取、更新、删除)操作。
6、挑战
- 性能问题:在某些复杂查询场景下,自动生成的SQL可能不如手写的SQL高效。
- 学习曲线:像Hibernate这种框架,虽然功能强大,但学习成本较高,尤其是对复杂的关系映射和优化需求时。
总的来说,ORM技术为面向对象编程和关系数据库之间的转换提供了一种高效的解决方案,大大简化了数据持久化的工作流程。