第13章Java数据库连接--JDBCJDBC概述JDBC的类型JDBC主要的接口和核心类JDBC进行数据库操作的步骤使用JDBC进行常用数据操作13.1JDBC概述利用Java编程语言访问数据库是通过JDBC——JavaDatabaseConnectivity,即Java数据库连接机制实现的。JDBC是一种Java数据库连接API(ApplicationProgrammingInterface:应用编程接口),它为Java程序员提供了一种在Java代码中访问关系数据库的标准方法。JDBC定义了一组API对象和方法用于同基本数据库进行交互。JDBCAPI、数据库驱动程序与数据库之间的关系13.2JDBC的类型类型1:JDBC-ODBC桥类型2:Native-APIBridge类型3:JDBC-middleware类型4:PureJavaDriver13.2.1类型1:JDBC-ODBC桥JDBC.ODBC桥是一个JDBC驱动程序,它通过将JDBC操作转换为ODBC操作来实现。对ODBC,它像是通常的应用程序,桥为所有对ODBC可用的数据库实现JDBC。它作为sun.jdbc.odbc包实现,其中包含一个用来访问ODBC的本地库。桥是由intersolv与javasoft联合开发的。由于ODBC被广泛地使用,该桥的优点是让JDBC能够访问几乎所有的数据库。桥支持ODBC2.x,这是当前大多数据ODBC驱动程序支持的版本。桥作为包sun.jdbc.odbc与JDK一起自动安装,无需特殊配置。通过ODBC子协议,使用URL打开JDBC连接即可使用桥。建立连接前,必须将桥驱动程序类sun.jdbc.odbc.jdbcodbcdriver添加到名为jdbc.drivers的java.lang.system属性中,或用java类加载器将其显式地加载。可以用以下语句进行桥的显式加载:class.forname(sun.jdbc.odbc.jdbcodbcdriver);加载时,ODBC驱动程序(与所有JDBC驱动程序一样)将创建它自己的实例,同时在JDBC驱动程序管理器进行注册。桥驱动程序使用ODBC子协议。该子协议的URL为以下的形式:jdbc:odbc:[=]*例如:jdbc:odbc:sybasejdbc:odbc:mydb;uid=me;pwd=secretjdbc:odbc:ora123;cachesize=300用户的计算机上必须事先安装好ODBC驱动程序,Type1驱动程序利用桥接(Bridge)方式,将JDBC的调用方式转换为ODBC驱动程序的调用方式,如图13-2所示,MicrosoftAccess数据库存取就是使用这种类型。13.2.2类型2:Native-APIBridgeType2驱动程序利用桥接方式,驱动程序上层封装Java程序以与Java应用程序作沟通,将JDBC调用转为本地(Native)程序代码的调用,下层为本地语言(就像C、C++)来与数据库进行沟通,下层的函数库是针对特定数据库设计的,不像Type1可以对ODBC架构的数据库进行存取,如图13-3所示。13.2.3类型3:JDBC-middleware通过中间件(middleware)来存取数据库,用户不必安装特定的驱动程序,而是调用中间件,由中间件来完成所有的数据库存取动作,然后将结果返回给应用程序,如图13-4所示。13.2.4类型4:PureJavaDriver使用纯Java程序来编写驱动程序与数据库进行沟通,而不通过桥接或中间件来存取数据库,如图13-5所示。13.3JDBC主要的接口和核心类JDBC由一组Java类库和接口库组成,涉及到的Java标准包包括java.sql.*和javax.sql.*。一般的数据库厂商如Oracle,Microsoft,MySQL等,都会提供专用的JDBC数据库驱动程序(一组符合JDBC标准规范的API),以简化开发。各种JDBC驱动程序可到数据库厂商的网站下载。完整的JDBC体系结构如图13-6所示。1.Driver接口每个JDBC数据库驱动程序都会提供Driver接口供应用程序调用,此外,在使用Driver接口前,Java程序必须使用import语句导入java.sql.*包。在Java程序开发中如果要连接数据库,必须先加载数据库厂商提供的数据库驱动程序。不同类型的JDBC数据库驱动程序在编程时的加载方法也不同。如果使用JDBC驱动程序,可以这样加载:Class.forName(jdbcdriver_classname).newInstance();如,对MySQL数据库,加载语句如下:Class.forName(com.mysql.jdbc.Driver).newInstance();如果使用JDBC/ODBC桥驱动程序,可以这样加载:Class.forName(sun.jdbc.odbc.JdbcOdbcDriver).newInstance();加载完成后即可使用该JDBC驱动程序。2.DriverManager类DriverManager类是驱动程序管理类,负责管理JDBC驱动程序。使用JDBC驱动程序之前,必须先将驱动程序加载并向DriverManager注册后才可以使用,同时提供方法来建立与数据库的连接。DriverManager类提供的getConnection函数所返回的Connection接口类十分重要,大部分数据库编程工作都要通过Connection接口类中提供的各类函数才能进行。如下面的代码:Stringurl=jdbc:mysql://localhost/+dbName+?user=+userName+&password=+userPwd;Connectionconn=DriverManager.getConnection(url);3.Connection类负责维护Java应用程序和数据库之间的联机。Connection类经常使用的函数如下:voidcommit():执行对数据库新增、删除或修改记录的操作。voidclose():关闭到数据库的连接,结束Connection对象对数据库的联机,SQL操作完毕后必须关闭连接,以免浪费系统资源。booleanisClosed():测试是否已经关闭Connection类对象对数据库的联机。voidrollback():取消执行对数据库新增、删除或修改记录的操作。StatementcreateStatement():建立一个Statement类实例,用来执行SQL操作。StatementcreateStatement(intresultSetType,intresultSetConcurrency):建立一个Statement类实例,并产生指定类型的结果集ResultSet。4.Statement类对数据库的具体操作需要通过Statement类、PreparedStatemen类(继承Statement类)或CallableStatement类(继承PreparedStatemen类)来完成。Statement类提供了执行基本SQL语句的功能,PreparedStatemen类提供了SQL语句的预编译功能,因而可以显著提供SQL执行的性能。CallableStatement类从PreparedStatemen类继承而来,可以用来执行数据库中的存储过程。一般常用的是Statement类。通过Statement类所提供的方法,可以利用标准的SQL命令,对数据库直接进行新增、修改或删除操作。Connection接口类提供了生成Statement对象的函数,一般情况下,使用createStatement()函数就可以得到Statement的实例。Statement类提供了很多函数,常用的如下:ResultSetexecuteQuery(Stringsql):使用SELECT命令对数据库进行查询并返回ResultSet结果集。intexecuteUpdate(Stringsql):使用INSERT\DELETE\UPDATE对数据库进行新增、修改或删除操作。voidclose():结束Statement类对象和数据库之间的连接。5.PreparedStatement类PreparedStatement类和Statement类的不同之处在于PreparedStatement类对象会将传入的SQL命令事先编译好等待使用,当有单一的SQL指令多次执行时,用PreparedStatement类会比Statement类有效率。6.ResultSet类负责存储查询数据库的结果。并提供一系列的方法对数据库进行新增、修改或删除操作。也负责维护一个记录指针(Cursor),记录指针指向数据表中的某个记录,通过适当的移动记录指针,可以随心所欲的存取数据库,加强程序的效率。7.ResultSetMetaData类ResultSetMetaData类对象保存了所有ResultSet类对象中关于字段等元数据信息,并提供许多方法来取得这些信息。8.DatabaseMetaData类DatabaseMetaData类保存了关于数据库本身的所有元数据信息,并且提供许多方法来取得这些信息。13.4JDBC进行数据库操作的步骤利用JDBC进行数据库操作的前提是导入java.sql.*。下面以连接MySQL数据库进行操作为例,介绍一下主要步骤:(1)加载MySQL驱动程序,代码如下:Class.forName(com.mysql.jdbc.Driver).newInstance();调用Class.forName将自动加载驱动程序类。加载Driver类后,即可用它们来与数据库建立连接。(2)建立Connection连接对象(通过驱动管理器)第二步就是用适当的驱动程序类与MySQL建立一个连接。代码如下:Stringurl=jdbc:mysql://localhost/+dbName+?user=+userName+&password=+userPwd;Connectionconn=DriverManager.getConnection(url);其中连接字符串url中的dbName,userName和userPwd三个变量分别代表数据库名称,MySQL的用户名和密码。(3)建立Statement语句对象(通过Connection对象进行创建)Statementst=con.createStatement();(4)执行sql语句建立Statement语句对象之后,就可以通过Statement对象st来执行sql语句了。例如:st.executeUpdate(sql语句);(5)关闭连接con.close();注意:执行完数据库相关操作后,切记一定要通过相关对象的close()方法显式关闭和数据库的连接。原因在于Java中所有JDBC连接对象无法通过Java的自动回收机制释放占用的内存,因此应用运行时间长以后,内存消耗会越来越大,造成不必要的性能隐患。通过JDBC开发的应用程序中,显式的关闭和数据库的连接释放对象占用内存,是必不可少的步骤。13.5使用JDBC进行数据操作前面介绍了JDBC相关的接口和核心类,也了解使用JDBC进行数据库开发的基本步骤,接下来看看如何使用JDBC做数据库基本操作,例如数据的新增、查询等操作,在本小节中,也将简单了解一下事务(Transaction)的基本概念与操作。13.5.1建立一个数据源类Connection对象是数据库连接的具体代表对象。一个Connection对象就代表一个数据库连接,要连接数据库,可以向java.sql.DriverManager要求,使用DriverManager的getConneciton()方法,指定JDBCURL作为自变量,获得java.sql.Connection对象