Java数据库连接
Java数据库连接(JDBC)是一个Java应用程序编程接口(Java API),用于管理与数据库的连接并执行查询。JDBC面向关系数据库,并为Java应用程序提供数据库连接标准。
JDBC API源于微软的开放式数据库连接(ODBC)。它是Sun Microsystems为Java语言设计的处理SQL(结构化查询语言)的接口。它于1997年作为JDK 1.1的一部分发布,是为Java语言开发的最早的库之一。自发布以来,JDBC经历了几个版本的更新和改进,以支持Java平台和数据库技术的发展。JDBC 4.3是2017年9月作为Java SE 9的一部分发布的最新版本。目前,JDBC API已经成为Java应用程序连接和访问数据库的主流技术之一,并被应用到各种框架和工具中。
JDBC API由一组用Java编程语言编写的接口和类组成。主要的接口和类有:DriverManager类、连接接口、语句接口等。使用这些标准接口和类,程序员可以编写连接到数据库的应用程序,发送用SQL编写的查询并处理结果。JDBC驱动程序为特定的DBMS供应商实现这些接口和类,可以将其视为Java应用程序和所需数据库之间的桥梁。使用JDBC API的Java应用程序将在实际连接到数据库之前加载特定DBMS的指定驱动程序。然后,JDBC驱动管理器类将把所有JDBC API调用发送给加载的驱动程序,以实现对数据库的连接和访问。
发展历史
起源
20世纪80年代,SQL成为关系数据库管理中广泛使用的语言。20世纪90年代,数据库技术迅速发展,出现了许多类型和供应商的数据库管理系统,如Oracle、Sybase、Informix、DB2等。这些数据库管理系统都有自己特定的接口和协议,这导致了数据库编程的碎片化和不兼容性。为了统一对SQL数据库的访问,微软公司于1992年推出了开放式数据库连接(ODBC),这是一种用于连接和操作数据库的通用API。ODBC API是一个独立于编程语言和数据库系统的ODBC函数库。它允许支持ODBC的应用程序使用ODBC驱动程序连接到任何数据库,执行SQL语句并获得结果。
但是,ODBC API并不直接适用于Java编程语言,因为它使用了C语言的接口。从Java调用本地C代码会给应用程序的安全性、实现、健壮性和自动移植性带来一些缺点。而且ODBC的性能很低,依赖于操作系统,不支持对象和异常。Java是一种流行的、跨平台的、面向对象的编程语言,它需要一种更合适的数据库访问方法。
为了解决这些问题,太阳微系统公司于1997年专门为Java语言设计了JDBC API。它是基于Java的数据库访问接口,允许Java应用程序连接到任何支持SQL的数据库。JDBC API借鉴了ODBC的一些设计思想,也是基于Open Group SQL CLI(调用级接口)的。但是,JDBC API更适合Java的特点和优势。它使用Java对象和异常机制,并且不依赖于操作系统或数据库供应商的API,从而提高了安全性、健壮性和可移植性。Jdbapi因此成为Java语言访问关系数据库的标准方式。
发展
Sun Microsystems于1997年发布的JDBC 1.0仅支持基本的SQL语句,但不提供高级功能,如事务控制和结果集处理。1999年,为了解决效率和稳定性问题,JDBC 2.0发布,增加了高级功能,如批量更新、事务控制、数据源、行集等。JDBC API分为JDBC 2.0核心API(Java . SQL)和JDBC 2.0的JDBC 2.0标准扩展API(javax . SQL)。
2003年,JDBC 3.0发布,引入了保存点、返回自动生成的密钥、参数元数据等特性。,以满足更复杂和更大规模的数据处理需求。这些特性使Java程序能够更好地处理分布式和并发环境,并提高容错和恢复能力。
2006年,JDBC 4.0发布,它支持Java SE 6的新特性,如注释、泛型、自动加载驱动程序等。JDBC 4.0进一步简化了开发过程,并通过引入自动加载驱动程序和增强的连接功能提高了开发人员的工作效率和应用程序的可靠性。这些特性使Java程序更容易与新的数据库技术和标准集成,例如SQL XML、Blob和Clob的流处理。
2011年,JDBC 4.1发布,主要是为了支持Java SE 7的新功能,如try-with-resources语句、删除JDBC-ODBC桥、RowId的生命周期提示等。,这样Java程序可以更简洁地管理资源,更方便地访问本地数据库,更准确地处理RowId类型。
2014年发布了JDBC 4.2,它为Java SE 8的新功能提供了支持,例如日期和时间类型、大型对象的流处理、引用游标类型等。这些特性使Java程序能够更好地处理新的数据类型和格式。
2017年发布了JDBC 4.3,它支持Java SE 9的新功能,如模块化系统、分片API和更多SQL类型。这些特性使Java程序能够更好地适应模块化开发模式,更好地支持分布式和水平扩展的数据库,并更好地兼容不同的数据库标准。
状态
目前,JDBC在Java平台和数据库技术的发展中发挥着重要作用,它为Java程序提供了简单、统一和跨平台的数据库访问机制,使得Java程序可以与任何支持SQL的数据库进行通信。JDBC广泛应用于各种Java应用程序和框架中,如Spring、Hibernate、JPA等。它在Web开发、数据分析、企业应用、云计算等领域发挥着重要作用。
程序模型
JDBC API支持两层和三层客户-服务器模式的数据库访问。
双层客户机-服务器模型
所谓两层模型是指Java应用程序和目标数据库分别安装在两层组件上。这两个组成部分是:
应用层:安装在客户端机器上,包括:
JDBC驱动程序:用于连接数据库和执行SQL语句;
用户界面:用于与用户交互和显示数据;
Java应用:用于实现业务逻辑和数据处理。
数据库层:安装在数据库服务器上,包括:
RDBMS:用于管理和存储数据;
数据库:用于存储特定的数据表和记录。
在两层客户机-服务器模型中,Java应用程序直接与数据库通信,这需要一个JDBC驱动程序,它可以与被访问的特定数据库进行交互。JDBC驱动程序将用户的命令传输到数据库或其他数据源,并将这些语句的结果返回给用户。数据库可以位于另一台机器上,用户通过网络连接到它。这称为客户端-服务器配置。用户的机器是客户端,数据库所在的机器是服务器。用户连接到数据库的网络可以是内部网,如公司的内部网或互联网。
三层客户机-服务器模型
三层客户机-服务器模型是Java数据库应用程序的常用体系结构,它分为三个组件级别,即客户机层、应用服务器层和数据库层。这三个级别的组件可以分别安装在不同的机器上,通过网络进行通信和数据交换:
客户端层:用户和应用程序之间的接口,可以是Web浏览器、桌面应用程序或移动应用程序。客户端层通常包括一些特定于语言的虚拟机,如Java虚拟机或。NET虚拟机,用于运行应用程序代码。客户端层向应用服务器层发送数据操作请求,如查询、插入、更新或删除数据,然后接收应用服务器层返回的数据或结果并显示给用户。
应用服务器层:负责处理业务逻辑或应用逻辑,如验证用户身份、计算数据、生成报表等。应用服务器层可以使用Java Web应用程序或Java Web服务来实现,它们可以运行在Web服务器上,例如Tomcat或Jetty。应用服务器层包含用于连接数据库和执行SQL语句的JDBC API。应用服务器层接收客户端层的数据操作请求,然后根据请求的内容向数据库层发送相应的SQL语句,并将数据库层返回的数据或结果转换为客户端层可以识别的格式,例如XML或JSON,并将其发送回客户端层。
数据库层:负责数据存储,包括关系数据库管理系统(RDBMS)和数据库。数据库层可以安装在数据库服务器上,如MySQL、Oracle或SQL Server。数据库层接收应用服务器层的SQL语句,然后根据SQL语句的内容对数据库执行相应的操作,例如查询、插入、更新或删除数据,并将操作的结果或数据返回给应用服务器层。
与两层模型相比,使用三层模型的优势包括:
通过将应用服务器层与数据库层分离,应用服务器层可以并发处理多个客户端层的请求,而数据库层可以专注于数据管理和存储,这可以大大提高应用程序的性能。
业务逻辑与数据库明确分离,应用服务器层可以根据需求进行修改或更新,而不会影响数据库层的结构和数据,使应用程序更易于维护和扩展;客户端层可以使用简单的协议(如HTTP或SOAP)访问应用服务器层,而无需了解数据库层的详细信息,如数据库的类型、地址、用户名和密码,这可以提高客户端层的安全性和可移植性。
JDBC API
JDBC API定义了程序员用来连接数据库和发送查询的Java接口和类。JDBC驱动程序为特定的DBMS供应商实现了这些接口和类。可以说JDBC驱动程序在Java应用程序和所需的数据库之间架起了一座桥梁。使用JDBC API的Java应用程序将在实际连接到数据库之前加载特定DBMS的指定驱动程序。然后,JDBC驱动管理器类将所有JDBC API调用发送给加载的驱动程序。
根据不同的配置,JDBC驱动程序可分为以下四种类型。
JDBC-ODBC桥驱动程序
JDBC-ODBC桥驱动程序使用Java的本地方法调用ODBC驱动程序,并将JDBC方法调用转换为ODBC函数调用,从而实现与数据库的连接。
优势特点
优势
使用方便;您可以轻松连接到任何数据库。
缺点:由于JDBC方法调用被转换为ODBC函数调用,性能下降;ODBC驱动程序需要安装在客户端计算机上。
注意:在JDBC 4.2中,JDBC-ODBC桥已被删除。
网络协议全Java驱动程序
网络协议的完整Java驱动程序使用中间件(应用服务器)直接或间接将JDBC调用转换为特定供应商的数据库协议。驱动程序完全是用Java编写的。
基于服务器,客户端计算机上不需要JDBC驱动程序代码;跨平台,完全Java实现,适合网络应用。
劣势
需要在服务器端安装数据库中间层,增加了网络开销和维护成本。
本地API部分Java驱动程序
本地API的Java驱动程序使用数据库供应商提供的客户端库将JDBC方法调用转换为数据库API的本地调用,该调用并不完全是用Java编写的。
需要安装特定于数据库的API在客户端;不跨平台,不完全Java实现。本地协议全Java驱动程序本地协议全Java驱动程序直接将JDBC调用转换为供应商特定的数据库协议,并且该驱动程序完全用Java编写。
链接步骤
使用JDBC将Java应用程序与数据库连接起来需要五个步骤。这些步骤如下:
注册驱动程序
在连接数据库之前,需要为每个数据库加载或注册一次驱动程序,以创建与数据库的通信通道。加载驱动程序有两种方式:
静态注册:使用class . forname(driverName)的方法,其中driverName是驱动程序的全限定类名,如com . MySQL . CJ . JDBC . driver;;动态注册:使用drivermanager。register driver(driver)方法,其中driver是驱动程序的实例,例如new com.mysql.jdbc.Driver()。
连接建立
getConnection()方法用于创建一个连接对象,该对象对应于与数据库的物理连接。这可以通过两种方式实现:
getconnection(URL,用户名,密码):使用三个参数,URL,用户名和密码,例如connection conn = driver manager . getconnection(URL,用户,密码);
GetConnection(URL):只有一个参数URL,它包含用户名和密码。不同的关系数据库有不同的JDBC连接字符串,例如Oracle数据库:JDBC: Oracle:瘦:@主机名:端口:服务名。
执行查询
建立连接后,可以使用Connection类的createStatement方法创建一个Statement对象来执行SQL查询,Statement对象表示SQL语句的接口。例如:statement stmt = conn . create statement()。
创建Statement对象后,使用Statement对象的query方法传入SQL查询语句。语句对象有三种查询方法:execute()、executeQuery()和executeUpdate(),其中executeQuery()方法用于执行查询语句并返回一个ResultSet对象,表示结果集,例如ResultSet RS = stmt。执行查询。
处理结果集
当使用executeQuery()方法执行查询时,它返回一个代表结果集的ResultSet对象。然后可以使用ResultSet对象的方法来访问从数据库中检索的数据。如果使用ResultSet对象的next方法,则遍历结果集:while(RS . next()){ }。
关闭连接
当连接、语句或ResultSet对象完成时,调用其close方法以立即释放它正在使用的资源。比如依次关闭结果集、语句对象和数据库连接对象:RS . close();stmt . close();conn.close()。
这五个步骤只是Java应用程序连接数据库的一般步骤。如果需要,可以根据实际开发情况连接数据库。例如,如果在注册驱动程序之前没有导入包,可以使用import java.sql*导入java.sql .再举一个例子,使用try-with-resources语句自动关闭Connection、ResultSet和Statement类型的资源可以避免显式连接关闭步骤并简化代码。
执行结果
使用JDBC API执行SQL语句可能会返回结果集、更新计数或输出参数。
SQL查询结果集
SQL查询结果集对应于接口java.sql.result set的实例对象。ResultSet对象通常由Statement、PreparedStatement或CallableStatement对象的executeQuery()或execute()方法返回。ResultSet对象不仅记录查询集结果中的每一行数据,还记录每一列的类型信息。ResultSet对象的主要方法如下:
移动光标的方法用于移动ResultSet对象的光标并指向不同的行,例如next()、previous()、first()、last()方法等等。
获取列值的方法用于获取当前行某一列的值,这些值将被转换为指定的Java类型,如getString()、getInt()、getBoolean()、getDouble()等。
更新列值的方法用于更新当前行中某一列的值,并将这些值设置为指定的Java类型,如updateString()、updateInt()、updateBoolean()、updateDouble()等。
获取元数据的方法用于获取结果集的元数据,如列的数量、名称、类型和长度,如getMetaData()、getRow()、getType()等。
关闭结果集的方法,close()方法用于关闭结果集并释放资源。
更新计数
当使用语句或PreparedStatement对象的executeUpdate()方法执行update语句时,返回的结果是一个int值,指示更新的行数,即更新计数。更新计数可用于判断SQL语句是否成功执行。
输出参数
输出参数是一个特殊参数,可用于从存储过程或函数而不是结果集中返回值。通常CallableStatement对象的registerOutParameter()方法输出参数的类型和位置,execute()方法执行存储过程或函数,getXXX()方法用于获取输出参数的值,其中XXX表示输出参数的数据类型,如getInt()、getString()等。
输出参数的值可以用于逻辑判断、统计或显示,或者作为其他SQL语句的输入参数。一般来说,如果输出参数有值,则意味着执行成功;如果输出参数没有值,则意味着执行失败或没有返回值。