《Web开发技术》课件第8章.ppt

上传人(卖家):momomo 文档编号:8102767 上传时间:2024-11-28 格式:PPT 页数:67 大小:637.50KB
下载 相关 举报
《Web开发技术》课件第8章.ppt_第1页
第1页 / 共67页
《Web开发技术》课件第8章.ppt_第2页
第2页 / 共67页
《Web开发技术》课件第8章.ppt_第3页
第3页 / 共67页
《Web开发技术》课件第8章.ppt_第4页
第4页 / 共67页
《Web开发技术》课件第8章.ppt_第5页
第5页 / 共67页
点击查看更多>>
资源描述

1、第8章eb应用数据库接口8.1 数据库访问接口数据库访问接口8.2 JDBC API主要接口和类主要接口和类8.3 访问数据库的步骤和脚本实现访问数据库的步骤和脚本实现8.4 Web应用访问数据库实例应用访问数据库实例 习题习题 8.1 数据库访问接口数据库访问接口根据图7.1所示的Web服务器端编程模型可知,Web应用系统的数据主要存储在数据库系统中,通过数据库访问接口进行访问。数据库系统的管理和维护由数据库系统管理员(DBA)来进行,数据的安全性得到了保证。常用的各种关系型数据库系统有SQL Server、MySQL、Oracle、DB2等。当客户系统与数据库系统建立通信连接后,就可以采用

2、标准SQL语句访问数据库了。各厂家都实现了自己的数据库系统驱动程序,可完成与客户系统通信、SQL命令的解释和执行等功能,这样的数据库驱动程序称为一级数据库驱动程序(底层驱动程序)。实际应用中,为了适应数据库系统变更后程序移植的简单性,Sun公司开发了高层数据库访问接口JDBC(Java Database Connectivity),此接口对不同的数据库系统进行了高层抽象和封装,提供一个统一的访问数据库接口,开发人员可以使用此接口在更高层次访问各种类型的数据库系统。开发人员通过类库来使用此接口,类库共包含java.sql、javax.sql两个包,在程序源代码中使用import指令导入类库。使用

3、JDBC API访问各种类型的数据库系统图如图8.1所示。图8.1 使用JDBC API访问各种类型的数据库系统图 8.2 JDBC API主要接口和类主要接口和类JDBC API提供了建立数据库连接、释放数据库连接、发送SQL命令语句、接收SQL执行结果集等功能的接口和类。最常使用的接口和类是Driver接口、DriverManager类、Connection接口、Statement接口、PreparedStatement 接口、CallableStatement接口、ResultSet 接口。下面逐一介绍这些接口和类的使用方法。(1)Driver接口。每一个具体的Driver类必须实现该D

4、river接口。每一个驱动程序应该提供一个实现该接口的类。(2)DriverManager类。DriverManager类会试着装载它能够发现的多个驱动程序。对于给定的连接请求,DriverManager类会轮流请求每个驱动程序去试着连接目标URL指定的数据库系统。每个实现Driver接口的Driver类代码应该简短、独立,这样可使Driver类能够在不带有大量的支持代码的情况下被装载和查询。这是实现该接口的驱动程序时需要注意的地方。当一个驱动类被装载时,它会创建一个自己的实例,并在DriverManager中注册。开发人员通过使用Class.forName(foo.bah.Driver);这

5、样的调用语句来实现装载和注册一个驱动。forName方法的参数为驱动程序类的字符串。装载和注册JDBC-ODBC Bridge驱动程序的语句是:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);装载和注册JDBC Driver驱动程序的语句是:Class.forName(“jdbc.driver_class_name”);例如:import java.sql.*;/load MS SQL Server DriverClass.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);/load My

6、SQL JDBC DriverClass.forName(org.gjt.mm.mysql.Driver);/load Oracle JDBC Driver Class.forName(“oracle.jdbc.driver.OracleDriver”);DirverManager类提供了一个管理JDBC驱动程序集的基本的服务类。在JDBC 2.0 API中,通过DataSource 接口提供了连接数据源的另外一种方法。使用DataSource对象是连接一个数据源的更好的方式。作为数据源初始化的一部分,DirverManager类会尝试装载在“jdbc.drivers”系统属性中提到的驱动类。

