《Java语言程序设计》课件第11章_第1页
《Java语言程序设计》课件第11章_第2页
《Java语言程序设计》课件第11章_第3页
《Java语言程序设计》课件第11章_第4页
《Java语言程序设计》课件第11章_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

11.1JDBC数据库编程

11.2JavaDB嵌入数据库

11.3小结

11.4习题

Java数据库类层次图见图11-1。

Java对数据库的操作全部集成在java.sql包中,java.sql还包含连接、状态集、结果集、数据和异常处理几个子类,同时还有一个javax.sql的扩展包,包含三个子类,即DataSource、RowSet和Event,以实现和Microsoft的ADO相类似的数据库处理。11.1JDBC数据库编程图11-1Java数据库类层次图11.1.1JDBC基础

1.ODBC

在了解JDBC之前,我们先来了解一下ODBC。ODBC即OpenDatabaseConnectivity,是Microsoft为了实现各种异构数据库的连接而推出的一个开放的数据库连接标准。ODBC一般提供以应用编程接口API来实现数据库的编程。ODBC包含四个部分,即应用程序Application、驱动程序管理器DriverManager、驱动程序Driver和数据源DataSource,它们分别完成不同的功能。其中,Application主要完成程序对数据库的各种操作,提交SQL语句,并返回结果集;DriverManager主要给Application装载所对应的驱动程序;Driver负责与具体的数据库交互,实现程序对数据库的各种操作;DataSource主要包括与数据库相关联的数据库管理系统DBMS以及网络平台。

2. JDBC的概念

JDBC(JavaDatabaseConnectivity)是Java数据库的连接标准,是一个独立于数据库管理系统的、通用的SQL数据库存取和操作的公共接口,它定义了用来访问数据库的标准Java类库,使用该类库可以以一种标准的方法方便地访问数据库资源。

JDBC屏蔽了对数据库访问的一些细节,使得应用程序编程人员可以使用JDBC连接来访问任何一种提供了JDBC驱动的数据库系统,而编程人员无需了解各种数据库的细节,从而简化了软件的研发过程。

JDBC的结构与ODBC类似,包含两个层次:面向应用的API和面向数据库的API。面向应用的API提供数据库的接口,主要供应用程序编程人员使用,完成连接数据库、操作数据库和得到结果集。面向数据库的API,即JavaDriverAPI,主要是给数据库厂商开发数据库驱动使用。与JDBC四个部分相比,JDBC少了数据源这个部分,而是直接在应用程序中加载驱动程序来连接数据库。JDBC的结构如图11-2所示。图11-2JDBC结构图

3. JDBC术语

● DriverManager(java.sql.DriverManager):装载驱动程序,管理应用程序与驱动程序之间的连接。

● Driver(由驱动程序开发商提供):将应用程序的API请求转换为特定的数据库请求。

● Connection(java.sql.Connection):将应用程序连接到特定的数据库。

● Statement(java.sql.Statement):在一个给定的连接中,用于执行一个静态的数据库SQL语句。

● ResultSet(java.sql.ResultSet):SQL语句执行完后,返回数据结果集(包括行、列)。

● Metadata(java.sql.DatabaseMetadata;java.sql.ResultSetMetadata):元数据。11.1.2驱动程序

JDBC供支持四种类型的驱动程序:Type1——JDBC-ODBC驱动、Type2——本地API部分Java驱动、Type3——JDBC-NET纯Java驱动和Type4——本地协议纯Java驱动。

JDBC-ODBC驱动:由SUN公司在J2SDK中直接提供sun.jdbc.odbc.JdbcOdbcDriver的驱动,应用程序通过JDBC-ODBC访问ODBC,ODBC通过自己的驱动程序再去与数据库交互。这种方式必须先配置ODBC,且数据库能够提供ODBC的驱动程序,一般大多应用在MicrosoftWindows平台上的一些应用程序中。本地API部分Java驱动:由本地API驱动把JDBC的命令转换为特定数据库系统的本地库的方式。与Type1类似,须先安装特定库的非Java的方法,如DLL文件。

