版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2024/9/21JavaWeb开发技术14.1JDBC技术概述几乎所有的应用都要涉及到数据的保存。在很多系统中,数据库都是生命的核心,作为软件开发人员,必须懂得如何操作和维护数据库。本章首先介绍JDBC的工作原理及其四种类型的驱动,随后探讨如何使用JDBC技术连接常用的数据库,如SQLServer,Access,Oracle等,并给出在JSP中使用数据库的具体例子。最后,介绍了数据库连接池的优点及工作原理并举例。2024/9/21JavaWeb开发技术24.1.1什么是JDBC
JDBC是Java数据库连接(JavaDataBaseConnectivity)技术的简称它是由JavaSoft公司(Sun公司负责开发Java产品的业务单位)同数据库及数据库工具厂家一起建立的独立于DBMS的机制。
2024/9/21JavaWeb开发技术3JDBC的组成JDBC是一种用于执行SQL语句的JavaAPI。它由一组用Java编程语言编写的类和接口组成。这个API由java.sql.*和javax.sql.*两个包中的一些类和接口组成,它为数据库开发人员提供了一个标准的API,使他们能够用纯JavaAPI来编写数据库应用程序。2024/9/21JavaWeb开发技术4JDBC的优点Java具有坚固、安全、易于使用、易于理解和可从网络上自动下载等优点;可移植性强:不必为每一种数据库编写不同的调用程序,只需用JDBCAPI编写一个程序就够了;2024/9/21JavaWeb开发技术54.1.2两层模型和三层模型2024/9/21JavaWeb开发技术64.1.3JDBC驱动程序的类型JDBC-ODBC桥加ODBC驱动本地API驱动JDBC网络纯Java驱动本地协议纯Java驱动2024/9/21JavaWeb开发技术7JDBC-ODBC桥加ODBC驱动ODBC(OpenDatabaseConnectivity,开放数据库互连)是微软公司开放服务结构中有关数据库的一个组成部分它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。2024/9/21JavaWeb开发技术8JDBC-ODBC桥加ODBC驱动先把JDBC调用转化为ODBC调用,再利用ODBC来与数据库交互。现存许多可用的ODBC驱动程序与大量数据库的交互,减少开发人员进行企业开发的麻烦。缺点:ODBC数据源需要提前在客户端进行注册,对于远程的客户端,操作极不方便,丢失平台无关性。适用:企业网或用Java编写的三层结构的应用程序。2024/9/21JavaWeb开发技术9JDBC-ODBC桥加ODBC驱动2024/9/21JavaWeb开发技术10本地API驱动将标准的JDBC调用转变为对本地数据库原始驱动程序调用,再通过数据库的原始驱动程序与数据库交互。比JDBC-ODBC桥具有更优良的性能。缺点:丢失JDBC平台无关性的好处,而且也需要安装客户端的数据库原始驱动。
2024/9/21JavaWeb开发技术11本地API驱动2024/9/21JavaWeb开发技术12JDBC网络纯Java驱动JDBC网络驱动程序传送JDBC命令到一个中间件上,这个中间件再将JDBC调用请求传送到数据库中,数据库返回的结果集也通过这个中间件来返回到应用程序。优点:与平台无关的,并且不需要客户端的安装和管理,因此很适合于用做Internet的应用。缺点:必须处理Web所提出的安全性、通过防火墙的访问等方面的额外要求。2024/9/21JavaWeb开发技术13JDBC网络纯Java驱动2024/9/21JavaWeb开发技术14本地协议纯Java驱动直接访问数据库,中间不需要任何转换或通过其它任何的中间件就能完成交互。将成为从JDBC访问数据库的首选方法,因为他们提供了Java的所有优点。2024/9/21JavaWeb开发技术15本地协议纯Java驱动2024/9/21JavaWeb开发技术164.2使用JDBC要使用JDBC技术主要包括以下步骤:注册和加载驱动器;与数据库建立连接;发送SQL语句;处理结果;关闭连接;2024/9/21JavaWeb开发技术174.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驱动程序2024/9/21JavaWeb开发技术184.2.2建立连接与数据库建立连接的方法是调用DriverManager.getConnection(Stringurl,Stringuser,Stringpassword)方法。下述代码显示如何打开一个与位于URL为"jdbc:odbc:wombat"的数据库的连接。所用的用户标识符为"oboy",口令为"12Java":
Stringurl="jdbc:odbc:wombat";
Connectioncon=DriverManager.getConnection(url,"oboy","12Java");2024/9/21JavaWeb开发技术19几种数据库的连接语句的形式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=soft&password=soft1234&useUnicode=
true&characterEncoding=8859_1";Connectionconn=DriverManager.getConnection(url);Connectioncon=DriverManager.getConnection(“jdbc:oracle:oci8:@db”,“scott”,“tiger”);//使用Oracle的JDBCOCI驱动程序Connectioncon=DriverManager.getConnection("jdbc:oracle:thin:@host:8080:db","scott",
"tiger");//使用Oracle的JDBCThin驱动程序
sqlservermysqldb2oracle2024/9/21JavaWeb开发技术204.2.3发送SQL语句Statement对象用于将SQL语句发送到数据库中。实际上有三种Statement对象:Statement:用于执行不带参数的简单SQL语句;PreparedStatement(从Statement继承):用于执行带或不带IN参数的预编译SQL语句;
CallableStatement(从PreparedStatement继承):用于执行数据库存储过程的调用。2024/9/21JavaWeb开发技术21.创建Statement对象Statement对象用Connection的方法createStatement()创建。createStatement()的语法形式为:
publicStatementcreateStatement()throwsSQLException如下列代码段中所示:
Connectioncon=DriverManager.getConnection(url,"sunny","");
Statementstmt=con.createStatement();
2024/9/21JavaWeb开发技术22Statement接口中的主要方法ResultSetexecuteQuery(Stringsql)//执行Statement对象,返回单个结果集intexecuteUpdate(Stringsql)//执行Statement对象,返回本次操作影响的行数booleanexecute(Stringsql)//执行Statement对象,返回布尔值voidclose()//关闭Statement对象intgetMaxFieldSize()//获得字段最大长度voidsetMaxFieldSize(intmax)//设置字段最大长度intgetMaxRows()//获得最大行数2024/9/21JavaWeb开发技术23Statement接口中的主要方法intgetMaxRows()//获得最大行数voidsetMaxRows(intmax)//设置最大行数intgetQueryTimeout()//获得查询超时时间限voidsetQueryTimeout(intseconds)//设定查询超时时间限java.sql.SQLWarninggetWarnings()//获得与statement对象有关的警告ResultSetgetResultSet()//得到下一个结果集intgetUpdateCount()//得到修改的行数booleangetMoreResults()//检测是否有多个结果集2024/9/21JavaWeb开发技术24.创建PreparedStatement对象如果需要多次执行一个SQL语句,可以使用PreparedStatement对象。在创建PreparedStatement对象时,通过传递不同参数值多次执行PreparedStatement对象,可以得到多个不同的结果。PreparedStatement对象用Connection的prepareStatement()方法创建。如:
PreparedStatementpStmt=conn.preparedStatement(“insertintoemp(empno,ename)values(?,?)”);生成PreparedStatement对象的字符串中用“?”代表一个可以产生变化的IN型参数
2024/9/21JavaWeb开发技术25PreparedStatement接口的主要方法voidclearParameters()//清除PreparedStatement对象中的参数voidsetAsciiStream(intparameterIndex,java.io.InputStreamx,intlength)voidsetBinaryStream(intparameterIndex,java.io.InputStreamx,intlength)2024/9/21JavaWeb开发技术26PreparedStatement接口的主要方法(续)voidsetBoolean(intparameterIndex,booleanx)voidsetByte(intparameterIndex,bytex)voidsetBytes(intparameterIndex,bytex[])
2024/9/21JavaWeb开发技术27PreparedStatement接口的主要方法(续)voidsetDate(intparameterIndex,java.sql.Datex)voidsetDouble(intparameterIndex,doublex)voidsetFloat(intparameterIndex,floatx)2024/9/21JavaWeb开发技术28PreparedStatement接口的主要方法(续)voidsetInt(intparameterIndex,intx)voidsetLong(intparameterIndex,longx)voidsetShort(intparameterIndex,shortx)2024/9/21JavaWeb开发技术29PreparedStatement接口的主要方法(续)voidsetString(intparameterIndex,Stringx)voidsetTime(intparameterIndex,java.sql.Timex)voidsetTimestamp(intparameterIndex,java.sql.Timestampx)2024/9/21JavaWeb开发技术30PreparedStatement接口的主要方法(续)voidsetUnicodeStream(intparameterIndex,java.io.InputStreamx,intlength)voidsetObject(intparameterIndex,Objectx)2024/9/21JavaWeb开发技术31PreparedStatement接口的主要方法(续)ResultSetexecuteQuery()//执行PreparedStatement对象,返回单结果集intexecuteUpdate()//执行PreparedStatement对象,返回操作影响的行数booleanexecute()//执行PreparedStatement对象,返回布尔值2024/9/21JavaWeb开发技术32PreparedStatement接口的方法说明其中的参数parameterIndex表示在构造PreparedStatement对象时”?”从左到右出现的位置,从1开始。参数x表示给”?”设定的值。究竟用哪一个setXXX()方法,由”?”所表示的参数类型来决定。因为x的类型是java.sql.Types中的类型,而参数的类型是某种数据库中的数据类型,因此应该保证它们的类型能够相对应。一般来说,它们有下面的对应关系如下表所示:2024/9/21JavaWeb开发技术33数据库数据类型和Java数据类型的对应关系2024/9/21JavaWeb开发技术34数据库数据类型和Java数据类型的对应关系JDBC类型
Java类型DATALINK .URLDATE java.sql.DateTIME java.sql.TimeBIGINT longSMALLINT shortCHAR,VARCHAR,LONGVARCHAR String2024/9/21JavaWeb开发技术35数据库数据类型和Java数据类型的对应关系JDBC类型
Java类型JAVA_OBJECT javaclassNUMERIC java,math.BigDecimalINTEGER int,IntegerREAL float,FloatDOUBLE double,Double2024/9/21JavaWeb开发技术36数据库数据类型和Java数据类型的对应关系JDBC类型
Java类型BIT,BOOLEAN boolean,BooleanARRAY ArrayTINYINT byteBINARY,VARBINARY,LONGVARBINARY byte[]2024/9/21JavaWeb开发技术37使用PreparedStatement举例………………st=con.prepareStatement("insertintoEMP(EMPNO,ENAME)values(?,?)");st.setInt(1,7777);st.setString(2,"Adam");………………2024/9/21JavaWeb开发技术38.创建CallableStatement对象CallableStatement对象为数据库提供了一种以标准形式调用储存过程的方法。CallableStatement由Connection对象的方法prepareCall()创建。其中的参数sql形式为:{[?=]call<storedprocedurename>[<parameter>,<parameter>...]}call前面的”?”表示过程返回结果参数。方括号指示其中的内容是可选的。它们不是语法的必要部分。2024/9/21JavaWeb开发技术39如:CallableStatementcStmt=conn.prepareCall("{callshowEmployees(?,?)}");2024/9/21JavaWeb开发技术40CallableStatement接口中的主要方法bytegetByte(intparameterIndex)
//返回序号为parameterIndex参数的字节值,参数类型为JDBCTINYINTDategetDate(intparameterIndex)//返回序号为parameterIndex参数的值,参数值的类型为java.sql.Date2024/9/21JavaWeb开发技术41CallableStatement接口中的主要方法doublegetDouble(intparameterIndex)//返回序号为parameterIndex参数的double类型值floatgetFloat(intparameterIndex)//返回序号为parameterIndex参数的float类型值2024/9/21JavaWeb开发技术42CallableStatement接口中的主要方法intgetInt(intparameterIndex)//返回序号为parameterIndex参数的int类型值StringgetString(intparameterIndex)//返回序号为parameterIndex参数的String类型值2024/9/21JavaWeb开发技术43CallableStatement接口中的主要方法voidregisterOutParameter(intparameterIndex,intsqlType)//将序号为parameterIndex的参数注册为JDBC中的数据类型voidsetDouble(StringparameterName,doublex)//设置参数parameterName为double类型值x2024/9/21JavaWeb开发技术44CallableStatement接口中的主要方法voidsetFloat(StringparameterName,floatx)//设置参数parameterName为float类型值xvoidsetInt(StringparameterName,intx)//设置参数parameterName为int类型值x2024/9/21JavaWeb开发技术45方法说明这里的parameterIndex、x和sqlType的意义同prepareStatement中的说明。2024/9/21JavaWeb开发技术46方法说明在创建CallableStatement对象前应检查所用的数据库是否支持存储过程,可以使用DatabaseMetaData对象的supportsStoredProcedures()方法,其语法形式为:publicbooleansupportsStoredProcedures()throwsSQLException2024/9/21JavaWeb开发技术47方法说明究竟”?”表示IN型参数还是表示OUT型参数,取决于存储过程定义。2024/9/21JavaWeb开发技术48方法说明使用CallableStatement对象的过程为:创建CallableStatement对象、使用registerOutParameter()方法注册登记OUT参数、使用setXXX()方法设置IN参数实际值、使用execute()方法执行该存储过程、使用getXXX()方法取得OUT参数返回值。2024/9/21JavaWeb开发技术49使用CallableStatement举例先建立一个存储过程:
createorreplaceprocedureshow(nameoutvarchar2,numinnumber)asbeginSelectEnameintonamefromempwhereempno=num;end;2024/9/21JavaWeb开发技术50然后使用CallableStatement对象:
CallableStatementcs=con.prepareCall("{callshow(?,?)}");
cs.registerOutParameter(1,java.sql.Types.CHAR);
cs.setInt(2,7777);
cs.execute();
Stringstr=cs.getString(1);2024/9/21JavaWeb开发技术514.2.4使用Statement对象执行语句创建了Statement对象,完成了SQL语句发送后,就要调用Statement对象中的方法执行该SQL语句,进而得到执行的结果。Statement接口提供了三种执行SQL语句的方法:executeQuery()、executeUpdate()和execute()。它们的语法形式分别为:2024/9/21JavaWeb开发技术52三种执行SQL语句的方法executeQuery()返回语句执行后的单个结果集的,所以通常用于SELECT语句executeUpdate()返回值是一个整数,指示受影响的行数(即更新计数)。execute()返回一个boolean值,execute()方法执行后可以得到多个结果集、多个更新计数或二者的组合。本章后面将在单独一节中对其进行介绍。2024/9/21JavaWeb开发技术534.2.5ResultSet对象
.ResultSet对象.行和游标.数据类型和转换.对非常大的值使用流.NULL结果值2024/9/21JavaWeb开发技术54.ResultSet对象ResultSet对象是executeQuery()方法的返回值,它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。2024/9/21JavaWeb开发技术55ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。2024/9/21JavaWeb开发技术56.行和游标ResultSet对象自动维护指向当前数据行的游标。每调用一次next()方法,游标向下移动一行。在SQL中,结果集的游标是有名字的。可通过调用ResultSet对象的getCursorName()获得游标名。2024/9/21JavaWeb开发技术57有时候需要结果集的游标前后移动,这是可滚动结果集。为了获得滚动结果集,必须先用下面方法得到一个Statement对象:Statementst=con.createStatement(inttype,intconcurrency);根据type和concurrency的取值,当执行ResultSetr=st.executeQuery()时,会返回不同类型的结果集。结果集滚动的方法很多,详见课本本章节。2024/9/21JavaWeb开发技术58.数据类型和转换对于getXXX()方法,JDBC驱动程序试图将基本数据转换成指定Java类型,然后返回适合的Java值。例如,如果为getString()方法,而数据库中数据类型为VARCHAR,则JDBC驱动程序将把VARCHAR转换成JavaString。GetString()的返回值将为JavaString对象。2024/9/21JavaWeb开发技术59再如,除了getBytes()和getBinaryStream()之外的任何getXXX()方法都可用来获取LONGVARCHAR值,但是推荐根据返回的数据类型使用getAsciiStream()或getUnicodeStream()方法。方法getObject()将任何数据类型返回为JavaObject。2024/9/21JavaWeb开发技术60.对非常大的值使用流ResultSet可以获取任意大的LONGVARBINARY或LONGVARCHAR数据。方法之一是通过让ResultSet类返回java.io.InputStream来完成。JDBCAPI具有三个获取流的方法,分别具有不同的返回值:
getBinaryStream():返回只提供数据库字节而不进行任何转换的流。
getAsciiStream():返回提供单字节ASCII字符的流。
getUnicodeStream():返回提供双字节Unicode字符的流。2024/9/21JavaWeb开发技术61.NULL结果值要确定给定结果值是否是JDBCNULL,必须先读取该列,然后使用ResultSet的wasNull()方法检查该次读取是否返回JDBCNULL。2024/9/21JavaWeb开发技术62方法wasNull()将返回下列值之一(1)Javanull值:对于返回Java对象的getXXX()方法(例如getString()、getDate()、getTime()、getTimestamp()、getAsciiStream()、getUnicodeStream()、getBinaryStream()、getObject()等)。(2)0值:对于getByte()、getShort()、getInt()、getLong()、getFloat()和getDouble()。(3)false值:对于getBoolean()。2024/9/21JavaWeb开发技术63.可选结果集或多结果集但有些情况下,应用程序在执行语句之前不知道该语句是否返回结果集。此外,有些已存储过程可能返回几个不同的结果集和/或更新计数。JDBC提供了一种机制,允许应用程序处理由结果集和更新计数组成的任意集合。2024/9/21JavaWeb开发技术64这种机制的原理是:首先调用一个完全通用的execute()方法,然后调用getResultSet()、getUpdateCount()和getMoreResults()三个方法。2024/9/21JavaWeb开发技术654.2.6关闭Statement对象和Connection对象作为一种好的编程风格,应在不需要Statement对象和Connection对象时显式地关闭它们。关闭Statement对象和Connection对象的语法形式为:
publicvoidclose()throwsSQLException用户不必关闭ResultSet。当它的Statement关闭、重新执行或用于从多结果序列中获取下一个结果时,该ResultSet将被自动关闭。2024/9/21JavaWeb开发技术664.2.7事务事务是由具有“原子性”的一个或多个语句,即这些语句要么全部被执行、完成并被提交,要么全部还原。当调用连接的提交方法commit()或回滚方法rollback()时,当前事务即告结束,另一个事务随即开始。2024/9/21JavaWeb开发技术67缺省情况下,新连接将处于自动提交模式。也就是说,当执行完语句后,将自动对那个语句调用commit()方法。这种情况下,一个事务只由一个语句组成。如果禁用自动提交模式,事务将要等到commit()或rollback()方法被显式调用时才结束,因此它将包括上一次调用commit()或rollback()方法以来所有执行过的语句。对于第二种情况,事务中的所有语句将作为组来提交或还原。2024/9/21JavaWeb开发技术684.3在JSP中通过JDBC-ODBC桥使用数据库无论访问什么数据库,使用JDBC-ODBC桥的方法完全一样,即先注册32位数据源,再按照上节中的步骤(注册和加载驱动器、与数据库建立连接、发送SQL语句和处理结果)使用数据库。本节图4-9到图4-16演示了如何注册数据源的全过程。2024/9/21JavaWeb开发技术694.3.1查询举例.顺序查询(例example4_1.jsp,example4_2.jsp).随机查询(例example4_3.jsp,example4_4.jsp
).参数查询(例example4_5.jsp,bynename.jsp,byscore.jsp
).排序查询(例example4_6.jsp,byname1.jsp
)2024/9/21JavaWeb开发技术704.3.2更新记录举例例example4_8.jsp输入学生姓名和各科成绩,并将请求提交给newResult.jsp,该页面实现更新记录。运行结果下图所示。2024/9/21JavaWeb开发技术714.3.3添加记录举例例example4_9.jsp输入一个学生的全部信息,并将请求提交给newDatabase.jsp,该页面实现添加记录。运行结果下图所示。2024/9/21JavaWeb开发技术724.3.4删除记录举例例example4_10.jsp输入被删除学生的学号,并将请求提交给delete.jsp,该页面实现删除记录。运行结果下图所示。2024/9/21JavaWeb开发技术734.3.5通过本地协议纯Java方式访问SQLServer数据库首先从网上下载SQLServer驱动程序,安装在某个目录下,。将安装目录\sqljdbc加入到环境变量classpath。下面例中,showByPage.jsp访问SQLServer数据库pubs中的表student,分页显示表中的所有记录,运行结果下图所示。2024/9/21JavaWeb开发技术744.4在JSP中使用Excel电子表格(1)在控制面板中设置数据源,名字为star。为数据源选择驱动程序为Microsoft
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论