7、利用这种方式,允许用户通过应用程序定制多个JDBC驱动。应用程序可以在任何时候通过Class.forName(String strDriverClassName)语句显式地装载多个JDBC驱动程序。当DirverManager的getConnection()方法被调用时,DirverManager会从那些开始就装载的和使用相同的类装载器显式装载的驱动中尝试着本地化一个合适的驱动作为当前的Applet或Application的驱动。该类的主要方法说明如下:static Connection getConnection(String url)试着建立一个给定数据库URL的连接static Conn

8、ection getConnection(String url,String user,String password)试着建立一个给定数据库URL的连接参数说明:url:一个形如jdbc:subprotocol:subname的数据库URL;user:访问数据库的用户名字符串;password:访问数据库的用户名密码字符串。各种数据库系统和对应驱动参考表如表8.1所示,各种数据库系统和对应URL参考表如表8.2所示。(3)Connection接口。Connection类型的对象一般是通过DriverManager的getConnection方法返回获得的,用来标示一个连接。执行SQL语句的S

9、tatement对象的创建也是通过该连接对象的createStatement方法返回实现的。例如,建立Connection对象的语句如下:Connection conn =DriverManager.getConnection(url,user,password);当连接需要关闭时,可显式地调用该对象的close方法完成。Connection接口的主要方法包括:void close()Statement createStatement()Statement createStatement(int resultSetType,int resultSetConcurrency,int result

10、SetHoldability)void commit()Statement createStatement(int resultSetType,int resultSetConcurrency)boolean getAutoCommit()boolean isClosed()PreparedStatement prepareStatement(String sql)void rollback()(4)Statement接口。该接口类型的对象为执行SQL语句的对象,通过调用其execute(String sql)方法执行非查询类SQL语句,如增加、删除等;通过其executeQuery(Stri

11、ng sql)方法执行查询类SQL语句;通过调用其executeUpdate(String sql)方法执行更新类SQL语句。Statement接口的子接口为PreparedStatement、CallableStatement,分别用于执行预编译SQL语句和存储过程。使用预编译SQL语句和存储过程可以提高数据库访问效率。当实现一个实际的Web应用系统时,数据库系统的访问需由数据库编程人员封装成存储过程,提供给Servlet、JSP程序去调用。Statement类型的对象是通过连接对象的createStatement()方法创建的,其语句如下:Statement connection.crea

12、teStatement();其中,connection为Connection类型的对象。Statement接口的主要方法如下:boolean execute(String sql)ResultSet executeQuery(String sql)int executeUpdate(String sql)int executeUpdate(String sql,int columnIndexes)int executeUpdate(String sql,String columnNames)void addBatch(String sql)int executeBatch()一个简单使用Sta

13、tement类型的对象执行SQL语句的例子如下:Connection conn=DatabaseConnection.getConnection();Statement stmt=conn.createStatement();ResultSet rst=stmt.executeQuery(“select*from sometable”);(5)PreparedStatement接口。PreparedStatement是Statement的子接口,用来执行预编译SQL语句。一个简单的使用PreparedStatement类型的对象执行预编译SQL语句的例子如下:Connection conn=D

14、atabaseConnection.getConnection();PreparedStatement pstmt=conn.prepareStatement(“insert into user_info values(?,?,?,?,?,?)”);pstmt.setString(1,“hello”);pstmt.setInt(2,20);pstmt.setBoolean(3,true);pstmt.executeUpdate();(6)CallableStatement接口。CallableStatement是PreparedStatement的子接口,该接口原型如下:public inte

15、rface CallableStatement extends PreparedStatement调用存储过程的格式如下:call,call,即通过调用其prepareCall(String sql)方法来执行存储过程。(7)ResultSet接口。ResultSet标示一个代表数据库结果集的数据表,通常由执行SQL查询数据库语句生成。一个ResultSet类型的对象维护一个指向数据表当前数据行的游标(Cursor)。游标初始指向第一行的前面,通过next()方法移动到下一行。当游标移动到数据表的最后一行时,next()方法返回false。所以next()方法常用在while循环中,用来判断结

