1.JDBC界面定义
JDBC API包含java.sgl的界面和类。
java.sgl.CallableStatement:用于执行存储的SQL过程的界面。
java.sgl.Connection: 一个连接表示与某一指定数据库的一个会话。在该连接中可以执行SQL语句和处理返回结果。
java.sql.DataTruncation:当JDBC碰到意外数据截断时,报告一个警告(读数据时)或产生一个异常(写数据时)。
java.sql.Date:是标准java.util.date的一个子集,只表示天数,而不包含时、分、秒。
java.sql.Driver:定义一个在每一个数据库驱动程序中必须实现的驱动程序界面。 java.sql.DriverManager:提供对全局SQL状态的访问。
java.sql.DriverPropertyInto:提供高级程序员与驱动程序之间对连接特性信息进行交互的手段。 java.sql.NullData:当由getXXX或getObiect方法读出一个SQL空值时,产生一个NullData警告。 java.sql.Numeric:是一个任意精度标量数值类,可用作表示SQL定点Numerlc和Decimal类型的数值。 java.sql.PreparedStatement:保存一个预编译的SQL语句的对象,该对象可被高效地执行多次。 java.sql.ResultSet:结果集提供对执行一个SQL语句后产生的结果表的访问。表中数据按行依次取出。为便于移植,建议对每一行数据从左至右按列读出。
java.sql.SQLException:处理数据库访问时的出错信息。
java.sql.SQLWarning:处理数据库访问时的警告信息。
java.sql.Statement:用作执行一条静态的SQL语句并接收产生的结果。
java.sql.Time:用于表示标准java.util.date类的一个信息子集,仅表示时、分、秒。 java.sql.Timestamp:扩展标准java.util.date类,使其能够表示SQL的时间戳,增加了一个以纳秒为单位的时间域。
java.sql.Types:定义区分SQL类型的常量。类常量值与XOPEN中的值相同。
此外,JDBC API 还定义了JDBC元数据界面java.sql.DatabaseMetaData 和java.sql.ResultSetMetaData。
图5 界面之间的关系
界面间的关系由图5表示,其中箭头表示函数,而线表示其它方法。
2.数据库连接
(1)建立一个连接
用户在访问数据库时,需要在JDBC管理层由 java.sql.DriverManager.getConnection方法产生一个java.sql.Connection对象。
该方法使用一个数据库URL串作为参数。
(2)选择合适的驱动程序
在数据库URL中,可以指定驱动程序的名称,也可以不指定。
如果不指定驱动程序,则从Java特性"sql.drivers"所指出的驱动程序表中依次搜寻,使用最先找到的可成功连接的驱动程序。
(3)数据库URL
在连接时,由数据库URL参数指定要连接的数据库,此时可称为JDBC URL,其格式为:
jdbc:<子协议>:<子名称>
如果是对网络数据库访问,那么建议用户使用标准URL作为子名称的一部分。
比如对数据资源名为fred访问的URL可能是: jdbc:odbc:fred 或jdbc:dbnet://wombat:356/fred
子协议odbc表示对ODBC数据资源的访问,其格式为: jdbc:odbc:<数据资源名>[;<属性名>=<属性值>]*
·连接参数:
由java.util.Properties对象指出。
建议大多数参数不要在此处给出,而在协议中指出。
·支持多连接:
一个应用程序可以使用一个或多个驱动程序建立与多个数据库连接。
·驱动程序的注册:
有两种方法,
一是在JDBC java.sql.DriverManager类初始化时查找"sql.drivers"特性,对每一个驱动程序自动注册;
二是由标准 Class.forName方法显式加载一个驱动程序,参数为驱动程序名。
3.参数传递和结果接收
(1)查询结果 执行一条查询语句后,返回结果是可由java.sql.ResultSet对象访问的行的集合。
在该对象中提供了一系列"get" 方法,访问当前的每一列,Result-Set.next方法可实现在结果集的行之间移动,可以使用列索引或列名指定相应的列。
·查询结果的数据转换
。 ResultSet.getXXX方法可以把SQL类型转化为需要的Java类型
。若指定一个非法的类型转换时,则产生一个SQLException的异常
·空值判断
。先读出某一列数据,然后使用Result-Set.wasNull方法,判断返回结果是否是SQL"NULL"
·长数据的读出
。JDBC支持由getByte和getString 方法读出任意长的LONGVARBINARY或LONGVAR-CHAR类型数据,也支持由方法GetBinaryStream、GetAsciiStream 和 GetUnicodeStream返回数据流来读出数据
·支持用getResultSet、GetUpdateCount 和 Get-MoreResults方法分别返回一条结果、返回被修改的行数和返回多条结果。
(2)传递IN参数
java.sql.PreparedStatement界面提供了一系列setXXX方法向SQL语句传递参数,实现动态的SQL语句。
在传递参数时必须满足数据类型一致的要求。
因此必须预先调用类型转换方法完成数据转换,同时也提供了传递SQL空值和长数据给IN参数的方法。
(3)接收OUT参数
在调用一个存储过程时,可用setXXX方法传递IN参数,使用OUT参数接收返回结果。
在使用时必须先调用CallableStatement.registerOutParameter方法为每一个OUT参数进行类型注册,然后执行该过程调用语句,最后使用getXXX方法取出OUT参数的结果。
返回结果的数据类型是与用户注册的SQL类型相对应的Java类型。
空值的处理步骤是,先读出参数值,再用CallableStatement.wasNull方法判断是否为空值。
不支持以流形式读出OUT参数的机制。
接收时返回结果的顺序优先于OUT参数。
(4)数据截断
在某种条件下,有可能在读或写数据时出现数据截断,如当由Connection.setMaxFieldSize设置了一个域的最大长度时,超过设置长度后的数据就被截断。
在读数据时,如出现数据截断,则产生一条DataTruncation的 SQLWarning警告。
在写数据时,如发生数据截断,则产生一个DataTruncation的SQLException异常。
4. SQL数据类型到Java类型的转换
由于SQL数据类型与Java数据类型之间差异较大,可相互转换的类型之间还是存在一些不一致的地方,因此JDBC提供了详细的从SQL类型到Java类型的标准转换表和从Java类型到SQL类型的标准转换表。