1第14章JDBC本章导学随着Java技术的迅速发展与广泛应用,各种主流数据库系统都支持基于Java语言的访问与操作,JDBC是一组用于在Java环境中进行数据库访问的Java类。本章主要学习JDBCAPI,结合实例学习如何通过JDBC-ODBC桥接的方式以及SQLServer专用驱动的方式连接数据库、执行SQL语句及处理查询结果,还将学习如何通过JDBCAPI类调用存储过程。通过本章的学习可以掌握如何使用JDBC来开发数据库应用,熟悉JDBCAPI的核心类,并掌握如何利用Java语言实现数据库连接以及对数据库进行增删改查等操作。本章知识点知识点重要等级难度等级JDBC概述★★★连接数据库★★★★★★★★数据库驱动程序★★★★★★创建ODBC数据源★★★DriverManager★★★★★★★Connection★★★★★★★查询数据库★★★★★★★★Statement★★★★★★★PreparedStatement★★★★★★★★CallableStatement★★★★★★★★ResultSet★★★★★★★★更新数据库★★★★★★★★214.1JDBC概述随着Java语言应用的日益广泛,越来越多的应用软件使用Java作为开发语言,其中包括大量基于数据库的应用程序。JDBC是Sun公司所开发的基于Java语言的数据库应用程序开发接口。JDBC的全称为JavaDataBaseConnectivity,即Java数据库连接,它是Java应用程序与数据库系统通信的标准API(ApplicationProgramInterface,应用程序接口),它与具体的数据库管理系统DBMS的类型无关,无论数据库是MSSQLServer还是Oracle或是MySQL,都可以通过JDBC实现Java程序与数据库之间的访问和操作,作为程序员无需为访问SQLServer数据库专门写一个程序,而为访问Oracle数据库又专门写另一个程序来实现相同功能,只需用JDBC编写一个程序,而使用不同的数据库驱动程序连接数据库即可。JDBC应用程序结构如图14-1所示:SQLServer应用程序JDBCSQLServerDriverMySQLMySQLDriverOracleOracle图14-1JDBC应用程序结构JDBC由一组通过Java语言编写的类和接口组成,它为数据库开发人员提供了一个标准的API。简单说来,JDBC可以做三件事情,分别是与数据库建立连接、发送SQL语句给数据库并且处理数据库操作结果。其基本工作方式如下:首先加载数据库的JDBC驱动程序,然后建立数据库连接对象,由连接对象建立语句对象及结果集对象(如果是查询语句,结果集对象表示从数据库中取出的记录集),通过语句对象和结果集对象进行各种数据库操作,最后需要关闭连接对象。使用JDBC时需要在Java程序中导入java.sql包,即JDBC核心API,在JDK的java.sql包中包含了连接数据库的类、将嵌入式的SQL语句发送给数据库的类以及处理查询结果的类。必要时可能需要导入包javax.sql,即扩展API。在本章将学习如果通过JDK中提供的类和接口来实现对数据库的操作。14.2连接数据库如果希望通过Java应用程序来访问和操作数据库,首先应该建立数据库连接,通过数据库连接Java代码可以和数据库进行通信。数据库连接是对数据库进行操作的第一步,在JDBC中提供了几种数据库连接方式,它们的主要区别在于数据库驱动程序程序不一样,下面将首先学习数据库驱动程序。14.2.1数据库驱动程序通常,数据库生产厂商如Microsoft、Oracle、Sybase等公司会为自己的数据库管理系统如SQLServer、Oracle、Sybase等提供一组专用的API来访问数据库。数据库驱动程序主要3分为三类,分别是:(1)JDBC-ODBC桥;(2)数据库厂商驱动;(3)中间件访问。在本课中将重点学习使用前两种驱动程序来实现数据库连接。1.JDBC-ODBC桥ODBC全称为OpenDatabaseConnectivity,即开放数据库互连,它是Micorosoft公司开发的开放服务结构(WOSA,WindowsOpenServicesArchitecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API,这些API利用SQL语句来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句发送给ODBC。基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论数据库是SQLServer、MySQL还是Oracle,均可用ODBCAPI进行访问。因此,ODBC的最大优点是能以统一的方式处理所有的数据库,但是它的缺点是执行效率比较低。不同于ODBC,JDBC只支持Java应用程序。在使用JDBC的Java应用程序中,客户端程序中只能调用JDBC的语句,因此需要在JDBC与ODBC之间建立一种连接关系,JDBC-ODBC桥由此诞生。通过JDBC-ODBC桥可以将JDBC操作翻译成对应的ODBC调用。JDBC-ODBC桥是在JDBC刚刚诞生时广泛使用的一种数据库访问技术。通过JDBC-ODBC桥,开发人员可以使用JDBC来访问一个ODBC数据源。JDBC-ODBC桥结构示意图如图14-2所示。应用程序JDBC-ODBC桥ODBCDriver数据库14-2JDBC-ODBC桥结构示意图2.数据库厂商驱动数据库厂商驱动使用Java实现与数据库厂商专用API的混合形式来提供数据访问,它比JDBC-ODBC桥方式快。现在大多数的数据库厂商都在其数据库产品中提供驱动程序,这种使用方式比JDBC-ODBC桥方式有效。由于此类驱动程序是数据库厂商提供的,因此它能够实现对于本公司数据库系统的最优化访问。但是这些驱动程序和厂商专用的API必须在每个运行Java应用程序的客户端安装。不同类型的数据库其驱动程序不相同,如Microsoft公司提供了专属于SQLServer数据库的驱动程序,Oracle提供了专属于Oracle数据库的驱动程序。这类驱动程序的弹性较差,由于是数据库厂商自己提供的专属驱动程序,为此往往只适用于自己4的数据库系统,甚至只适合某个版本的数据库系统。如果后台数据库换了一个或者版本升级了,则就有可能需要更换数据库驱动程序。厂商驱动连接结构示意图如图14-3所示。应用程序数据库厂商提供的Driver数据库14-3厂商驱动连接结构示意图在本课中将主要学习如何使用JDBC来操作MSSQLServer数据库,因此需要首先在网络上下载对应的、由Microsoft提供的专属于SQLServer数据库的驱动程序API,在该API中包含了三个包,分别是msbase.jar、mssqlserver.jar和msutil.jar,在使用厂商驱动连接数据库时需要在Java应用程序运行环境中添加这三个包,否则将无法找到对应的驱动程序类。14.2.2创建ODBC数据源在使用JDBC-ODBC桥连接数据库的过程中,首先需要创建ODBC数据源,其创建过程分为以下几个步骤:1.在控制面板上选择“管理工具”,双击“数据源(ODBC)图标”,如图14-4所示。图14-4“数据源(ODBC)”图标2.在“ODBC数据源管理器”的“用户DSN”选项卡中单击“添加”按钮,如图14-5所示。图14-5“ODBC数据源管理器”窗口3.从弹出的“创建新数据源”窗口的数据源名称列表中选择“SQLServer”并单击“完成”按钮,如图14-6所示。5图14-6“创建新数据源”窗口4.在弹出的“创建到SQLServer的新数据源”窗口的“名称”文本框输入自定义的数据源名称,在“服务器”列表中选择想连接的服务器名,如果是本机数据源,输入点号(.)或者选择“(local)”,然后单击“下一步”按钮,如图14-7所示。图14-7“创建到SQLServer的新数据源”窗口一5.在“创建到SQLServer的新数据源”对话框里选择“使用用户输入登录ID和密码的SQLServer验证”选项,输入登录SQLServer数据库的“登录ID”和“密码”,然后单击“下一步”按钮,如图14-8所示。图14-8“创建到SQLServer的新数据源”窗口二6.在“更改默认的数据库为:”下拉列表中选择想使用的数据库,其余选项保持默认设置,单击“下一步”按钮,如图14-9所示。6图14-9“创建到SQLServer的新数据源”窗口三7.保持该窗口的默认设置,单击“完成”按钮,如图14-10所示。图14-10“创建到SQLServer的新数据源”窗口四8.在弹出的“ODBCMicrosoftSQLServer安装”窗口中单击“测试数据源”按钮,如图14-11所示,检查与数据库连接是否成功,如果提示如图14-12所示窗口,则表示数据库连接测试成功,单击“确定”即完成ODBC数据源的全部创建过程。图14-11“ODBCMicrosoftSQLServer安装”窗口7图14-12“SQLServerODBC数据源测试”窗口ODBC数据源创建成功后,Java应用程序就可以使用该数据源实现与数据库的通信。14.2.3驱动程序管理器连接是Java应用程序与数据库之间的通信,它由JDBC驱动程序建立,因此需要首先在系统中加载JDBC驱动程序。数据库连接是数据库操作的第一步,在连接过程中一般需要使用驱动程序管理器DriverManager和连接对象Connection。DriverManager(驱动程序管理器)类是JDBC的管理层,作用于用户和驱动程序之间。它可以跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。在Java程序中,可以通过Class类的静态方法forName()方法来加载驱动程序。如果使用JDBC-ODBC桥,可以使用如下代码来注册数据库驱动程序:try{//加载驱动程序,使用JDBC-ODBC桥连接SQLServer数据库Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);}catch(ClassNotFoundExceptione){System.out.println(Drivernotfound!);}如果使用Microsoft提供的专用SQLServer驱动,可以使用如下代码来加载数据库驱动程序:try{//加载驱动程序,使用Microsoft公司提供的专用驱动程序连接SQLServer数据库Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver);}catch(ClassNotFoundExceptione){System.out.println(Drivernotfound!);}8在加载驱动程序后,通过调用DriverManager类的静态方法getConnection()来获取数据库连接对象Connection,该方法能够定位到连接数据库驱动程序。DriverManager类的getConnection()方法有如下两种常用的重载方式:(1)staticConnectiongetConnection(StringURL):该方法尝试建立一个连接到指定URL的数据库。(2)staticConnectiongetConnection(StringURL,Stringusername,Stringpassword):该方法用于连接到指定URL的数据库,并使用用户名为username,密码为password登录该数据库。调用这些方法时,DriverManager类将在已经注册的驱动中选择恰当的驱动程序来建立连接,其中该方法的String类型参数URL通常称为JDBCURL,即JDBC连接字符串,在连接字符串中,需要指明所使用的数据库的类型、数据库的位置和数据库的名字。其格式如下:protocol:subprotoc