16、果集中的记录是否处理完。ResultSet接口的主要方法如下:boolean next()boolean previous()boolean last()boolean first()boolean isBeforeFirst()boolean isFirst()boolean isLast()8.3 访问数据库的步骤和脚本实现访问数据库的步骤和脚本实现服务器端Java程序访问数据库的步骤如下:(1)与数据库建立连接。具体包括:装入连接指定数据库的JDBC驱动程序;定义连接URL字符串;建立连接。(2)数据处理。具体包括:创建statement对象;向数据库发送SQL语句;处理数据库返回结果。

17、(3)关闭数据库连接,释放资源(关闭resultset、statement和connection等对象)。【例8.1】使用SQL Server的JDBC驱动程序连接SQL Server 2000数据库系统,检索test表数据。首先安装SQL Server的JDBC驱动程序,然后拷贝安装成功后的目录lib下的msbase.jar、mssqlserver.jar、msutil.jar三个文件到JDKlibext目录下,如图8.2所示。如果没有ext目录,则创建之。最后把JDKlibext目录下的这三个文件的路径添加到classpath环境变量中。图8.2 JDBC驱动程序的JAR包SampleAc

18、cess.jsp文件如下:第一个字段内容为:第二个字段内容为:8.4 Web应用访问数据库实例应用访问数据库实例服务器端程序可以对数据表进行增加、删除、查询、修改、计算等。其中查询是最常使用的功能。实例一基于Web的通用查询模块【例8.2】简单的Web通用查询模块。在具体编写的时候,把表的字段名和显示的表头存储为字符串数组,对结果集中的记录进行循环遍历显示。复用的时候只需要改变表头字符串数组和表的字段名字符串数组即可。运行结果界面如图8.3所示。query.jsp文件内容如下:标准价售房模块查询模块页面标准价购房基本情况%for(int i=0;ishowStr.length;i+)out.p

