使用JDBC进行库连接.ppt_第1页
使用JDBC进行库连接.ppt_第2页
使用JDBC进行库连接.ppt_第3页
使用JDBC进行库连接.ppt_第4页
使用JDBC进行库连接.ppt_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

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

文档简介

第13章应用JDBC进行数据库连接,2,本章目标,前言了解JDBC的概念及用途JDBC数据库设计方法了解JDBC驱动程序类型理解JDBC程序的结构运用JDBC进行数据库编程,3,前言,对于那些相对独立的软件供应商而言,经常要为每一个DBMS编写一个版本的应用程序,或者为每个要访问的DBMS编写针对DBMS的代码。这就意味着,大量的资源都耗在了编写和维护DB的访问上,更不用说应用程序了。此时应用程序的评价标准不再是质量,而是它能否在给定的DBMS中访问数据库。,4,前言,这就需要开放的数据库连接,就是人们需要用一种新的方法来访问不同的数据库。为此,在系统中必须广泛使用中间件技术,以隐藏各种复杂性,屏蔽各种系统之间的差异。ODBC(OpenDataBaseConnectivity)技术和JDBC(JavaDataBaseConnectivity)技术就是这种优秀的中间件技术。,5,前言-中间件技术,使用中间件技术可以使应用程序开发者不需关心特定环境的底层细节;通过中间件访问数据库,有关代码不依赖于某一具体数据库及其所在平台,从而将更多精力集中在功能的设计,所得到的应用软件也易于移植和升级。,6,前言-中间件的作用,中间件的作用是保证网络中各部件(软件和硬件)之间透明地连接,即隐藏网络部件的异构性,尤其保证不同网络、不同DBMS和某些访问语言的透明性,即下面三个透明性。网络透明性:能支持所有类型的网络。服务器透明性:不管服务器上的DBMS是何种型号(ORACLE、SYBASE、DB2等),一个好的中间件都能通过标准的SQL语言与不同DBMS上的SQL语言连接起来。,7,前言-中间件的作用,语言透明性:客户机可用任何开发语言进行发送请求和接受回答,被调用的功能应该像语言那样也是独立的。在客户机和服务器之间传递查询及其结果是中间件最为基本的功能。中间件通常通过定义自己统一的数据模型而使不同数据库之间的数据转化问题隐藏起来,从而使应用软件开发界面透明化。,8,前言-数据库访问技术简介,客户机/服务器应用程序,数据库编程,ODBC,JDBC,两个常用的API,数据库,执行SQL语句,检索查询结果,9,数据库,ODBC,客户机/服务器GUI应用程序,ODBC(开放式数据库连接)(Microsoft提供),插入,删除,修改,应用程序编程接口,查询,10,JDBC,JDBC(Java数据库连接)(sun公司提供),Java应用程序编程接口,Java应用程序,数据库,插入,修改,删除,查询,11,13.1JDBC概述,JDBC是一种用于执行SQL语句的JavaAPI(有意思的是,JDBC本身是个商标名而不是一个缩写字;然而,JDBC常被认为是代表“Java数据库连接(JavaDatabaseConnectivity)”)。它由一组用Java编程语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,使他们能够用纯JavaAPI来编写数据库应用程序。有了JDBC,向各种关系数据库发送SQL语句就是一件很容易的事。JDBC是个“低级”接口,也就是说,它用于直接调用SQL命令。,12,JDBC与ODBC的对比,ODBC(OpenDataBaseConnectivity)是微软倡导的、当前被业界广泛接受的、用于数据库访问的应用程序编程接口(API)JDBC的设计在思想上沿袭了ODBC,JDBC保持了ODBC的基本特性,也独立于特定数据库。使用相同源代码的应用程序通过动态加载不同的JDBC驱动程序,可以访问不同的DBMS。连接不同的DBMS时,各个DBMS之间仅通过不同的URL进行标识。,13,JDBC与ODBC的对比,与ODBC一样,JDBC也支持在应用程序中同时建立多个数据库连接,采用JDBC可以很容易地用SQL语句同时访问多个异构的数据库,为异构的数据库之间的互操作奠定基础。,14,JDBC与ODBC的对比,但是,JDBC除了具有ODBC的上述相似特点外,更具有对硬件平台、操作系统异构性的支持。这主要是因为ODBC使用的是C语言,而JDBC使用的是Java语言。Java语言具有与平台无关、移植性强、安全性高、稳定性好、分布式、面向对象等众多优点,而JDBC确保了“100纯Java”的解决方案,利用Java的平台无关性,JDBC应用程序可以自然地实现跨平台特性,因而更适合于Internet上异构环境的数据库应用。,15,JDBC与ODBC的对比,此外,JDBC驱动程序管理器是内置的,驱动程序本身也可通过Web浏览器自动下载;而ODBC驱动程序管理器和ODBC驱动程序必须在每台客户机上分别安装、配置。Java可以使用ODBC,但最好是在JDBC的帮助下以JDBC-ODBC桥的形式使用.ODBC不适合直接在Java中使用,因为它使用C语言接口。从Java调用本地C代码在安全性、实现、坚固性和程序的自动移植性方面都有许多缺点。,16,JDBC的用途,简单地说,JDBC可做三件事:与数据库建立连接,发送SQL语句,处理结果。,17,JDBC的用途,下列代码段给出了以上三步的基本示例:/与数据库建立连接Connectioncon=DriverManager.getConnection(jdbc:mysql:/localhost/sql_test,“root,“root);Statementstmt=con.createStatement();/使用Statement执行SQL语句ResultSetrs=stmt.executeQuery(SELECT*FROMstudent);/处理结果while(rs.next()Stringname=rs.getString(“name);system.out.println(“name”+name);,18,JDBC数据库设计方法(1),19,在两层模型中,JavaApplet或JavaApplication将直接与数据库进行对话。其中需要一个JDBCDriver来与所访问的特定数据库管理系统进行通信。用户的SQL语句被送往数据库中,返回其结果给用户。数据库可以存放在本地机或者是网络服务器上,Java应用程序也可以通过网络访问远程数据库,如果数据库存放于网络计算机上,则是典型的客户/服务器模型应用。应用程序虽然可以是Java的Application或Applet,但是这种模型限制较多,比较适合Application,而不太适合Applet。,20,JDBC数据库设计方法(2),业务逻辑中间层,21,在三层模型中,客户通过浏览器调用Java小应用程序,小应用程序通过JDBCAPI提出SQL请求,请求先是被发送到服务的中间层,也就是调用小应用程序的Web服务器,在服务器端通过JDBC与特定数据库服务器上的数据库进行连接,由数据服务器处理该SQL语句,并将结果送回到中间层,中间层再将结果送回给用户,用户在浏览器中阅读最终结果。中间层为业务逻辑层,可利用它对公司数据进行访问控制。中间层的另一个好处是,用户可以利用易于使用的高级API,而中间层将把它转换为相应的低级调用。最后,许多情况下,三层结构可使性能得到优化,并提高安全保证。,22,JDBC数据库设计方法(3),23,13.2JDBC驱动器,在正式使用JDBC进行数据库操作之前,先来认识JDBC的基本架构,了解数据库驱动程序与数据库之间的关系。JDBC是JavaWeb应用程序开发中主要的API之一,负责对数据库的访问,再对数据库进行访问时java应用程序首先调用JDBCAPI,然后把访问语句提交给JDBC驱动器从而实现访问数据库的操作.JDBC主要包括了2个包:java.sql和javax.sql,他们几乎都是独立于数据库的.java.sql主要针对基本的数据库编程服务如连接,执行语句.javax.sql主要为数据库的高级操作提供接口和类,引入了容器管理的连接池和分布式事物等.JDBC软件包本身不能连接数据库,它只是一个API框架,需要通过数据库驱动程序或其他软件包提供方法.,24,如果要连接数据库并进行操作,基本上必须了解数据库所提供的API操作接口,然而各个厂商所提供的API操作界面并不一致,如果今天要使用A厂商的数据库,就必须设计一个专用的程序来操作A厂商数据库所提供的API,将来如果要使用B厂商的数据库,即使上层应用程序本身的目的相同,也是要编写专用于B厂商数据库之存取程序,十分的不方便。使用JDBC,可由厂商操作实现操作数据库接口的驱动程序,而Java程序设计人员调用JDBC的API并操作SQL,实际对数据库的操作由JDBC驱动程序负责。如果要更换数据库,基本上只要更换驱动程序,Java程序中只要加载新的驱动程序来源,即可完成数据库系统的变更,Java程序的部分则无需改变。,25,图应用程序、JDBC与驱动程序之间的关系,26,简单地说,JDBC希望达到的目的,是让Java程序设计人员在编写数据库操作程序的时候,可以有个统一的操作接口,无需依赖于特定的数据库API,希望达到“写一个Java程序,适用所有的数据库”的目的。JDBC数据库驱动程序按实现方式可以分为4个类型:,27,JDBC驱动程序的类型,JDBC驱动程序的类型,JDBC-ODBC桥驱动程序及ODBC驱动程序,本地API部分Java驱动程序,JDBC-Net纯Java驱动程序,本地协议纯Java驱动程序,28,Type1:JDBC-ODBCBridgeJDBC-ODBC桥驱动程序及ODBC驱动(类型1):JDBC-ODBC桥接驱动程序。其底层通过ODBC(OpendatabasConnectivity)驱动程序来连接数据库。如图所示,MicrosoftAccess数据库存取就是使用这种类型。,Type1:JDBC-ODBCBridge,29,Type2:Native-APIBridge本地API部分Java驱动程序(类型2):本地API-部份用Java来编写的驱动程序。此种方式先将JDBC函数调用转换成数据库客户端函数库的API(位于客户端计算机),然后与数据库相连。不像Type1可以对ODBC架构的数据库进行存取,如图所示。,Type2:Native-APIBridge,30,Type3:JDBC-middlewareJDBC-Net纯Java驱动程序(类型3):JDBC网络纯Java驱动程序。首先JDBC驱动程序会将JDBC函数调用解释成与数据库无关的网络通信协议,经过中介服务器的第二次解析,最后才转换成相对应的数据库通信协议.如图所示。,Type3:JDBC-middleware,31,Type4:PureJavaDriver本地协议纯Java驱动程序(类型4)本地协议纯Java驱动程序。这种驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。如图所示。,Type4:PureJavaDriver,32,安装驱动器、使用驱动器,把mysql-connector-java-5.0.4.zip解压缩,把其中的mysql-connector-java-5.0.4-bin.jar文件拷到相应的目录下1、对应用程序来说,拷贝到到jre目录下的lib目录下的ext目录下(C:ProgramFilesJavajre1.5.0_04libext),这是java的“系统扩展库”目录,其下文件会被java运行环境自动加载,可消除找不到jdbc驱动程序的现象。如果还找不到可采用如下面两个图所示添加外部JRE把JDBC添加进来2、对于WEB应用来说,拷贝到C:ProgramFilesApacheSoftwareFoundationTomcat5.5commonlib路径下此文件就是JDBC驱动Mysql下已经建立相应的数据库sql_test例、UseDriver.java向表student插入一条记录,33,34,对于项目,查看它的JRE系统库,35,13.3使用JDBC操作数据库,使用JDBC操作数据库就是使用java.sql和javax.sql这两个包的接口对数据库的操作,下面将按照其用途的不同将这些接口分类进行介绍。,36,JDBC体系结构3-1,Java程序,JDBC驱动程序,数据库,SQL命令,结果,37,JDBC体系结构3-2,应用层,Driver,Statement,ResultSet,Connection,各接口,驱动层,38,JDBC体系结构3-3,数据库,39,java.sql包3-1,40,java.sql包3-2,41,java.sql包3-3,SQLException,/*fooBar*/publicvoidfoobar()throwsSQLExceptionthrownewSQLException(“刚引发了一个SQLException”);,tryfooBar();catch(SQLExceptionex)System.out.println(“已捕获一个SQLException异常!”);System.out.println(“消息:“+ex.getMessage();System.out.println(“错误代码:“+ex.getErrorCode();,调用fooBar,42,JDBC程序访问数据库的步骤2-1,开始,导入java.sql包,加载并注册驱动程序,创建一个Connection对象,创建一个Statement对象,执行语句,关闭ResultSet对象,关闭Statement对象,关闭连接,结束,使用ResultSet对象,查询添加删除修改,43,步骤1-导入包,导入包:Importjava.sql.*;,演示:示例1,44,Friends表的结构,它演示访问数据库的各个步骤在执行示例1中的程序之前,Mysql中应该存在一个名为friends的表,演示:示例1,45,/*2007wuxiNIIT*版权所有*/importjava.sql.SQLException;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.Statement;importjava.sql.ResultSet;/*这个类演示访问数据库需遵循的各个步骤.*version1.0,2007年7月2日*author*/classJdbctest/*构造方法*/protectedJdbctest(),importjava.sql.*,46,/*这是main方法.*/publicstaticvoidmain(Stringargs)tryClass.forName(“com.mysql.jdbc.Driver);catch(ClassNotFoundExceptionce)System.out.println(ce);tryStringurl=jdbc:mysql:/localhost/sql_test;StringuserName=“root”;Stirngpassword=“root”;Connectioncon=DriverManager.getConnection(url,useName,password);Statements=con.createStatement();ResultSetrs=s.executeQuery(select*fromstudent);while(rs.next()System.out.print(rs.getString(1)+t);System.out.print(rs.getString(2)+t);System.out.print(rs.getInt(3)+t);System.out.print(rs.getDate(4)+t);System.out.println();rs.close();s.close();con.close();catch(SQLExceptionce)System.out.println(ce);,47,DriverManager类是JDBC的管理层,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。另外,DriverManager类也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等事务。DriverManager类包含一列Driver类,因此在调用通过调用DriverManager方法之前,需要加载并注册所用的驱动器类,Class.forName,这将显式地加载驱动程序类。,步骤2-加载(注册)JDBC驱动程序2-1,48,加载JDBC驱动程序通常有下列两种方法:(1)使用Class.forName()语法:Class.forName(驱动程序名称);例如:加载jdbc-odbc驱动程序,class.forName(sun.jdbc.odbc.JdbcOdbcDriver);例如:加载MysqlJDBC驱动程序:Class.forName(“com.mysql.jdbc.Driver);,49,步骤3-建立数据库连接,使用DriverManger.getConnection(),建立一个新的数据库连接。方法:方法一:getConnection(StringURL);方法二:getConnection(StringURL,java.util.Propertiesinfo);方法三:getConnection(Stringurl,Stringuser,Stringpassword);返回连接到特定数据库的Connnetion对象。参数String用来定义JDBCURL。,50,步骤3-建立数据库连接,方法三JDBCURL由三部分组成:jdbc:subProtocol:subName即主通信协议、子通信协议和子名称。例如1:连接SQLserver2000数据库可设URL为jdbc:odbc:MSSQL,其中主通信协议为jdbc,子通信协议为odbc,子名称是ODBC的数据源名称。例如2:jdbc:mysql:/localhost/sql_test,51,步骤3-建立数据库连接,方法三建立数据库连接的代码段如下:通过数据源连接:Stringurl=“jdbc:mysql:/localhost/DBName;Stringlogin=“root;Stringpassword=“root”;Connectionconn=DriverManager.getConnection(url,login,password);,52,步骤3-建立数据库连接,方法一:mysqlJDBCURL格式如下:jdbc:mysql:/host:port/database?参数名1=参数值1,53,54,步骤3-建立数据库连接,通常mysql连接URL可以设置为:Stringurl=“jdbc:mysql:/localhost:3306/test?user=root,55,步骤4-建立Statement对象执行SQL语句,因为Statement只是一个接口,没有构造函数,所以不能直接创建它的实例。但是Connection接口提供了createStatement方法专门用于创建Statement对象。Connectionconn=DriverManager.getConnection(“jdbc:mysql:/localhost/sql_test”,”root”,”root”);Statementstmt=con.createStatement();建立新数据库连接以后,必须先建立一个Statement对象才能执行SQL语句。在Java中,定义了三种类型的Statememt,它们是Statement、PreparedStatement和CallableStatement。三种均包含用于进行数据库操作的SQL语句。它们都作为在给定连接上执行SQL语句的容器,每个都专用于发送特定类型的SQL语句:Statement对象用于执行不带参数的简单SQL语句;PreparedStatement对象用于执行带或不带IN参数的预编译SQL语句;CallableStatement对象用于执行对数据库已存储过程的调用。,56,Statement方法,57,Statement接口,executeQuery(Stringsql)方法,executeUpdate(Stringsql)方法,execute(Stringsql)方法,executeBatch(Stringsql)方法,addBatch(Stringsql)方法,clearBatch(Stringsql)方法,常用于查询语句Select,返回单个结果集,用于执行Insert,Update,Delete和数据定义SQL语句如createtable,查询和修改的通用方法,用于批处理形式执行多个更新语如Update,Delete,Insert,但不执行select语句,58,步骤4-JDBC查询2-1(excuteQuery),SQL查询字符串,executeQuery()方法,作为参数传递,ResultSet,返回查询数据,SELECTname,email,phoneFROMcolleagues;,使用SQL语句,查询可编写为:,Stringstr=SELECTemp_id,lname,fnameFROMcolleagues;Statementstmt=con.createStatement();ResultSetrset=stmt.executeQuery(str);,使用JDBC编写此查询,则代码为:,Statement接口,59,步骤4-JDBC查询2-2(excuteQuery),它演示SQL中sum()方法的用法,演示:示例2,/*Jdbctest2*/importjava.sql.SQLException;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.Statement;importjava.sql.ResultSet;/*这个类演示SQL中sum()方法的用法*version1.0,2007年7月2日*authorhunk*/classJdbctest2/*构造方法*/protectedJdbctest2(),60,/*这是main方法*/publicstaticvoidmain(Stringargs)tryClass.forName(“com.mysql.jdbc.Driver);catch(ClassNotFoundExceptionce)System.out.println(ce);tryStringurl=jdbc:mysql:/localhost/test;Connectioncon=DriverManager.getConnection(url);Statements=con.createStatement();ResultSetrs=s.executeQuery(selecthiredate,sum(salary)fromfriendsgroupbyhiredate);while(rs.next()System.out.print(rs.getDate(1)+t);System.out.print(rs.getInt(2)+t);System.out.println();rs.close;s.close();con.close();catch(SQLExceptionce)System.out.println(ce);,61,演示:示例3,它演示SQL中INSERT语句的用法,/*Jdbctest3*/importjava.sql.SQLException;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.Statement;importjava.sql.ResultSet;/*这个类演示INSERT语句的用法.*version1.0,2007年7月2日*authorhunk*/classJdbctest3/*构造方法*/protectedJdbctest3(),步骤4-JDBC插入数据实现(executeUpdate),62,/*这是main方法*/publicstaticvoidmain(Stringargs)tryClass.forName(“com.mysql.jdbc.Driver);catch(ClassNotFoundExceptionce)System.out.println(ce);tryStringurl=“jdbc:mysql:/localhost/test;Stringstr=INSERTINTO“+friends(name,address,salary)“+“VALUES(朱宏,深圳,25690);Connectioncon=DriverManager.getConnection(url);Statements=con.createStatement();introwcount=s.executeUpdate(str);Stringstr1=selectname,sum(salary)“+fromfriends+groupbyname;,63,ResultSetrs=s.executeQuery(str1);while(rs.next()System.out.print(rs.getString(1)+t);System.out.print(rs.getInt(2)+t);System.out.println();rs.close();s.close();con.close();catch(SQLExceptionce)System.out.println(ce);,演示:示例3,64,步骤4-JDBC删除和修改实现(executeUpdate),它演示SQL中各种命令的用法,演示:示例4,/*Jdbc2*/importjava.sql.SQLException;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.Statement;/*这这个类演示SQL中命令的用法.*version1.0,2007年7月2日*authorhunk*/classJdbc2/*构造方法.*/protectedJdbc2(),65,publicstaticvoidmain(Stringargs)Connectioncon;Statementstmt;Stringurl;Stringsql;tryClass.forName(“com.mysql.jdbc.Driver);catch(ClassNotFoundExceptionce)System.out.println(ce);tryurl=“jdbc:mysql:/localhost/test;con=DriverManager.getConnection(url);sql=“Deletefromfriendswherenamelike张三;System.out.println();stmt=con.createStatement();stmt.executeUpdate(sql);System.out.println(张三的记录已删除“);stmt.close();con.close();,66,con=DriverManager.getConnection(url);sql=“Updatefriendssetaddress=无锡wherenamelike李四;System.out.println();stmt=con.createStatement();stmt.executeUpdate(sql);stmt.close();con.close();System.out.println(李四的记录已更新);catch(SQLExceptionce)System.out.println(ce);,67,步骤4-(executeUpdate),executeUpdate返回值是个整数,表示受影响的行数.但对于Createtable,Droptable等不操作行的数据定义的SQL语句,executeUpdate返回值是0.,68,步骤4-Statement-Execute方法,Execute可以执行查询语句和修改语句,当不知道SQL语句是什么类型的时候应用,一般情况下不常用,特别是知道类型的情况下。execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程或动态执行未知SQL字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。,69,步骤4-Statement-Execute方法,输入SQL语句,execute(sql),判断返回值是true或是false,getResultSet(),getUpdateCount(),true,false,getMoreResults(),如果为-1则表示结果是结果集或没有结果其他数值表示更改的行数,返回null,没有结果,70,Statement-ExecuteBatch方法,用于以批处理形式执行多个更新语句,例如:insert,update,delete以及数据定义SQL,不执行有返回结果集的SQL语句如:select,输入SQL语句,add.Batch(sql),executeBatch(),clearBatch(),添加更新语句,71,PreparedStatement接口3-1,PreparedStatement接口和Statement类的不同之处在于PreparedStatement类对象会将传入的SQL命令事先编好等待使用,当有单一的SQL指令需多次执行时,用PreparedStatement会比Statement效率更高。,72,PreparedStatement接口3-1,PreparedStatement接口(预编译的SQL语句),PreparedStatement用于提高运行时效率,执行PreparedStatement对象比执行Statement对象快,Statement接口,73,PreparedStatement,包含于PreparedStatement对象中的SQL语句可具有一个或多个IN参数。IN参数的值在SQL语句创建时未被指定。相反的,该语句为每个IN参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX方法来提供。PreparedStatementpstmt=con.prepareStatement(UPDATEtable4SETm=?WHEREx=?);,In参数,In参数,包含于PreparedStatement对象中的SQL语句可具有一个或多个IN参数。IN参数的值在SQL语句创建时未被指定。相反的,该语句为每个IN参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX方法来提供。PreparedStatementpstmt=con.prepareStatement(UPDATEtable4SETm=?WHEREx=?);,In参数,In参数,74,PreparedStatement,pstmt.setLong(1,12345);pstmt.setString(2,“aa”);pstmt.executeUpdate();pstmt.setString(1,Hi);for(inti=0;i?;PreparedStatementpstmt=con.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);pstmt.setInt(1,5000);ResultSetrs=pstmt.executeQuery();while(rs.next()System.out.print(rs.getString(1)+t);System.out.print(rs.getString(2)+t);System.out.print(rs.getInt(3)+t);System.out.print(rs.getDate(4)+t);System.out.print(rs.getInt(5)+t);System.out.println();rs.close();pstmt.close();con.close();catch(SQLExceptionce)System.out.println(ce);/*这是main方法*/publicstaticvoidmain(Stringargs)RetrieveRecordsretRec=newRetrieveRecords();retRec.display();,84,CallableStatement接口,CallableStatement接口用于执行对数据库已存储过程的调用。在CallableStatement对象中,有一个通用的成员方法call,这个方法以名称的方式调用数据库中的存储过程。在数据库调用过程中,可以通过设置IN参数向调用的存储过程提供执行所需的参数。另外,在存储过程的调用中,通过OUT参数获取存储过程的执行结果。注:out参数是输出参数,过程向主程序传递参数值inout参数:双向参数,过程与主程序双向交流数据,85,CallableStatement接口,创建CallableStatement对象CallableStatementcstmt=con.prepareCall(“call过程名(?,?.)”);/没返回值带参数CallableStatementcstmt=con.prepareCall(“?=call过程名(?,?.)”);/有返回值带参数CallableStatementcstmt=con.prepareCall(“call过程名”);/没返回值不带参数IN,OUT,INOUT参数将IN,INOUT参数传给CallableStatement对象是通过setXXX方法完成的。OUT,INOUT调用registerOutParameter方法先注册先检索结果,再检索OUT参数如果CallableStatement对象返回多个ResultSet对象(通过调用execute方法),在检索OUT参数前应先检索所有的结果。检索作为OUT参数的NULL值返回到OUT参数中的值可能会是JDBCNULL。,86,步骤5-使用基本结果集1-1,使用Statement实例执行一个SQL语句之后得到的一个ResulSet的对象。其类型分为三种:基本结果集,可滚动结果集,可更新结果集。ResultSet对象完全依赖于Statement对象和Connection对象每次执行SQL语句时,都会用新的结果重写结果集当相关的Statement关闭时,ResultSet对象会自动关闭,Next(),get(),此方法将光标从当前位置下移一行,从ResultSet对象返回数据,87,步骤5-使用基本结果集1-2,它演示对当前行的处理使用next()方法时,记录是按顺序处理的必须按照数据返回的顺序处理每行中的数据,ResultSetrset=stmt.getResultSet();while(rset.next()Stringdept_name=rset.getString(1);,88,步骤5-使用基本结果集1-3,演示对当前列的处理使用get()方法可以直接访问列,Statementstmt=con.createStatement();Stmt.executeQuery(Selectemp_id,fnamefromEmployee);ResultSetrset=stmt.getResultSet();while(rset.next()Stringename=rset.getString(fname);System.out.println(ename);,89,步骤5-使用基本结果集1-4,Statement语句对象创建方式:a.Statement语句:createStatement()b.PreParedStatement语句:preparedStatement(Stringsql)c.CallableStatement语句:prepareCall(Stringsql)主要方法:a.booleannext()方法将游标移到下一行,如果是有效数据则返回true,注意查询语句返回的结果中游标的位置为第一行的前面。b.getXXX(intcolumnIndex)方法按列号返回当前行中指定列的值,并将其转换为方法中XXX所对应的java数据类型。c.getXXX(StringcolumnName)方法按名返回当前行中指定列的值,并将其转换为方法中XXX所对应的java数据类型。,90,步骤5-使用基本结果集1-5,以下代码显示值1被作为参数传递给getString()方法,,Statementstmt=con.createStatement();stmt.executeQuery(Selectemp_id,fnamefromEmployee);ResultSetrset=stmt.getResultSet();while(rset.next()Stringemployeeid=rset.getString(1);,91,步骤5-使用可滚动的结果集2-1,创建可滚动和可更新结果集的方法检索方法:提供各种定位游标的方法自由地再结果集中滚动。弥补了基本结果集只能先前滚动的局限性。Statement:createStatement(intresultSetType,intreslutSetConcurrency)PrepareStatement:prepareStatement(Stringsql,intresultSetType,intreslutSetConcurrency)CallableStatement:prepareCall(Stringsql,intresultSetType,intreslutSetConcurrency),92,ResultSet中描述可滚动结果集和可更新结果集的常量,步骤5-使用可滚动的结果集2-2,93,步骤5-使用可滚动的结果集2-3,不可滚动,可滚动,光标仅向前移动,光标可前后移动,也可移动至与当前位置相对的某一行,光标可前后移动,也可移动至与当前位置相对的某一行如果对数据库做了更改,则新值是可见的,结果集1,TYPE_SCROLL_INSENSITIVE,TYPE_SCROLL_SENSITIVE,TYPE_FORWARD_ONLY,94,步骤5-使用可滚动的结果集2-4,不可更新,可更新,结果集不可更新,结果集可更新,结果集2,CONCUR_UPDATABLE,CONCUR_READ_ONLY,95,步骤5-使用可滚动的结果集2-5用于结果集滚动的主要方法,booleanprevious()booleanfirst()booleanlast()voidbeforeFirst()将游标移到第一行之前voidafterLast()将游标移到最后一行之后booleanrelative(introws)相对于游标的当前位置将游标移动参数rows指定的行数,正数前负后。booleanabsolute(introw)将游标移动到参数row指定的数据行rows为正从结果集的开始向前,负从结果集的末尾向后,为零移到第一行之前。判断游标当前位置的方法BooleanisBeforeFirst()如果游标位于第一行之前返回true.BooleanisAfterLast()最后一行之后BooleanisFirst()BooleanisLast(),96,步骤5-使用可更新结果集3-1,可更新结果集的数据并将这些更新保存到数据库中。创建方式:Statement:createStatement(intresultSetType,intreslutSetConcurrency)PrepareStatement:prepareStatement(Stringsql,intresultSetType,intreslutSetConcurrency)CallableStatement:prepareCall(Stringsql,intresultSetType,intreslutSetConcurrency)注意:reslutSetConcurrency为CONCUR_UPDATABLE,97,步骤5-使用可更新结果集3-2用于更新结果集的主要方法,更新的方法是,把ResultSet的游标移动到你要更新的行,然后调用updateXXX()(updateXXX()方法,有两个参数,第一个是要更新的列,可以是列名或者序号。第二个是要更新的数据,这个数据类型要和XXX相同)使用updateXXX方法还可以完成插入操作。但是首先要介绍两个方法:moveToInsertRow()是把ResultSet移动到插入行,这个插入行是表中特殊的一行,不需要指定具体那一行,只要调用这个方法系统会自动移动到那一行的。只有当游标处于当前行时才能调用该方法。moveToCurrentRow()这是把ResultSet移动到记忆中的某个行,通常当前行。如果没有使用insert操作,这个方法没有什么效果,如果使用了insert操作,这个方法用于返回到insert操作之前的那一行,离开插入行,当然也可以通过next(),previous()等方法离开插入行。,98,步骤5-使用可更新结果集3-3用于更新结果集的主要方法,要完成对数据库的插入,首先调用moveToInsertRow()移动到插入行,然后调用updateXXX的方法完成对,各列数据的更新,完成更新后和更新操作一样,要写到数据库,不过这里使用的是insertRow(),也要保证在该方法执行之前ResultSet没有离开插入列,否则插入不被执行,并且对插入行的更新将丢失。,99,步骤六-结束,关闭ResultSet对象关闭Sta

温馨提示

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

评论

0/150

提交评论