java web应用开发技术实用教程-第4章 jsp中使用数据库_第1页
java web应用开发技术实用教程-第4章 jsp中使用数据库_第2页
java web应用开发技术实用教程-第4章 jsp中使用数据库_第3页
java web应用开发技术实用教程-第4章 jsp中使用数据库_第4页
java web应用开发技术实用教程-第4章 jsp中使用数据库_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

2018/1/12,1,Java Web开发技术,第4章 JSP中使用数据库,2018/1/12,Java Web开发技术,2,4.1 JDBC技术概述,几乎所有的应用都要涉及到数据的保存。在很多系统中,数据库都是生命的核心,作为软件开发人员,必须懂得如何操作和维护数据库。本章首先介绍JDBC的工作原理及其四种类型的驱动,随后探讨如何使用JDBC技术连接常用的数据库,如SQL Server,Access,Oracle等,并给出在JSP中使用数据库的具体例子。最后,介绍了数据库连接池的优点及工作原理并举例。,2018/1/12,Java Web开发技术,3,4.1.1 什么是 JDBC,JDBC是Java数据库连接(Java DataBase Connectivity)技术的简称 ,它是由JavaSoft公司(Sun公司负责开发Java产品的业务单位)同数据库及数据库工具厂家一起建立的独立于DBMS的机制。 JDBC是一种用于执行SQL语句的Java API。它由一组用Java编程语言编写的类和接口组成。这个API由java.sql.*和javax.sql.*两个包中的一些类和接口组成,它为数据库开发人员提供了一个标准的API,使他们能够用纯Java API 来编写数据库应用程序。,2018/1/12,Java Web开发技术,4,JDBC的优点,Java具有坚固、安全、易于使用、易于理解和可从网络上自动下载 等优点;可移植性强:不必为每一种数据库编写不同的调用程序 ,只需用JDBC API编写一个程序就够了;,2018/1/12,Java Web开发技术,5,4.1.2两层模型和三层模型,2018/1/12,Java Web开发技术,6,4.1.3 JDBC驱动程序的类型,JDBC-ODBC桥加ODBC驱动 本地API驱动 JDBC 网络纯Java驱动 本地协议纯 Java 驱动,2018/1/12,Java Web开发技术,7,JDBC-ODBC桥加ODBC驱动,先把JDBC调用转化为ODBC调用,再利用ODBC来与数据库交互 。现存许多可用的ODBC驱动程序与大量数据库的交互,减少开发人员进行企业开发的麻烦 。 ODBC数据源需要提前在客户端进行注册,对于远程的客户端,操作极不方便,丢失平台无关性。 适用于企业网或用Java编写的三层结构的应用程序 。,2018/1/12,Java Web开发技术,8,本地API驱动,将标准的JDBC调用转变为对本地数据库原始驱动程序调用,再通过数据库的原始驱动程序与数据库交互。 比JDBC-ODBC桥具有更优良的性能 。丢失JDBC平台无关性的好处,而且也需要安装客户端的数据库原始驱动。,2018/1/12,Java Web开发技术,9,JDBC 网络纯Java驱动,JDBC网络驱动程序传送JDBC命令到一个中间件上,这个中间件再将JDBC调用请求传送到数据库中,数据库返回的结果集也通过这个中间件来返回到应用程序。 与平台无关的,并且不需要客户端的安装和管理,因此很适合于用做Internet的应用。 必须处理Web所提出的安全性、通过防火墙的访问等方面的额外要求。,2018/1/12,Java Web开发技术,10,本地协议纯 Java 驱动,直接访问数据库,中间不需要任何转换或通过其它任何的中间件就能完成交互 。将成为从JDBC访问数据库的首选方法,因为他们提供了Java的所有优点。,2018/1/12,Java Web开发技术,11,四种JDBC驱动程序原理比较,2018/1/12,Java Web开发技术,12,4.2 使用JDBC,要使用JDBC技术主要包括以下步骤:注册和加载驱动器 ;与数据库建立连接;发送SQL语句;处理结果;关闭连接;,2018/1/12,Java Web开发技术,13,4.2.1 注册和加载驱动器,加载JDBC驱动是通过调用方法java.lang.Class.forName(),下面列出常用的几种数据库驱动程序加载语句的形式 : Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);/使用JDBC-ODBC桥驱动程序,事先必须在Windows中注册ODBC数据源 Class.forName(“oracle.jdbc.driver.OracleDriver”);/使用Oracle的JDBC驱动程序 Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);/使用SQL Server的JDBC驱动程序 Class.forName(“com.ibm.db2.jdbc.app.DB2Driver”);/使用DB2的JDBC驱动程序 Class.forName(org.gjt.mm.mysql.Driver);/使用MySql的JDBC驱动程序,2018/1/12,Java Web开发技术,14,4.2.2 建立连接,与数据库建立连接的方法是调用DriverManager.getConnection(String url, String user, String password )方法。下述代码显示如何打开一个与位于URL为jdbc:odbc:wombat 的数据库的连接。所用的用户标识符为oboy,口令为12Java: String url = jdbc:odbc:wombat;Connection con = DriverManager.getConnection(url, oboy, 12Java);,2018/1/12,Java Web开发技术,15,几种数据库的连接语句的形式,String url=jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=pubs;String user=sa;String password=“”;Connection conn= DriverManager.getConnection(url,user,password);,String url=jdbc:db2:/localhost:5000/sample;String user=admin; String password=; Connection conn= DriverManager.getConnection(url,user,password);,String url=jdbc:mysql:/localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1; Connection conn= DriverManager.getConnection(url);,Connection con=DriverManager.getConnection(“jdbc:oracle:oci8:db”,“scott”,“tiger”);/使用Oracle的JDBC OCI驱动程序 Connection con=DriverManager.getConnection(jdbc:oracle:thin:host:8080:db,scott,tiger);/使用Oracle的JDBC Thin驱动程序,sqlserver,mysql,db2,oracle,2018/1/12,Java Web开发技术,16,4.2.3 发送SQL语句,Statement对象用于将 SQL 语句发送到数据库中。实际上有三种 Statement对象:Statement:用于执行不带参数的简单SQL语句;PreparedStatement(从 Statement 继承):用于执行带或不带IN参数的预编译SQL语句; CallableStatement(从PreparedStatement 继承):用于执行数据库存储过程的调用。,2018/1/12,Java Web开发技术,17,4.2.3.1 创建Statement对象,Statement 对象用Connection的方法createStatement()创建。createStatement()的语法形式为: public Statement createStatement() throws SQLException如下列代码段中所示: Connection con = DriverManager.getConnection(url, sunny, );Statement stmt = con.createStatement();,2018/1/12,Java Web开发技术,18,Statement接口中的主要方法,ResultSet executeQuery (String sql) /执行Statement对象,返回单个结果集int executeUpdate (String sql) /执行Statement对象,返回本次操作影响的行数boolean execute (String sql) /执行Statement对象,返回布尔值void close () /关闭Statement对象int getMaxFieldSize () /获得字段最大长度void setMaxFieldSize (int max) /设置字段最大长度int getMaxRows () /获得最大行数void setMaxRows (int max) /设置最大行数int getQueryTimeout () /获得查询超时时间限void setQueryTimeout (int seconds) /设定查询超时时间限java.sql.SQLWarning getWarnings () /获得与statement对象有关的警告ResultSet getResultSet () /得到下一个结果集int getUpdateCount () /得到修改的行数boolean getMoreResults () /检测是否有多个结果集,2018/1/12,Java Web开发技术,19,4.2.3.2创建PreparedStatement对象,如果需要多次执行一个SQL语句,可以使用PreparedStatement对象。在创建PreparedStatement对象时,通过传递不同参数值多次执行PreparedStatement对象,可以得到多个不同的结果。 PreparedStatement对象用Connection的prepareStatement()方法创建。如: PreparedStatement pStmt = conn.preparedStatement(“insert into emp (empno , ename) values(?,?)”); 生成PreparedStatement对象的字符串中用“?”代表一个可以产生变化的IN型参数,2018/1/12,Java Web开发技术,20,PreparedStatement接口的主要方法,void clearParameters () /清除PreparedStatement对象中的参数void setAsciiStream (int parameterIndex, java.io.InputStream x, int length) void setBinaryStream (int parameterIndex, java.io.InputStream x, int length) void setBoolean (int parameterIndex, boolean x) void setByte (int parameterIndex, byte x) void setBytes (int parameterIndex, byte x) void setDate (int parameterIndex, java.sql.Date x) void setDouble (int parameterIndex, double x) void setFloat (int parameterIndex, float x) void setInt (int parameterIndex, int x) void setLong (int parameterIndex, long x) void setShort (int parameterIndex, short x),2018/1/12,Java Web开发技术,21,PreparedStatement接口的主要方法(续),void setString (int parameterIndex, String x) void setTime (int parameterIndex, java.sql.Time x) void setTimestamp (int parameterIndex, java.sql.Timestamp x) void setUnicodeStream (int parameterIndex, java.io.InputStream x, int length) void setObject (int parameterIndex, Object x)ResultSet executeQuery () /执行PreparedStatement对象,返回单结果集int executeUpdate () /执行PreparedStatement对象,返回操作影响的行数boolean execute () /执行PreparedStatement对象,返回布尔值,2018/1/12,Java Web开发技术,22,PreparedStatement接口的方法说明,其中的参数parameterIndex表示在构造PreparedStatement对象时”?”从左到右出现的位置,从1开始。参数x表示给”?”设定的值。究竟用哪一个setXXX()方法,由”?”所表示的参数类型来决定。因为x的类型是java.sql.Types中的类型,而参数的类型是某种数据库中的数据类型,因此应该保证它们的类型能够相对应。一般来说,它们有下面的对应关系如下表所示:,2018/1/12,Java Web开发技术,23,数据库数据类型和Java数据类型的对应关系,2018/1/12,Java Web开发技术,24,使用PreparedStatement 举例,st=con.prepareStatement(insert into EMP(EMPNO,ENAME) values (?,?);st.setInt(1,7777);st.setString(2,Adam);,2018/1/12,Java Web开发技术,25,4.2.3.3创建CallableStatement对象,CallableStatement对象为数据库提供了一种以标准形式调用储存过程的方法。CallableStatement由Connection对象的方法prepareCall()创建。其中的参数sql形式为:? = call , . call前面的”?”表示过程返回结果参数。方括号指示其中的内容是可选的。它们不是语法的必要部分。如:CallableStatement cStmt = conn.prepareCall(call showEmployees(?,?);,2018/1/12,Java Web开发技术,26,CallableStatement接口中的主要方法,byte getByte(int parameterIndex) /返回序号为parameterIndex参数的字节值,参数类型为JDBC TINYINTDate getDate(int parameterIndex)/返回序号为parameterIndex参数的值,参数值的类型为java.sql.Datedouble getDouble(int parameterIndex) /返回序号为parameterIndex参数的double类型值float getFloat(int parameterIndex) /返回序号为parameterIndex参数的float类型值int getInt(int parameterIndex) /返回序号为parameterIndex参数的int类型值String getString(int parameterIndex) /返回序号为parameterIndex参数的String类型值void registerOutParameter(int parameterIndex, int sqlType) /将序号为parameterIndex的参数注册为JDBC中的数据类型void setDouble(String parameterName, double x) / 设置参数parameterName为double类型值xvoid setFloat(String parameterName, float x) / 设置参数parameterName为float类型值xvoid setInt(String parameterName, int x) / 设置参数parameterName为int类型值x,2018/1/12,Java Web开发技术,27,方法说明,这里的parameterIndex、x和sqlType的意义同prepareStatement中的说明。在创建CallableStatement对象前应检查所用的数据库是否支持存储过程,可以使用DatabaseMetaData对象的supportsStoredProcedures()方法,其语法形式为:public boolean supportsStoredProcedures() throws SQLException究竟”?”表示IN型参数还是表示OUT型参数,取决于存储过程定义。使用CallableStatement对象的过程为:创建CallableStatement对象、使用registerOutParameter()方法注册登记OUT参数、使用setXXX()方法设置IN参数实际值、使用execute()方法执行该存储过程、使用getXXX()方法取得OUT参数返回值。,2018/1/12,Java Web开发技术,28,使用CallableStatement举例,先建立一个存储过程: create or replace procedure show(name out varchar2,num in number) as begin Select Ename into name from emp where empno=num; end;然后使用CallableStatement对象: CallableStatement cs=con.prepareCall(call show(?,?); cs.registerOutParameter(1,java.sql.Types.CHAR); cs.setInt(2,7777); cs.execute(); String str=cs.getString(1);,2018/1/12,Java Web开发技术,29,4.2.4使用Statement 对象执行语句,创建了Statement对象 ,完成了SQL语句发送后,就要调用Statement对象中的方法执行该SQL语句,进而得到执行的结果。 Statement接口提供了三种执行SQL语句的方法:executeQuery()、executeUpdate()和execute()。它们的语法形式分别为:,2018/1/12,Java Web开发技术,30,三种执行SQL语句的方法,executeQuery()返回语句执行后的单个结果集的,所以通常用于SELECT语句 executeUpdate()返回值是一个整数,指示受影响的行数(即更新计数)。execute()返回一个boolean值,execute()方法执行后可以得到多个结果集、多个更新计数或二者的组合。本章后面将在单独一节中对其进行介绍。,2018/1/12,Java Web开发技术,31,4.2.5 ResultSet对象,4.2.5.1ResultSet对象4.2.5.2行和游标4.2.5.3 数据类型和转换4.2.5.4对非常大的值使用流4.2.5.5NULL结果值,2018/1/12,Java Web开发技术,32,4.2.5.1ResultSet对象,ResultSet对象是executeQuery()方法的返回值,它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。,2018/1/12,Java Web开发技术,33,4.2.5.2行和游标,ResultSet对象自动维护指向当前数据行的游标。每调用一次next()方法,游标向下移动一行。 在SQL中,结果集的游标是有名字的。可通过调用ResultSet对象的getCursorName()获得游标名。 有时候需要结果集的游标前后移动,这是可滚动结果集。为了获得滚动结果集,必须先用下面方法得到一个Statement对象:Statement st=con.createStatement(int type, int concurrency);根据type和concurrency的取值,当执行ResultSet r=st.executeQuery()时,会返回不同类型的结果集。 结果集滚动的方法很多,详见课本本章节。,2018/1/12,Java Web开发技术,34,4.2.5.3 数据类型和转换,对于getXXX()方法,JDBC驱动程序试图将基本数据转换成指定Java类型,然后返回适合的Java值。例如,如果为getString()方法,而数据库中数据类型为 VARCHAR,则JDBC驱动程序将把VARCHAR转换成Java String。GetString()的返回值将为Java String 对象。再如,除了getBytes()和getBinaryStream()之外的任何getXXX()方法都可用来获取LONGVARCHAR值,但是推荐根据返回的数据类型使用getAsciiStream()或 getUnicodeStream()方法。方法getObject()将任何数据类型返回为Java Object。,2018/1/12,Java Web开发技术,35,4.2.5.4对非常大的值使用流,ResultSet可以获取任意大的LONGVARBINARY或LONGVARCHAR数据。方法之一是通过让ResultSet类返回java.io.InputStream来完成。JDBC API具有三个获取流的方法,分别具有不同的返回值: getBinaryStream():返回只提供数据库字节而不进行任何转换的流。getAsciiStream():返回提供单字节ASCII字符的流。getUnicodeStream():返回提供双字节Unicode字符的流。,2018/1/12,Java Web开发技术,36,4.2.5.5NULL结果值,要确定给定结果值是否是JDBC NULL,必须先读取该列,然后使用ResultSet的wasNull()方法检查该次读取是否返回JDBC NULL。方法wasNull()将返回下列值之一: (1)Java null值:对于返回Java对象的getXXX()方法(例如 getString()、getDate()、getTime()、getTimestamp()、getAsciiStream()、getUnicodeStream()、getBinaryStream()、getObject()等)。 (2)0值:对于 getByte()、getShort()、getInt()、getLong()、getFloat() 和 getDouble()。 (3)false 值:对于 getBoolean()。,2018/1/12,Java Web开发技术,37,4.2.5.6可选结果集或多结果集,但有些情况下,应用程序在执行语句之前不知道该语句是否返回结果集。此外,有些已存储过程可能返回几个不同的结果集和/或更新计数。 JDBC提供了一种机制,允许应用程序处理由结果集和更新计数组成的任意集合。这种机制的原理是:首先调用一个完全通用的execute()方法,然后调用getResultSet()、getUpdateCount()和getMoreResults()三个方法。,2018/1/12,Java Web开发技术,38,可选结果集或多结果集 (续),下面的代码演示了一种方法用来确认已访问方法execute()所产生的全部结果集和更新计数:stmt.execute();while (true) int rowCount = stmt.getUpdateCount();if (rowCount 0) / 它是更新计数System.out.println(Rows changed = + count);stmt.getMoreResults();continue;if (rowCount = 0) / DDL 命令或 0 个更新System.out.println( No rows changed or statement was DDL command);stmt.getMoreResults();continue;/ 执行到这里,证明有一个结果集/ 或没有其它结果ResultSet rs = stmt.getResultSet();if (rs != null) . . . / 使用元数据获得关于结果集列的信息stmt.getMoreResults();elsebreak; / 没有其它结果,2018/1/12,Java Web开发技术,39,4.2.6 关闭 Statement对象和Connection对象,作为一种好的编程风格,应在不需要Statement对象和Connection对象时显式地关闭它们。关闭Statement对象和Connection对象的语法形式为: public void close() throws SQLException用户不必关闭ResultSet。当它的 Statement 关闭、重新执行或用于从多结果序列中获取下一个结果时,该ResultSet将被自动关闭。例:Employee.java,EmployeePrepStat.java,2018/1/12,Java Web开发技术,40,4.2.7 事务,事务是由具有“原子性”的一个或多个语句,即这些语句要么全部被执行、完成并被提交,要么全部还原。当调用连接的提交方法commit()或回滚方法rollback()时,当前事务即告结束,另一个事务随即开始。缺省情况下,新连接将处于自动提交模式。也就是说,当执行完语句后,将自动对那个语句调用commit()方法。这种情况下,一个事务只由一个语句组成。如果禁用自动提交模式,事务将要等到commit()或rollback()方法被显式调用时才结束,因此它将包括上一次调用commit()或rollback()方法以来所有执行过的语句。对于第二种情况,事务中的所有语句将作为组来提交或还原。 例:SimpledbBatch.java,2018/1/12,Java Web开发技术,41,4.3 在JSP中通过JDBC-ODBC桥使用数据库,无论访问什么数据库,使用JDBC-ODBC桥的方法完全一样,即先注册32位数据源,再按照上节中的步骤(注册和加载驱动器、与数据库建立连接、发送SQL语句和处理结果)使用数据库。 本节图4-9到图4-16演示了如何注册数据源的全过程。,2018/1/12,Java Web开发技术,42,4.3.1 查询举例,4.3.1.1顺序查询(例example4_1.jsp,example4_2.jsp )4.3.1.2 随机查询(例example4_3.jsp ,example4_4.jsp )4.3.1.3 参数查询(例example4_5.jsp ,bynename.jsp , byscore.jsp )4.3.1.4 排序查询(例example4_6.jsp ,byname1.jsp ),2018/1/12,Java Web开发技术,43,4.3.2 更新记录举例,例example4_8.jsp输入学生姓名和各科成绩,并将请求提交给newResult.jsp,该页面实现更新记录。运行结果下图所示。,2018/1/12,Java Web开发技术,44,4.3.3 添加记录举例,例example4_9.jsp输入一个学生的全部信息,并将请求提交给newDatabase.jsp,该页面实现添加记录。运行结果下图所示。,2018/1/12,Java Web开发技术,45,4.3.4 删除记录举例,例example4_10.jsp输入被删除学生的学号,并将请求提交给delete.jsp,该页面实现删除记录。运行结果下图所示。,2018/1/12,Java Web开发技术,46,4.3.5 通过本地协议纯Java方式访问SQL Server数据库,首先从网上下载SQL Server驱动程序,安装在某个目录下,。将安装目录sqljdbc加入到环境变量classpath。下面例中,showByPage.jsp访问SQL Server数据库pubs中的表student,分页显示表中的所有记录,运行结果下图所示。,2018/1/12,Java Web开发技术,47,4.4 在JSP中使用Excel电子表格,(1)在控制面板中设置数据源,名字为star。为数据源选择驱动程序为Microsoft Excel Driver。(2)选择一工作区,并在其中拖动鼠标选出一个范围。然后在菜单中选择公式名称管理定义,给选中的区域命名(这个区域将作为

温馨提示

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

评论

0/150

提交评论