19、rintln(“”);out.println(“”+showStri+“”);%while(rs.next()out.println(“”);for(int i=0;icolStr.length;i+)out.println(“”);out.println(“+rs.getString(colStri)+”);out.println(“”);%图8.3 运行结果界面实例二访问存储过程在实际Web应用访问数据库过程中,根据业务逻辑创建的SQL语句集合不直接通过程序(JSP程序、Servlet程序等)发往数据库DBMS系统,而是把这些SQL语句集合存储成“存储过程(Stored Procedure

20、)”,保存在所使用的数据库系统中,通过调用“存储过程”来提高数据库访问效率。SQL语句执行的时候要先编译,然后执行。存储过程是一组可以完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用系统都应该用到存储过程,当然前提是所使用的数据库系统支持存储过程。使用存储过程与直接使用SQL命令访问数据库相比,具有如下优点:(1)存储过程只在创建时编译,以后每次执行都无需重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可以提高数据库执行速度。(2)存储过程具

21、有模块化特点,可以重复使用,减少数据库开发人员的工作量。(3)安全性高,可设定只有某个用户才具有指定存储过程的使用权限。不同的数据库系统定义的存储过程语法略有区别,详细内容请参见对应数据库系统创建存储过程的参考文档资料。一般的用户自定义存储过程和函数的语法如下:create procedure sp_name(proc_parameter,)characteristic routine_bodycreate function sp_name(func_parameter,)returns typecharacteristic routine_body其中的参数说明如下:(1)sp_name:存

22、储过程名或函数名。(2)proc_parameter和func_parameter:可以是IN、OUT或INOUT类型。(3)characteristic:一些语法限定符。(4)routine_body:语法正确的SQL过程语句,一般要包含在begin和end语句间。【例8.3】使用图形用户界面(GUI)操作MySQL数据库。从网上下载mysql-gui-tools-noinstall-5.0-r14-win32软件包,解压到某目录(如图8.4所示),运行MySQL Administrator(其工作主界面如图8.5所示)和MySQLQueryBrowser(其工作主界面如图8.6所示)。图8

23、.4 MySQL GUI目录图8.5 MySQL Administrator工作主界面图8.6 MySQL查询浏览器工作主界面如果没有创建数据库,就先创建一个数据库,如test。选择数据库的操作方法是:在图8.6中选择命令【文件】下的【更改默认数据库】,出现如图8.7所示的界面,在此界面中选择test数据库。在选择的数据库中执行SQL语句,完成创建两个表,并向表中插入数据,操作如图8.8所示。表的逻辑结构如表8.3和表8.4所示。图8.7 MySQL查询浏览器选择操作的数据库图8.8 MySQL查询浏览器执行SQL语句创建以上两个表、向表中插入数据的SQL脚本如下:create table s

24、tudent(sno varchar(20)not null primary key,sname varchar(30)default null,ssex char(1)default null,special varchar(50)default null,classno varchar(10)default null);insert into student values(4297233,liuning,m,computer science,42972);insert into student values(4297230,cheyijun,m,computer science,42972

25、);insert into student values(4297231,pengjieyin,f,computer science,42972);select*from student;create table course(cno varchar(20)not null primary key,cname varchar(30)default null,teacher varchar(50)default null);insert into course values(0401,embeded system,liuyongping);insert into course values(04

26、02,web develope,liuyongping);insert into course values(0403,embdeded system design,liuyongping);insert into course values(0404,embdeded operation system,zhaoquanliang);在所选择的数据库test中创建存储过程/函数的操作如图8.9所示。图8.9 MySQL查询浏览器创建存储过程/函数在如图8.10所示界面中输入存储过程/函数代码。图8.10 MySQL查询浏览器输入存储过程/函数代码例8.3中对表student创建一个存储函数te

27、st.snum,该存储函数用来查询学生人数。对表course创建了一个存储过程test.courseProc,该存储过程用来查询某位教师所教授的课程。这两个存储过程/函数代码如下:DELIMITER$DROP FUNCTION IF EXISTS test.snum$CREATE DEFINER=rootlocalhost FUNCTION snum()RETURNS int(11)BEGINDECLARE num INT;SELECT COUNT(*)INTO num FROM student;RETURN num;END$DELIMITER;DELIMITER$DROP PROCEDURE

28、 IF EXISTS test.courseProc$CREATE PROCEDURE test.courseProc(IN tname VARCHAR(50)BEGINselect*from course where teacher=tname;END$DELIMITER;在MySQL查询浏览器中执行以上两个存储过程。以下是在JSP文件中调用执行以上两个存储过程的storedproc.jsp文件:call stored procedure%Connection conn=null;tryClass.forName(org.gjt.mm.mysql.Driver).newInstance();

29、conn=java.sql.DriverManager.getConnection(“jdbc:mysql:/localhost/test”,“root”,null);out.println(“Connect to MySQL success!”);DatabaseMetaData dbmd=conn.getMetaData();out.print(“DBMS是否支持存储过程:”+dbmd.supportsStoredProcedures()+“”);if(conn!=null)CallableStatement cstmt=conn.prepareCall(?=call test.snum(

30、);cstmt.registerOutParameter(1,java.sql.Types.INTEGER);ResultSet rs=cstmt.executeQuery();if(rs.next()out.print(学生的人数:+rs.getString(1)+);cstmt=conn.prepareCall(call test.courseProc(?);cstmt.setString(1,liuyongping);rs=cstmt.executeQuery();out.print();while(rs.next()out.print();out.print(+rs.getString

31、(1)+);out.print(+rs.getString(2)+);out.print(+rs.getString(3)+);out.print();out.print();catch(SQLException exception)out.println(exception.toString();exception.printStackTrace();catch(Exception exception)out.println(exception.toString();finally try conn.close();catch(SQLException ex)ex.printStackTra

32、ce();%执行结果如图8.11所示。执行存储过程时注意用户权限和密码。图8.11 运行结果界面 习习 题题1编写一个基于Web的通用SQL命令执行器。通过表单将命令提交服务器程序,SQL语句执行结果返回输出到客户端页面中。2若要把query.jsp文件中访问数据库的方式改为JDBC-ODBC Bridge方式,代码中哪个地方需要改动?上机进行调试。3基于Web的应用程序使用的数据库模型和步骤分别是什么?4JDBC API和数据库系统驱动程序有什么区别?二者在使用数据库过程中各有什么作用?5编程实践题:分别在Windows和Linux系统上安装、配置和使用MySQL数据库系统,使用非图形(GUI)界面和图形界面分别进行操作,创建存储过程/函数,并通过Servlet或JSP程序去调用。综合使用各种技术开发一个功能完善的BBS系统,试着改善其数据库访问性能。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《Web开发技术》课件第8章.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|