JDBC-NET纯Java驱动:首先将JDBC的操作数据库的命令转换为与数据库无关的网络协议,并发送给中间服务器,然后中间服务器再将与数据库系统无关的网络协议转换为特定数据库系统的协议,并发送给数据库系统;数据库系统返回的结果先发送给中间服务器,再由中间服务器传递给应用程序。

本地协议纯JAVA驱动:这是一种纯Java的程序的驱动,它直接将JDBC的命令转换为数据库本地协议。其优点是没有中间层,一般用于提高访问数据库性能时的环境。

上述四种驱动的结构如图11-3所示。图11-3JDBC四种驱动方式11.1.3JDBC编程

要实现JDBC编程,必须按照JDBC的执行过程来实现对数据库的访问。首先我们来了解JDBC的执行过程。

1. JDBC执行过程

JDBC执行时首先加载所需要的类(java.sql包),然后加载JDBC驱动程序,识别数据源后创建连接对象和结果集对象,然后以结果集对象Statement运行查询,最后将查询结果返回到结果集ResultSet,运行完后关闭结果集,并关闭状态集和连接对象。JDBC执行过程如图11-4所示。图11-4JDBC执行过程完成JDBC主要有以下四个步骤:

(1)加载驱动程序,以语句Class.forName(“driverName”)来实现。

(2)打开数据库连接,以语句DriverManager.getConnection(“jdbc:xxx:datasource”)来

实现。

(3)创建状态集并执行SQL语句,以语句stmt = con.createStatement()和stmt.executeQuery("Select*fromanyTable")来实现。

(4)查看结果集,以语句while(rs.next()){field1name=rs.getString(“field1name”);

fiield2name=rs.getInt(“field2name”);…}来实现。

在下面示例中,我们也是按照这个步骤来完成JDBC对数据库的访问的。

2.加载驱动

在JDBC编程时,通常有三种方式来加载驱动程序:

●利用System类的静态方法setProperty(),如System.setProperty(“jdbc.drivers”,

“sun.jdbc.odbc.JdbcOdbcDriver”)。

●利用Class类的静态方法forName(),如Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”),

Class.forName(“oracle.jdbc.driver.OracleDriver”)。

●直接创建一个驱动程序对象,如newsun.jdbc.odbc.JdbcOdbcDriver()。

3.连接对象

创建连接对象时,应用DriverManager类的静态方法getConnection()来获得特定数据库的实例对象。如Connectionconn=DriverManager.getConnection(source)或Connectionconn=DriverManager.getConnection(source,user,pass),其中参数user、pass和source都是String类型的字符串,user为数据库的连接用户名,pass为数据库连接用户的口令,source随连接数据库的不同而不同,一般语法为

jdbc:driverType:dataSource前面jdbc固定,后面分别为驱动类型和数据源。如采用JDBC-ODBC桥时,driverType为“ODBC”,dataSource为“jdbc:odbc:DSNName”(DSNName为ODBC的数据源名称)。驱动类型不同,driverType和dataSource都会随之变化。

连接对象应用getAutoCommit()和setAutoCommit()方法可以获取事务处理自动提交的标志和设置事务处理自动提交标记;应用commit()方法可以将事务过程提交;应用rollback()方法可以将提交的事务实施回滚;应用getMetaData()方法可以创建一个DatabaseMetadata对象;通过DatabaseMetadata的getDatabaseProductName()方法、getDatabaseProductVersion()方法和getDriverName()方法可以获取数据库厂商、版本及每个数据表的名称和数量等信息。

4.状态集

JDBC通过Statement状态集的exceute来执行SQL语句,因此在执行SQL语句前须创建状态集对象Statement,一般应用Connetcion对象的createStatement()方法来创建一个Statement实例对象,如state=conn.CreatStatement()创建了一个对象名为state的状态集对象。

Statement对象的方法有:excuteBatch()方法用于执行数据库的批处理命令;

executeUpdate(Stringsql)、executInsert(Stringsql)和executeDelete(Stringsql)方法用于返回一个整形值,表明执行了修改、插入或删除记录的条数。

Statement对象还可由execute(Stringsql)来直接执行SQL语句。

