Java Web开发实战—JDBC基础—JDBC入门
时间:2023-05-24 05:36:02 | 来源:网站运营
时间:2023-05-24 05:36:02 来源:网站运营
Java Web开发实战—JDBC基础—JDBC入门:
JDBC入门持久化持久化是指将数据存储到可永久保存的存储设备中。持久化的主要应用场景是将内存中的对象存储在数据库、XML数据文件或其他种类的磁盘文件中。
同时,持久化也是将程序数据在瞬时状态和持久状态之间转换的机制,它的出现是为了弥补计算机内存的缺陷,这可以从以下两个方面理解。
l 内存掉电后数据会丢失,但有些数据是无论如何都不能丢失的,比如银行账号、交易信息等,这些数据需要存储到可永久保存的存储设备中。
l 内存过于昂贵,与磁盘、光盘相比,内存的价格要高很多,而且维持成本较高,因此,内存资源是相对稀缺的。在程序的运行过程中,因为内存容量限制,一些数据需要被持久化到外部存储设备中。
持久化有多种实现形式,在Java编程中,常见的持久化方式是将程序产生的数据存储到数据库中,而JDBC则是实现这一过程的重要工具。
JDBC的概念JDBC是Java DataBase Connectivity(Java数据库连接)的简写,它是一套用于执行SQL语句的Java API,由一组用Java语言编写的类和接口组成,是Java程序访问数据库的标准规范。
通过JDBC提供的API,应用程序可以连接到数据库,并使用SQL语句完成对数据库中数据的插入、删除、更新、查询等操作,如图1.1所示。有了JDBC,开发人员无须为访问不同的数据库而编写不同的应用程序,只需要使用JDBC编写一个通用程序即可。
图1.1 JDBC访问数据库
应用程序在使用JDBC访问特定的数据库时,需要与不同的数据库驱动进行连接。JDBC提供接口,而驱动是接口的实现,没有驱动将无法完成数据库连接。每个数据库提供商都需要提供自己的驱动,用来连接本公司的数据库,如图1.2所示。
图1.2 通过数据库驱动实现与数据库的连接
JDBC的体系结构JDBC具有自身独特的体系结构,具体如图1.3所示。
图1.3 JDBC的体系结构
从图1.3中可以看出,JDBC的体系结构由三层组成,具体如下。
l JDBC API:面向程序,供Java程序开发人员使用。
l JDBC Driver Manager:注册数据库驱动,供Java程序开发人员使用。
l JDBC Driver API:面向数据库,供数据库厂商使用。
其中,JDBC API通过Driver Manager(驱动管理器)实现与数据库的透明连接,提供获取数据库连接、执行SQL语句、获得结果等功能。JDBC API使开发人员获得了标准的、纯Java的数据库程序设计接口,在Java程序中为访问任意类型的数据库提供支持。JDBC Driver Manager(驱动管理器)为应用程序装载数据库驱动,确保使用正确的驱动来访问每个数据源。JDBC Driver Manager的一个特色功能是,它能够支持连接到多个异构数据库的多个并发驱动程序。JDBC Driver API提供了数据库厂商编写驱动程序时必须实现的接口。
JDBC扩展了Java的能力,它让开发人员在开发数据库程序时真正实现"一次编写,处处运行",例如,企业可以通过JDBC程序让使用不同操作系统的员工在互联网上连接到多个全球数据库上,而这些全球数据库可以是不相同的。
JDBC的常用APIJDBC定义了一系列操作数据库的接口和类,这些接口和类位于java.sql包中。本节将详细介绍JDBC的常用API。
1. Driver接口Driver接口是所有JDBC驱动程序必须要实现的接口,该接口供数据库厂商使用。在编写JDBC程序时,必须先装载特定数据库厂商的驱动程序,装载驱动程序通过java.lang.Class类中的静态方法forName()实现。
2. DriverManager类DriverManager类用于加载JDBC驱动并创建与数据库的连接,DriverManager类的常用方法如表1.1所示。
表1.1 DriverManager的常用方法
方法名称 | 功能描述 |
registerDriver(Driver driver) | 注册数据库的驱动程序 |
getConnection (String url,String user,String password) | 获取数据库连接 |
3. Connection接口Connection接口表示Java程序和数据库的连接,Java程序和数据库的交互是通过Connection接口来完成的。Connection接口的常用方法如表1.2所示。
表1.2 Connection接口的常用方法
方法名称 | 功能描述 |
createStatement() | 创建向数据库发送sql的Statement对象 |
prepareStatement(String sql) | 创建向数据库发送预编译sql的PrepareSatement对象 |
prepareCall(String sql) | 创建执行存储过程的CallableStatement对象 |
4. Statement接口Statement接口用于向数据库发送SQL语句,Statement接口提供了三种执行SQL语句的方法,具体如表1.3所示。
表1.3 Statement接口的方法
方法名称 | 功能描述 |
execute(String sql) | 运行语句,返回是否有结果集 |
executeQuery(String sql) | 运行select语句,返回ResultSet结果集 |
executeUpdate(String sql) | 运行insert/update/delete操作,返回更新的行数 |
5. PreparedStatement接口PreparedStatement接口继承自Statement接口,用于执行预编译的SQL语句,PreparedStatement接口提供了一些对数据库进行基本操作的方法,具体如表1.4所示。
表1.4 PreparedStatement接口的方法
方法名称 | 功能描述 |
executeQuery(String sql) | 运行select语句,返回ResultSet结果集 |
executeUpdate(String sql) | 运行insert/update/delete操作,返回更新的行数 |
addBatch(String sql) | 把多条sql语句放到一个批处理中 |
executeBatch() | 向数据库发送一批sql语句执行 |
6. CallableStatement接口CallableStatement接口继承自PreparedStatement接口,由prepareCall()方法创建,用于调用SQL的存储过程。CallableStatement接口提供了一些对数据库进行基本操作的方法,具体如表1.5所示。
表1.5 CallableStatement接口的方法
方法名称 | 功能描述 |
wasNull() | 查询最后一个读取的OUT参数是否为SQL类型的Null值 |
setNull(String parameterName,int sqlType) | 将指定参数设置为SQL类型的NULL |
getInt(int parameterIndex ) | 以Java语言中int值的形式获取数据库中Integer类型参数的值 |
setString(String parameterName,String x) | 将指定参数设置为给定的Java类型的String值 |
registerOutParameter(int parameterIndex, int sqlType) | 按顺序位置parameterIndex将OUT参数注册为SQL类型 |
7. ResultSet接口ResultSet接口表示执行select查询语句获得的结果集,该结果集采用逻辑表格的形式封装。ResultSet接口中提供了一系列操作结果集的方法,具体如表1.6所示。
表1.6 ResultSet接口的方法
方法名称 | 功能描述 |
getString(int index)、getString(String columnName) | 获得在数据库里是varchar、char等类型的数据对象 |
getFloat(int index)、getFloat(String columnName) | 获得在数据库里是Float类型的数据对象 |
getDate(int index)、getDate(String columnName) | 获得在数据库里是Date类型的数据 |
getBoolean(int index) 、getBoolean(String columnName) | 获得在数据库里是Boolean类型的数据 |
getObject(int index)、getObject(String columnName) | 向数据库发送一批sql语句执行 |
next() | 移动到下一行 |
previous() | 移动到前一行 |
absolute(int row) | 移动到指定行 |
beforeFirst() | 移动resultSet的最前面 |
afterLast() | 移动到resultSet的最后面 |
ResultSet对象维护了一个指向表格数据行的指针,指针默认在第一行之前,调用next()或previous()等移动指针的方法,可以使指针指向具体的数据行,然后通过调用getObject()方法获取指定的查询结果。
8. ResultSetMetaData接口ResultSetMetaData接口用于获取关于ResultSet 对象中列的类型和属性信息的对象。ResultSetMetaData接口的常用方法,具体如表1.7所示。
表1.7 ResultSetMetaData接口的常用方法
方法名称 | 功能描述 |
getColumCount() | 返回所有字段的数目 |
getColumName(int colum) | 根据字段的索引值取得字段的名称 |
getColumType (int colum) | 根据字段的索引值取得字段的类型 |
JDBC URLJDBC URL提供了一种标识数据库的方法,它可以使JDBC程序识别指定的数据库并与之建立连接。大家在编写JDBC程序时, 无须关注JDBC URL的形成过程,只需使用与所用的数据库一起提供的URL即可。
JDBC URL的标准语法如图1.4所示(以MySQL为例)。
图1.4 JDBC URL的标准语法
从图1.4中可以看到,JDBC URL由协议、子协议、主机:端口、数据库名称、参数等组成。其中,JDBC URL中的协议总是JDBC,子协议因数据库厂商的不同而有所差异,在本例中为MySQL,主机为数据库所在的主机地址,端口为MySQL数据库的默认端口号3306,参数多为连接属性的配置信息,包括数据库的用户名、密码、编码、套接字连接的超时等,JDBC URL的常用参数如表1.8所示。
表1.8 JDBC URL的常用参数
参数类型 | 参数名称 |
user | 数据库用户名,用于连接数据库 |
password | 用户密码,用于连接数据库 |
useUnicode | 是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true |
characterEncoding | 当useUnicode设置为true时,指定字符编码。比如可设置为gb2312、gbk、utf8 |
autoReconnect | 当数据库连接异常中断时,是否自动重新连接 |
autoReconnectForPools | 是否使用针对数据库连接池的重连策略 |
failOverReadOnly | 自动重连成功后,连接是否设置为只读 |
maxReconnectsautoReconnect | 重试连接的次数 |
initialTimeoutautoReconnect | 两次重连之间的时间间隔,单位:秒 |
connectTimeout | 和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本 |
socketTimeoutsocket | 操作(读写)超时,单位:毫秒。 0表示永不超时 |