




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020/5/27,1,JavaWeb开发技术,第4章JSP中使用数据库,2020/5/27,JavaWeb开发技术,2,4.1JDBC技术概述,几乎所有的应用都要涉及到数据的保存。在很多系统中,数据库都是生命的核心,作为软件开发人员,必须懂得如何操作和维护数据库。本章首先介绍JDBC的工作原理及其四种类型的驱动,随后探讨如何使用JDBC技术连接常用的数据库,如SQLServer,Access,Oracle等,并给出在JSP中使用数据库的具体例子。最后,介绍了数据库连接池的优点及工作原理并举例。,2020/5/27,JavaWeb开发技术,3,4.1.1什么是JDBC,JDBC是Java数据库连接(JavaDataBaseConnectivity)技术的简称,它是由JavaSoft公司(Sun公司负责开发Java产品的业务单位)同数据库及数据库工具厂家一起建立的独立于DBMS的机制。JDBC是一种用于执行SQL语句的JavaAPI。它由一组用Java编程语言编写的类和接口组成。这个API由java.sql.*和javax.sql.*两个包中的一些类和接口组成,它为数据库开发人员提供了一个标准的API,使他们能够用纯JavaAPI来编写数据库应用程序。,2020/5/27,JavaWeb开发技术,4,JDBC的优点,Java具有坚固、安全、易于使用、易于理解和可从网络上自动下载等优点;可移植性强:不必为每一种数据库编写不同的调用程序,只需用JDBCAPI编写一个程序就够了;,2020/5/27,JavaWeb开发技术,5,4.1.2两层模型和三层模型,2020/5/27,JavaWeb开发技术,6,4.1.3JDBC驱动程序的类型,JDBC-ODBC桥加ODBC驱动本地API驱动JDBC网络纯Java驱动本地协议纯Java驱动,2020/5/27,JavaWeb开发技术,7,JDBC-ODBC桥加ODBC驱动,先把JDBC调用转化为ODBC调用,再利用ODBC来与数据库交互。现存许多可用的ODBC驱动程序与大量数据库的交互,减少开发人员进行企业开发的麻烦。ODBC数据源需要提前在客户端进行注册,对于远程的客户端,操作极不方便,丢失平台无关性。适用于企业网或用Java编写的三层结构的应用程序。,2020/5/27,JavaWeb开发技术,8,本地API驱动,将标准的JDBC调用转变为对本地数据库原始驱动程序调用,再通过数据库的原始驱动程序与数据库交互。比JDBC-ODBC桥具有更优良的性能。丢失JDBC平台无关性的好处,而且也需要安装客户端的数据库原始驱动。,2020/5/27,JavaWeb开发技术,9,JDBC网络纯Java驱动,JDBC网络驱动程序传送JDBC命令到一个中间件上,这个中间件再将JDBC调用请求传送到数据库中,数据库返回的结果集也通过这个中间件来返回到应用程序。与平台无关的,并且不需要客户端的安装和管理,因此很适合于用做Internet的应用。必须处理Web所提出的安全性、通过防火墙的访问等方面的额外要求。,2020/5/27,JavaWeb开发技术,10,本地协议纯Java驱动,直接访问数据库,中间不需要任何转换或通过其它任何的中间件就能完成交互。将成为从JDBC访问数据库的首选方法,因为他们提供了Java的所有优点。,2020/5/27,JavaWeb开发技术,11,四种JDBC驱动程序原理比较,2020/5/27,JavaWeb开发技术,12,4.2使用JDBC,要使用JDBC技术主要包括以下步骤:注册和加载驱动器;与数据库建立连接;发送SQL语句;处理结果;关闭连接;,2020/5/27,JavaWeb开发技术,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”);/使用SQLServer的JDBC驱动程序Class.forName(“com.ibm.db2.jdbc.app.DB2Driver”);/使用DB2的JDBC驱动程序Class.forName(org.gjt.mm.mysql.Driver);/使用MySql的JDBC驱动程序,2020/5/27,JavaWeb开发技术,14,4.2.2建立连接,与数据库建立连接的方法是调用DriverManager.getConnection(Stringurl,Stringuser,Stringpassword)方法。下述代码显示如何打开一个与位于URL为jdbc:odbc:wombat的数据库的连接。所用的用户标识符为oboy,口令为12Java:Stringurl=jdbc:odbc:wombat;Connectioncon=DriverManager.getConnection(url,oboy,12Java);,2020/5/27,JavaWeb开发技术,15,几种数据库的连接语句的形式,Stringurl=jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=pubs;Stringuser=sa;Stringpassword=“”;Connectionconn=DriverManager.getConnection(url,user,password);,Stringurl=jdbc:db2:/localhost:5000/sample;Stringuser=admin;Stringpassword=;Connectionconn=DriverManager.getConnection(url,user,password);,Stringurl=jdbc:mysql:/localhost/softforum?user=softStatementstmt=con.createStatement();,2020/5/27,JavaWeb开发技术,18,Statement接口中的主要方法,ResultSetexecuteQuery(Stringsql)/执行Statement对象,返回单个结果集intexecuteUpdate(Stringsql)/执行Statement对象,返回本次操作影响的行数booleanexecute(Stringsql)/执行Statement对象,返回布尔值voidclose()/关闭Statement对象intgetMaxFieldSize()/获得字段最大长度voidsetMaxFieldSize(intmax)/设置字段最大长度intgetMaxRows()/获得最大行数voidsetMaxRows(intmax)/设置最大行数intgetQueryTimeout()/获得查询超时时间限voidsetQueryTimeout(intseconds)/设定查询超时时间限java.sql.SQLWarninggetWarnings()/获得与statement对象有关的警告ResultSetgetResultSet()/得到下一个结果集intgetUpdateCount()/得到修改的行数booleangetMoreResults()/检测是否有多个结果集,2020/5/27,JavaWeb开发技术,19,4.2.3.2创建PreparedStatement对象,如果需要多次执行一个SQL语句,可以使用PreparedStatement对象。在创建PreparedStatement对象时,通过传递不同参数值多次执行PreparedStatement对象,可以得到多个不同的结果。PreparedStatement对象用Connection的prepareStatement()方法创建。如:PreparedStatementpStmt=conn.preparedStatement(“insertintoemp(empno,ename)values(?,?)”);生成PreparedStatement对象的字符串中用“?”代表一个可以产生变化的IN型参数,2020/5/27,JavaWeb开发技术,20,PreparedStatement接口的主要方法,voidclearParameters()/清除PreparedStatement对象中的参数voidsetAsciiStream(intparameterIndex,java.io.InputStreamx,intlength)voidsetBinaryStream(intparameterIndex,java.io.InputStreamx,intlength)voidsetBoolean(intparameterIndex,booleanx)voidsetByte(intparameterIndex,bytex)voidsetBytes(intparameterIndex,bytex)voidsetDate(intparameterIndex,java.sql.Datex)voidsetDouble(intparameterIndex,doublex)voidsetFloat(intparameterIndex,floatx)voidsetInt(intparameterIndex,intx)voidsetLong(intparameterIndex,longx)voidsetShort(intparameterIndex,shortx),2020/5/27,JavaWeb开发技术,21,PreparedStatement接口的主要方法(续),voidsetString(intparameterIndex,Stringx)voidsetTime(intparameterIndex,java.sql.Timex)voidsetTimestamp(intparameterIndex,java.sql.Timestampx)voidsetUnicodeStream(intparameterIndex,java.io.InputStreamx,intlength)voidsetObject(intparameterIndex,Objectx)ResultSetexecuteQuery()/执行PreparedStatement对象,返回单结果集intexecuteUpdate()/执行PreparedStatement对象,返回操作影响的行数booleanexecute()/执行PreparedStatement对象,返回布尔值,2020/5/27,JavaWeb开发技术,22,PreparedStatement接口的方法说明,其中的参数parameterIndex表示在构造PreparedStatement对象时”?”从左到右出现的位置,从1开始。参数x表示给”?”设定的值。究竟用哪一个setXXX()方法,由”?”所表示的参数类型来决定。因为x的类型是java.sql.Types中的类型,而参数的类型是某种数据库中的数据类型,因此应该保证它们的类型能够相对应。一般来说,它们有下面的对应关系如下表所示:,2020/5/27,JavaWeb开发技术,23,数据库数据类型和Java数据类型的对应关系,2020/5/27,JavaWeb开发技术,24,使用PreparedStatement举例,st=con.prepareStatement(insertintoEMP(EMPNO,ENAME)values(?,?);st.setInt(1,7777);st.setString(2,Adam);,2020/5/27,JavaWeb开发技术,25,4.2.3.3创建CallableStatement对象,CallableStatement对象为数据库提供了一种以标准形式调用储存过程的方法。CallableStatement由Connection对象的方法prepareCall()创建。其中的参数sql形式为:?=call,.call前面的”?”表示过程返回结果参数。方括号指示其中的内容是可选的。它们不是语法的必要部分。如:CallableStatementcStmt=conn.prepareCall(callshowEmployees(?,?);,2020/5/27,JavaWeb开发技术,26,CallableStatement接口中的主要方法,bytegetByte(intparameterIndex)/返回序号为parameterIndex参数的字节值,参数类型为JDBCTINYINTDategetDate(intparameterIndex)/返回序号为parameterIndex参数的值,参数值的类型为java.sql.DatedoublegetDouble(intparameterIndex)/返回序号为parameterIndex参数的double类型值floatgetFloat(intparameterIndex)/返回序号为parameterIndex参数的float类型值intgetInt(intparameterIndex)/返回序号为parameterIndex参数的int类型值StringgetString(intparameterIndex)/返回序号为parameterIndex参数的String类型值voidregisterOutParameter(intparameterIndex,intsqlType)/将序号为parameterIndex的参数注册为JDBC中的数据类型voidsetDouble(StringparameterName,doublex)/设置参数parameterName为double类型值xvoidsetFloat(StringparameterName,floatx)/设置参数parameterName为float类型值xvoidsetInt(StringparameterName,intx)/设置参数parameterName为int类型值x,2020/5/27,JavaWeb开发技术,27,方法说明,这里的parameterIndex、x和sqlType的意义同prepareStatement中的说明。在创建CallableStatement对象前应检查所用的数据库是否支持存储过程,可以使用DatabaseMetaData对象的supportsStoredProcedures()方法,其语法形式为:publicbooleansupportsStoredProcedures()throwsSQLException究竟”?”表示IN型参数还是表示OUT型参数,取决于存储过程定义。使用CallableStatement对象的过程为:创建CallableStatement对象、使用registerOutParameter()方法注册登记OUT参数、使用setXXX()方法设置IN参数实际值、使用execute()方法执行该存储过程、使用getXXX()方法取得OUT参数返回值。,2020/5/27,JavaWeb开发技术,28,使用CallableStatement举例,先建立一个存储过程:createorreplaceprocedureshow(nameoutvarchar2,numinnumber)asbeginSelectEnameintonamefromempwhereempno=num;end;然后使用CallableStatement对象:CallableStatementcs=con.prepareCall(callshow(?,?);cs.registerOutParameter(1,java.sql.Types.CHAR);cs.setInt(2,7777);cs.execute();Stringstr=cs.getString(1);,2020/5/27,JavaWeb开发技术,29,4.2.4使用Statement对象执行语句,创建了Statement对象,完成了SQL语句发送后,就要调用Statement对象中的方法执行该SQL语句,进而得到执行的结果。Statement接口提供了三种执行SQL语句的方法:executeQuery()、executeUpdate()和execute()。它们的语法形式分别为:,2020/5/27,JavaWeb开发技术,30,三种执行SQL语句的方法,executeQuery()返回语句执行后的单个结果集的,所以通常用于SELECT语句executeUpdate()返回值是一个整数,指示受影响的行数(即更新计数)。execute()返回一个boolean值,execute()方法执行后可以得到多个结果集、多个更新计数或二者的组合。本章后面将在单独一节中对其进行介绍。,2020/5/27,JavaWeb开发技术,31,4.2.5ResultSet对象,4.2.5.1ResultSet对象4.2.5.2行和游标4.2.5.3数据类型和转换4.2.5.4对非常大的值使用流4.2.5.5NULL结果值,2020/5/27,JavaWeb开发技术,32,4.2.5.1ResultSet对象,ResultSet对象是executeQuery()方法的返回值,它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。,2020/5/27,JavaWeb开发技术,33,4.2.5.2行和游标,ResultSet对象自动维护指向当前数据行的游标。每调用一次next()方法,游标向下移动一行。在SQL中,结果集的游标是有名字的。可通过调用ResultSet对象的getCursorName()获得游标名。有时候需要结果集的游标前后移动,这是可滚动结果集。为了获得滚动结果集,必须先用下面方法得到一个Statement对象:Statementst=con.createStatement(inttype,intconcurrency);根据type和concurrency的取值,当执行ResultSetr=st.executeQuery()时,会返回不同类型的结果集。结果集滚动的方法很多,详见课本本章节。,2020/5/27,JavaWeb开发技术,34,4.2.5.3数据类型和转换,对于getXXX()方法,JDBC驱动程序试图将基本数据转换成指定Java类型,然后返回适合的Java值。例如,如果为getString()方法,而数据库中数据类型为VARCHAR,则JDBC驱动程序将把VARCHAR转换成JavaString。GetString()的返回值将为JavaString对象。再如,除了getBytes()和getBinaryStream()之外的任何getXXX()方法都可用来获取LONGVARCHAR值,但是推荐根据返回的数据类型使用getAsciiStream()或getUnicodeStream()方法。方法getObject()将任何数据类型返回为JavaObject。,2020/5/27,JavaWeb开发技术,35,4.2.5.4对非常大的值使用流,ResultSet可以获取任意大的LONGVARBINARY或LONGVARCHAR数据。方法之一是通过让ResultSet类返回java.io.InputStream来完成。JDBCAPI具有三个获取流的方法,分别具有不同的返回值:getBinaryStream():返回只提供数据库字节而不进行任何转换的流。getAsciiStream():返回提供单字节ASCII字符的流。getUnicodeStream():返回提供双字节Unicode字符的流。,2020/5/27,JavaWeb开发技术,36,4.2.5.5NULL结果值,要确定给定结果值是否是JDBCNULL,必须先读取该列,然后使用ResultSet的wasNull()方法检查该次读取是否返回JDBCNULL。方法wasNull()将返回下列值之一:(1)Javanull值:对于返回Java对象的getXXX()方法(例如getString()、getDate()、getTime()、getTimestamp()、getAsciiStream()、getUnicodeStream()、getBinaryStream()、getObject()等)。(2)0值:对于getByte()、getShort()、getInt()、getLong()、getFloat()和getDouble()。(3)false值:对于getBoolean()。,2020/5/27,JavaWeb开发技术,37,4.2.5.6可选结果集或多结果集,但有些情况下,应用程序在执行语句之前不知道该语句是否返回结果集。此外,有些已存储过程可能返回几个不同的结果集和/或更新计数。JDBC提供了一种机制,允许应用程序处理由结果集和更新计数组成的任意集合。这种机制的原理是:首先调用一个完全通用的execute()方法,然后调用getResultSet()、getUpdateCount()和getMoreResults()三个方法。,2020/5/27,JavaWeb开发技术,38,可选结果集或多结果集(续),下面的代码演示了一种方法用来确认已访问方法execute()所产生的全部结果集和更新计数:stmt.execute();while(true)introwCount=stmt.getUpdateCount();if(rowCount0)/它是更新计数System.out.println(Rowschanged=+count);stmt.getMoreResults();continue;if(rowCount=0)/DDL命令或0个更新System.out.println(NorowschangedorstatementwasDDLcommand);stmt.getMoreResults();continue;/执行到这里,证明有一个结果集/或没有其它结果ResultSetrs=stmt.getResultSet();if(rs!=null)./使用元数据获得关于结果集列的信息stmt.getMoreResults();elsebreak;/没有其它结果,2020/5/27,JavaWeb开发技术,39,4.2.6关闭Statement对象和Connection对象,作为一种好的编程风格,应在不需要Statement对象和Connection对象时显式地关闭它们。关闭Statement对象和Connection对象的语法形式为:publicvoidclose()throwsSQLException用户不必关闭ResultSet。当它的Statement关闭、重新执行或用于从多结果序列中获取下一个结果时,该ResultSet将被自动关闭。例:Employee.java,EmployeePrepStat.java,2020/5/27,JavaWeb开发技术,40,4.2.7事务,事务是由具有“原子性”的一个或多个语句,即这些语句要么全部被执行、完成并被提交,要么全部还原。当调用连接的提交方法commit()或回滚方法rollback()时,当前事务即告结束,另一个事务随即开始。缺省情况下,新连接将处于自动提交模式。也就是说,当执行完语句后,将自动对那个语句调用commit()方法。这种情况下,一个事务只由一个语句组成。如果禁用自动提交模式,事务将要等到commit()或rollback()方法被显式调用时才结束,因此它将包括上一次调用commit()或rollback()方法以来所有执行过的语句。对于第二种情况,事务中的所有语句将作为组来提交或还原。例:SimpledbBatch.java,2020/5/27,JavaWeb开发技术,41,4.3在JSP中通过JDBC-ODBC桥使用数据库,无论访问什么数据库,使用JDBC-ODBC桥的方法完全一样,即先注册32位数据源,再按照上节中的步骤(注册和加载驱动器、与数据库建立连接、发送SQL语句和处理结果)使用数据库。本节图4-9到图4-16演示了如何注册数据源的全过程。,2020/5/27,JavaWeb开发技术,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),2020/5/27,JavaWeb开发技术,43,4.3.2更新记录举例,例example4_8.jsp输入学生姓名和各科成绩,并将请求提交给newResult.jsp,该页面实现更新记录。运行结果下图所示。,2020/5/27,JavaWeb开发技术,44,4.3.3添加记录举例,例example4_9.jsp输入一个学生的全部信息,并将请求提交给newDatabase.jsp,该页面实现添加记录。运行结果下图所示。,2020/5/27,JavaWeb开发技术,45,4.3.4删除记录举例,例example4_10.jsp输入被删除学生的学号,并将请求提交给delete.jsp,该页面实现删除记录。运行结果下图所示。,2020/5/27,JavaWeb开发技术,46,4.3.5通过本地协议纯Java方式访问SQLServer数据库,首先从网上下载SQLServer驱动程序,安装在某个目录下,。将安装目录sqljdbc加入到环境变量classpath。下面例中,showByPage.jsp访问SQLServer数据库pubs中的表student,分页显示表中的所有记录,运行结果下图所示。,2020/5/27,JavaWeb开发技术,47,4.4在JSP中使用Excel电子表格,(1)在控制面板中设置数据源,名字为star。为数据源选择驱动程序为MicrosoftExcelDriver。(2)选择一工作区,并在其中拖动鼠标选出一个范围。然后在菜单中选择公式名称管理定义,给选中的区域命名(这个区域将作为连接时使用的表名),如图所示。这样建立了一个名字为“成绩”、由5个字段的表。,2020/5/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新时代背景下人工智能赋能初中数学的教学创新
- 环境下网红营销方案策划
- 跨境美妆护肤电商供应链优化方案对品牌价值提升研究
- 咨询公司股权构架方案
- 医院健康咨询活动方案
- 食品农产品营销方案模板
- 离婚子女轮流抚养子女生活技能与独立能力培养协议
- 现代农业物业公司股权变更与农业服务协议
- 车辆租赁合同转让及保险理赔三方协议
- 离婚协议书模板(涉及离婚后子女生活费用承担)
- 2025-2026学年苏教版(2024)小学科学三年级上册(全册)课时练习及答案(附目录P102)
- 食材配送培训计划
- 2025-2026学年人教版小学数学六年级上册教学计划及进度表
- 2025年公共卫生检验员考试试卷及答案
- 员工培训课件心脑血管
- 2025年专武干部面试题目及答案
- 弱猪护理培训课件
- 下肢血管疾病超声诊断
- 餐中服务细节培训资料
- 低钠血症护理查房
- 学生电动车管理暂行办法
评论
0/150
提交评论