JDBC中有三种状态集,即Statement、PreparedStatement和CallableStatement。Statement常用于执行比较简单的操作;PreparedStatement用于执行参数变化的操作;CallableStatement用于执行定义在数据库当中的存储过程,并获取执行结果。

PreparedStatement类继承了Statement类,在它的对象中可以用“?”代替多个待定义参数,这些参数将在提交数据库系统执行之前,由PreparedStatement对象的setXXX方法进行设置,如:

PreparedStatementpstmt=con.PreparedStatement;

(“Select*fromtablewherename=?AndID=?”);

pstmt.setString(“John”);

pstmt.setInt(1234556);

PreparedStatement执行速度要快于Statement。

CallableStatement类也是继承Statement类,用于执行数据库系统当中定义的存储过程,一般调用的方式如下:

{result=CallProcedureName[(?,?,…)]}

创建CallableStatement对象可采用如下方法:

CallableStatementcstmt=con.prepareCall(“{call

procedure(?,?,?)}")

cstmt=setFloat(1,123.456f);

cstmt=registerOutparameter(2,java.sql.Types.DECIMAL);

cstmt.setInt(3,500);

cstmt.registerOutParameter(3,java.sql.Types.INTEGER);

5.结果集

方法ResultSetexecuteQuery(Stringsql)执行一个SQL的查询语句后,将结果返回给一个ResultSet的结果集对象。通过结果集对象的一些方法,我们就可以获得查询结果。ResultSet对象一般定位于第一个结果记录,通过rs对象的next()、previous()、afterLast()、beforeFirst()方法可以实现记录的向后、向前移动一个位置,向记录集末尾和头位置移动;应用absolute()方法可以获取当前光标位置;deleteRow、insertRow可以执行删除记录集中的行和在记录集中插入的行;应用getXXX()和updateXXX()方法可以获取或更新与字段类型匹配的字段的值。

常用结果集的获取方法如表11-1所示。表11-1结果集常用的获取方法另外,通过ResultSetMetadata可以获取查询结果的元数据的一些信息。

如ResultSetMetadatarsm=rs.getMetadata(),则将一些元数据的信息返回至rsm对象中,通过ResultSetMetadata的getColumnCount()、getColumnName(inti)、getColumnType(inti)和getTableName()方法可以知道字段数量、字段名称、字段类型和表名。11.1.4JDBC示例

下面我们以访问“学生基本信息表”为例来说明JDBC如何访问数据库。

例11-1在JDBC-ODBC驱动的方式下,Access的驱动程序由ODBC提供,访问的数据源DSN为当前的StudentInfo.mdb的Access数据库文件,也可以在Windows系统的“控制面板/管理工具/数据源ODBC”中配置DSN数据源。例11-2以SQLServer2000为例说明JDBC对数据库的访问,加载的驱动为“com.microsoft.jdbc.sqlserver.SQLServerDriver”,由第三方即Microsoft公司提供。需要说明的是,此驱动在JDK并没有默认安装,需要在网络上下载并安装。

SQLServer2000DriverforJDBC下载可在Microsoft下载站中查找:

/downloads/detaills.aspx?FamilyID=0728B11-0502-461A-B138-2AA54BFDC03A&dsplaylang=en下载后需解压缩三个文件:mssqlserver.jar、msutil.jar和msbase.jar,将这三个文件拷贝至Java安装目录%JAVA_HOME%\lib的目录下,然后设置classpath,使classpath指向这三个文件,即运行setclasspath=.;%JAVA_HOME%\lib\mssqlserver.jar;%JAVA_HOME%\lib\

msutils.jar;%JAVA_HOME%\lib\msbase.jar;,或在“环境变量”中设置classpath的值。

需要注意的是,有时因为SQLServer的1433端口未开放,所以执行程序会出现异常,建议安装SQLServer的SP3的补丁包。

例11-1和例11-2运行的结果相同,其结果如图11-5所示。图11-5JDBC访问数据库【例11-1】以JDBC-ODBC驱动的方式访问数据库。

importjava.sql.*;

importjavax.swing.JOptionPane;

importjava.io.*;

publicclassJDBCAccess

{publicstaticvoidmain(Stringargs[])

{

try{ Stringstrurl="jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};DBQ=StudentInfo.mdb";

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Connectionconn=DriverManager.getConnection(strurl);

Statementstmt=conn.createStatement();

ResultSetrs=stmt.executeQuery("select*fromStudentInfoorderbyid");

while(rs.next())

{JOptionPane.showMessageDialog(null,"学号:"+rs.getString("ID")+

"姓名:"+rs.getString("name")+"年龄:"+

rs.getString("age")+"\n性别:"+rs.getString("sex")+

"系部:"+rs.getString("department")+

"班级:"+rs.getString("class"),"记录信息",

JOptionPane.INFORMATION_MESSAGE);

}

}

catch(Exceptione){System.out.println(e);}

}

}【例11-2】以SQLServer2000为例说明JDBC对数据库的访问。

importjava.sql.*;

importjavax.swing.JOptionPane;

importjava.io.*;

publicclassJDBCAccess

{

publicstaticvoidmain(Stringargs[])

{

try

{ Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();

Stringurl="jdbc:microsoft:sqlserver://SrvName:1433;DatabaseName=StudentInfo";

Connectionconn=DriverManager.getConnection(url,"sa","");

Statementstmt=conn.createStatement();

ResultSetrs=stmt.executeQuery("select*fromStudentInfoorderbyid");

while(rs.next()) {JOptionPane.showMessageDialog(null,"学号:"+rs.getString("ID")+"姓名:"+

rs.getString("name")+"年龄:"+rs.getString("age")+

"\n性别:"+rs.getString("sex")+"系部:"+

rs.getString("department")+"班级:"+rs.getString("class"),

"记录信息",JOptionPane.INFORMATION_MESSAGE);

}

}

catch(Exceptione){System.out.println(e);}

}

}在J2SE1.6版本中,SUN公司集成了基于完全Java技术实现的源码开放的数据库JavaDB(见J2SDK安装目录之DB子目录)。JavaDB实际上是ApacheDerby,初期由Cloudscape、Informix和IBM公司共同所有,后来IBM将其源码捐赠给Apache作为开源项目,得到了SUN公司及其他个人的扩展,功能日趋完善。JavaDB不仅与J2SDK实现了绑定,同时在SUN的其他产品,诸如SunJavaEnterpriseSystem和SunJavaSystemApplicationServer产品中也实现了绑定。在NetBeansIDE5.0中也实现了对JavaDB的支持。11.2JavaDB嵌入数据库

JavaDB是一个只有2MB的轻量级数据库,可以嵌入到各种Java的应用程序中作为桌面数据库来使用。它支持存储过程,支持触发器和SQL语句,功能极其完备。

JavaDB与J2SDK1.6直接绑定,安装后J2SDK安装目录下将出现“DB”的子目录。如果用户使用低版本的J2SDK,则需在Apache网站上下载ApacheDerby,下载后直接安装即可。使用JavaDB,其步骤同其他数据库基本相似,首先要装载驱动。JavaDB的JDBC驱动集成在derby.jar文件中,无需再下载任何驱动。装载采用Class.forName的方法,驱动名称为org.apache.derby.jdbc.EmbeddedDriver。如果不使用嵌入数据库模式加载,驱动还可以选择其他方式,如采用Client/Server模式或IBMDB2JDBCUniversalDriver的驱动加载。完整的加载语句如Class.forName("org.apache.derby.jdbc.EmbeddedDriver")。加载驱动后就要建立数据库的连接。JDBC连接可定义一个独立的数据库,并允许启动、停止、复制或删除数据库。JDBC连接时要定义URL字符串和一组属性值,使用jdbc:derby:<dbName>[propertyList],其中dbName为数据库名,propertyList为属性列表,诸如连接的用户名和口令等。若要建立连接并创建一个名为MySimpDB的数据库,则有

Connectionconn=DriverManager.getConnection(“jdbc:derby:MySimpDB;create=true;user=

user1;password=user1")。常见的属性有:creat=true/false,标明数据库是否是新创建模式;databaseName=dbName,标明数据库的名称;user=username,标明连接数据库的用户名;password=userPassword,标明连接数据库用户的口令;shutdown=true/false,标明数据库是否为关闭模式。

连接数据库时,若数据库存在,则建立连接对象;若creat属性值为true,则创建数据库。创建数据库时,若只创建数据库文件而没有创建表,则应当调用Creattable的SQL语句来创建用户表。例如,完成数据库的创建后,建立状态集statement,然后调用“CreatTable”的SQL语句:

Statements=conn.createStatement();

s.execute(“createtableStudentInfo(idint,namevarchar(12),sexvarchar(2),ageint,departmentvarchar(16),classvachar(16)”);

即可创建一个学生基本信息的用户表。

一旦用户信息表建立后,我们就可以对数据表中的信息进行新增、删除、修改等操作,只需调用不同的SQL语句即可。【例11-3】使用JavaDB。

importjava.sql.*;

importjavax.swing.JOptionPane;

publicclassMyDerby

{publicStringframework="embedded";

publicStringdriver="org.apache.derby.jdbc.EmbeddedDriver";

publicStringprotocol="jdbc:derby:";

publicstaticvoidmain(String[]args)

{newMyDerby().go(args);}voidgo(String[]args)

{parseArguments(args);

System.out.println("应用程序工作于"+framework+"模式");

try

{Class.forName(driver).newInstance();

System.out.println("完成装载数据库驱动");

Connectionconn=DriverManager.getConnection(protocol+"MySimpDB;create=true;

user=user1;password=user1");System.out.println("连接并创建数据库MySimpDB");

conn.setAutoCommit(false);

Statements=conn.createStatement();

s.execute("DroptableStudentInfo");

s.execute("createtabletempDB(numint,addrvarchar(40))");

s.execute("createtableStudentInfo(idint,namevarchar(12),sexvarchar(2),ageint,

departmentvarchar(16),classvarchar(16))");System.out.println("完成创建用户表StudentInfo");

s.execute("insertintoStudentInfovalues(20070101,'张三','男',20,'机械学院','机制07-2')");

System.out.println("新增'张三'记录");

s.execute("insertintoStudentInfovalues(20070102,'李四','男',20,'数信学院','机制07-1')");

System.out.println("新增'李四'记录");

s.execute("updateStudentInfosetage=18,department='电信学院'wherename='张三'");

System.out.println("完成修改'张三'记录");s.execute("updateStudentInfosetsex='女',class='软件07-2'wherename='李四'");

System.out.println("修改'李四'记录完成");

ResultSetrs=s.executeQuery("SELECT*FROMStudentInfoORDERBYid");

while(rs.next())

{JOptionPane.showMessageDialog(null,"学号:"+rs.getString("ID")+"姓名:"+rs.getString("name")+"年龄:"+rs.getString("age")+

"\n性别:"+rs.getString("sex")+

"系部:"+rs.getString("department")+

"班级:"+rs.getString("class"),"记录信息",

JOptionPane.INFORMATION_MESSAGE);

}s.execute("droptabletempDB");

System.out.println("删除表tempDB");

rs.close();

s.close();

System.out.println("关闭记录集和状态集");

mit();

conn.close();

System.out.println("执行事务,关闭连接");

booleangotSQLExc=false;

if(framework.equals("embedded")){try

{DriverManager.getConnection("jdbc:derby:;shutdown=true");}

catch(SQLExceptionse)

{gotSQLExc=true;}

if(!gotSQLExc)

{System.out.println("数据库没有正常关闭!");}

else

{System.out.println("数据库已经关闭");}

}}

catch(Throwablee){System.out.println("exceptionthrown:");

if(einstanceofSQLException)

{printSQLError((SQLException)e);}

else

{e.printStackTrace();}}

System.out.println("演示示例成功完成");}

staticvoidprintSQLError(SQLExceptione)

{while(e!=null)

{System.out.println(e.toString());e=e.getNextException();}}

privatevoidparseArguments(String[]args)

{intlength=args.length;

for(intindex=0;index<length;index++)

{if(args[index].equalsIgnoreCase("jccjdbcclient"))

{framework="jccjdbc";

driver

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论