第16讲利用JDBC实现Java程序与数据库的连接16.1JDBC概述16.2JDBC驱动程序16.3JDBC常用类与方法16.4数据库访问过程本章要点了解JDBC的基本概念了解JDBC的几种常用驱动程序了解JDBC的常用类与方法,掌握在与数据库连接经常使用的类与法掌握JDBC访问数据库的基本方法16.1JDBC概述Java定义了一个通用的SQL数据库存取框架,在各种各样的数据库连接模块上提供统一的界面,使与数据库无关的Java工具和产品成为可能,使得数据库连接的开发者可以提供各种各样的连方案。这一通用的SQL数据库存取框架就是JDBC。JDBC的设计者以X/openSQLCallLevelInterface(调用层接口)做为API的基础,它也是Microsoft'sODBC(开放数据库互连)的基础。16.2JDBC应用与数据库建立连接,发送SQL语句,处理结果。Connectioncon=DriverManager.getConnection(jdbc:odbc:wombat,login,password);Statementstmt=con.createStatement();ResultSetrs=stmt.executeQuery(SELECTa,b,cFROMTable1);while(rs.next())System.out.println(rs.getString(a)++rs.getString(b)++rs.getString(c));JDBC是一种低级API,是高级API的基础16.3两层模型和三层模型JDBCAPI既支持数据库访问的两层模型,同时也支持三层模型。在两层模型中,Javaapplet或应用程序将直接与数据库进行对话。这将需要一个JDBC驱动程序来与所访问的特定数据库管理系统进行通讯。用户的SQL语句被送往数据库中,而其结果将被送回给用户。数据库可以位于另一台计算机上,用户通过网络连接到上面。这就叫做客户机/服务器配置,其中用户的计算机为客户机,提供数据库的计算机为服务器。网络可以是Intranet(它可将公司职员连接起来),也可以是Internet。在三层模型中,命令先是被发送到服务的“中间层”,然后由它将SQL语句发送给数据库。数据库对SQL语句进行处理并将结果送回到中间层,中间层再将结果送回给用户。MIS主管们都发现三层模型很吸引人,因为可用中间层来控制对公司数据的访问和可作的的更新的种类。中间层的另一个好处是,用户可以利用易于使用的高级API,而中间层将把它转换为相应的低级调用。最后,许多情况下三层结构可提供一些性能上的好处。16.2.3JDBC产品有关最新的信息,请查阅JDBC的网站,可通过从以下URL开始浏览找到:框架JavaSoft提供三种JDBC产品组件,它们是Java开发工具包(JDK)的组成部份:JDBC驱动程序管理器,JDBC驱动程序测试工具包,和JDBC-ODBC桥。2JDBC驱动程序的类型JDBC-ODBC桥加ODBC驱动程序:JavaSoft桥产品利用ODBC驱动程序提供JDBC访问。本地API-部份用Java来编写的驱动程序JDBC网络纯Java驱动程序本地协议纯Java驱动程序16.3JDBC常用类与方法之一1、DriverManager类:负责管理JDBC驱动程序。使用JDBC驱动程序之前,必须先将驱动程序加载并向DriverManager注册后才可以使用,同时提供方法来建立与数据库的连接。方法:A、Class.forName(Stringdriver);//加载注册驱动程序B、StaticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)throwsSQLException;//取得对数据库的连接C、StaticDrivergetDriver(Stringurl)throwsSQLExcetion;//在已经向DriverManager注册的驱动程序中寻找一个能够打开url所指定的数据库的驱动程序16.3JDBC常用类与方法之二2、Connection类负责维护JSP/JAVA数据库程序和数据库之间的联机。可以建立三个非常有用的类对象。方法:A、StatementcreateStatement()throwsSQLException;//建立Statement类对象StatementcreateStatement(intresultSetType,intresultSetConcurrency)throwsSQLException;//建立Statement类对象resultSetType值TYPE_FORWARD_ONLY结果集不可滚动TYPE_SCROLL_INSENSITIVE结果集可滚动,不反映数据库的变化TYPE_SCROLL_SENSITIVE结果集可滚动,反映数据库的变化resultSetConcurrency值CONCUR_READ_ONLY不能用结果集更新数据CONCUR_UPDATABLE能用结果集更新数据JDBC2.0中才支持滚动的结果集,而且可以对数据进行更新B、DatabaseMetaDatagetMetaData()throwsSQLException;//建立DatabaseMetaData类对象C、PreparedStatementprepareStatement(Stringsql)throwsSQLException;//建立PreparedStatement类对象D、booleangetAutoCommit()throwsSQLException//返回Connection类对象的AutoCommit状态E、voidsetAutoCommit(booleanautoCommit)throwsSQLException//设定Connection类对象的AutoCommit状态F、voidcommit()throwsSQLException//确定执行对数据库新增、删除或修改记录的操作G、voidrollback()throwsSQLException//取消执行对数据库新增、删除或修改记录的操作H、voidclose()throwsSQLException//结束Connection对象对数据库的联机I、booleanisClosed()throwsSQLException//测试是否已经关闭Connection类对象对数据库的联机16.3JDBC常用类与方法之三3、Statement类通过Statement类所提供的方法,可以利用标准的SQL命令,对数据库直接新增、删除或修改操作方法:A、ResultSetexecuteQuery(Stringsql)throwsSQLException//使用SELECT命令对数据库进行查询B、intexecuteUpdate(Stringsql)throwsSQLException//使用INSERT\DELETE\UPDATE对数据库进行新增、删除和修改操作。C、voidclose()throwsSQLException//结束Statement类对象对数据库的联机16.3JDBC常用类与方法之四4、PreparedStatement类PreparedStatement类和Statement类的不同之处在于PreparedStatement类对象会将传入的SQL命令事先编好等待使用,当有单一的SQL指令比多次执行时,用PreparedStatement类会比Statement类有效率方法:A、ResultSetexecuteQuery()throwsSQLException//使用SELECT命令对数据库进行查询B、intexecuteUpdate()throwsSQLException//使用INSERT\DELETE\UPDATE对数据库进行新增、删除和修改操作。C、ResultSetMetaDatagetMetaData()throwsSQLException//取得ResultSet类对象有关字段的相关信息D、voidsetInt(intparameterIndex,intx)throwsSQLException//设定整数类型数值给PreparedStatement类对象的IN参数E、voidsetFloat(intparameterIndex,floatx)throwsSQLException//设定浮点数类型数值给PreparedStatement类对象的IN参数F、voidsetNull(intparameterIndex,intsqlType)throwsSQLException//设定NULL类型数值给PreparedStatement类对象的IN参数G、voidsetString(intparameterIndex,Stringx)throwsSQLException//设定字符串类型数值给PreparedStatement类对象的IN参数H、voidsetDate(intparameterIndex,Datex)throwsSQLException//设定日期类型数值给PreparedStatement类对象的IN参数I、voidsetTime(intparameterIndex,Timex)throwsSQLException//设定时间类型数值给PreparedStatement类对象的IN参数16.3JDBC常用类与方法之五5、DatabaseMetaData类DatabaseMetaData类保存了数据库的所有特性,并且提供许多方法来取得这些信息。方法:A、StringgetDatabaseProductName()throwsSQLException//取得数据库名称B、StringgetDatabaseProductVersion()throwsSQLException//取得数据库版本代号C、StringgetDriverName()throwsSQLException//取得JDBC驱动程序的名称D、StringgetDriverVersion()throwsSQLException//取得JDBC驱动程序的版本代号E、StringgetURL()throwsSQLException//取得连接数据库的JDBCURLF、StringgetUserName()throwsSQLException//取得登录数据库的使用者帐号16.3JDBC常用类与方法之六6、ResultSet类负责存储查询数据库的结果。并提供一系列的方法对数据库进行新增、删除和修改操作。也负责维护一个记录指针(Cursor),记录指针指向数据表中的某个记录,通过适当的移动记录指针,可以随心所欲的存取数据库,加强程序的效率。方法:A、booleanabsolute(introw)throwsSQLException//移动记录指针到指定的记录B、voidbeforeFirst()throwsSQLException//移动记录指针到第一笔记录之前C、voidafterLast()throwsSQLException//移动记录指针到最后一笔记录之后D、booleanfirst()throwsSQLException//移动记录指针到第一笔记录E、booleanlast()throwsSQLException//移动记录指针到最后一笔记录F、booleannext()throwsSQLException//移动记录指针到下一笔记录G、booleanprevious()throwsSQLException//移动记录指针到上一笔记录H、voiddeleteRow()throwsSQLException//删除记录指针指向的记录I、voidmoveToInsertRow()throwsSQLException