1、SLIDE TITLE,Body Text,Second Level,顶顶顶顶,高等教育自学考试,Java,语言程序设计,(,一,),海天培训学校,主讲教师:刘波,liubocq,第十章,网络与数据库编程基础,学习重难点及要求,重点,:,支持,Java,程序访问网上资源的类及其方法,网络编程应用。支持,Java,程序与数据库连接、数据表查询、数据记录修改和插入的类及其方法,数据库编程应用。,难点,:,网络套接字、客户机端与服务器端实现通信的应用程序。支持Java实现数据库编程的类,程序实现数据修改和插入的方法,数据库编程应用。,要求,:,一般掌握,。考试分值约占,5%,学习内容,10.1 Ja
2、va,网络编程基础,10.2,缓冲式输入输出,Java,语言的优势之一是,Java,程序能访问网络资源,1.TCP/IP,协议和,IP,地址,为了进行网络通信,通信双方必须遵守通信协议。目前最广泛使用的是,TCP/IP,协议族,TCP(Transport Control Protocol),是一种传输控制协议,IP(Internet Protocol),是一种网际协议,TCP/IP,代表这两个协议的。,10.1.1,IP地址和InetAddress类,TCP/IP分为四个层次:,网络接口层,负责接收和发送物理帧;,网络层,负责相邻节点之间的通信;,传输层,负责起点到终点的通信;,应用层,提供诸
3、如文件传输、电子邮件等应用程序。,事实上,,TCP/IP,协议族的分层还有多种分法。,10.1.1,IP地址和InetAddress类,TCP/IP,协议的工作原理(分组交换过程):,TCP,协议将任何网络信息传输当作信息流。,机器上的一个长报文发送到机器,发送端需要将数据分片,然后把一片片数据分别打包发送(数据分组)。,数据包有一个头(,IP,数据报的报头),指明该数据包发往何处(目标,IP,地址)、包中数据在接收序列中所处的位置。,每个包都按照,IP,地址提供的目的地从一个台机器(路由器)传送到另一台机器(路由器),或从一个网络节点传送到另一个网络节点。即,路由与寻址过程,。,在接收端,这
4、些数据包都能够按照正确的顺序重新组装起来。,10.1.1,IP地址和InetAddress类,TCP/IP,协议族:,Telnet,:,远程登录,允许一台计算机用户登录到另一台远程计算机上,使远程操作如同在本地计算机上操作一样,。,FTP,(,File Transfer protocol,):文件传输协议,允许用户将远程主机上的文件复制到自己的计算机上,SMTP(simple Mail Transfer Protocol),:简单邮件传输协议,用于传输电子邮件,NFS(Network file Server),网络文件服务器,使多台计算机透明地访问彼此的目录,HTTP,是一种超文本传输协议,它
5、是基于,TCP/IP,协议的,是浏览器和服务器之间应用层的通信协议。,HTTP,是一种通用、无状态、面向对象的协议。,HTTP,会话(事务)包括四个步骤:连接(,Connection,)、请求(,Request,)、应答(,Response,)和关闭(,Close,)。,10.1.1,IP地址和InetAddress类,Java语言可编写低层的网络应用。例如,,传输文件,,建立邮件控制器,,处理网络数据。,Java语言支持的Internet协议有ftp、telnet、www等,支持网络通信的软件都在包中,例如,:,.ftp,.www等。,10.1.1,IP地址和InetAddress类,IP地
6、址用于指明因特网上的一台计算机在网络中的地址,用 32 位二进制代码表示一个网络地址。,IP,地址用点分十进制表示。,地址分、五类,常用的是、三类:,(.0.0.0-126.255.255.255),0,7位网络号,后24位为主机号。,(128.0.0.0-191.255.255.255),10,14位网络号,后16位为主机号,C(192.0.0.0-223.255.255.255),110,21位网络号,后8位为主机号,D(224.0.0.0-239.255.255.255),1110,28位多点广播组标号.,E(240.0.0.0-254.255.255.255),1111,保留试验使用。
7、在因特网上,域名服务器(,Domain Name Server,DNS,)执行文字名称到二进制网络地址的映射。,10.1.1,IP地址和InetAddress类,InetAddress,类,J,包中有,InetAddress,类的定义,,InetAddress,类的对象用于,IP,地址和域名,该类提供以下方法:,(,1,),getByName(String s),获得一个,InetAddress,类的对象,该对象中含有主机的,IP,地址和域名,该对象用如下格式表示它包含的信息:,getHostName(),获取,InetAddress,对象的域名。,(,3,),String getHostA
8、ddress(),获取,InetAddress,对象的,IP,地址。,(,4,),getLocalHost(),获得一个,InetAddress,对象,该对象含有本地机的域名和,IP,地址。,10.1.1,IP地址和InetAddress类,Import.*;,Class Example10_1,Public static void main(String args),Try /,以下代码通过域名建立,InetAddress,对象:,InetAddress addr=InetAddress.getByname(“”);,String domainName=addr.getHostName();
9、/,获得主机名,String IPName=addr.getHostAddress();/,获得,IP,地址,System.out.println(domainName);,System.out.println(IPName);,catch(UnknownHostException e),e.printStackTrace();,10.1.1,IP地址和InetAddress类,统一资源定位符,URL(Uniform Resource Locator),是 客户机访问,Internet,时用来标识资源的名字和地址。,超文本链路由统一资源定位符,URL,维持。,URL,的格式是:,:/,其中:,
10、Method,是传输协议:,HOSTNAME,是文档和服务器所在的,Internet,主机名(域名系统中,DNS,中的点地址),;PORT,是服务端口号(可省略);,PATH,是路径名,,FILE,是文件名。,例如:,(,是主机名,,home/welcome.html,是文件路径和文件名,),10.1.2 统一资源定位符URL,1.URL,类,J,包有,URL,类,一个,URL,对象可以表示一个网络资源。程序利用,URL,对象能实现,Internet,寻址、网络资源的定位连接、在客户机与服务器之间直接访问等。,URL,类的构造方法是,URL(String s),其中,,s,指出网络中的一个资源
11、利用,URL,对象访问网上资源的方法是:先创建,URL,对象,如以下代码所示:,try,URL myURL=new URL(“:80/”);,catch(MalformedURLException e),System.out.println(“,有错的,URL:”+url+e);,因创建,URL,对象可能会产生,MalformedURLException,异常。所以,创建,URL,对象的代码应出现在,trycatch,语句块中,以便能捕捉网址错误异常。,10.1.2 统一资源定位符URL,URLConnection类,要接收和发关信息还要用URLConnection类,程序获得一个URLC
12、onnection对象,相当于完成对指定URL 的一个HTTP 连接。,URL mu=new URL(“muC=mu.openConnection();/获得URLConnection对象,由上可知,先要创建一个,URL 对象,然后利用URL 对象的openConnection()方法,从系统获得一个URLConnection对象。,程序有了URLConnection对象后,就可使用URLConnection类提供的以下方法获得流对象和实现网络连接:,(1)getOutputStream(),获得向远程主机发送信息的OutputStream流对象。,(2)getInputStream(),获得
13、从远程主机获取信息的 InputStream 流对象。,有了网络连接的输入和输出流,程序就可实现远程通信。,(3)connect(),设置网络连接。,10.1.2 统一资源定位符URL,信息的发送和接收,发送和接收信息要获得流对象,并由流对象创建输入或输出数据流对象。,然后,就可以用流的方法访问网上资源。,网上资源使用结束后,数据流也应及时关闭。用,close()关闭建立的流。,URL url=new URL(urlName);/,由网址创建,URL,对象,URLConnection tc=url.openConnectin();/,获得,URLConnection,对象,tc.connect
14、);/,设置网络连接,InptStreamReader in=new InputStreamReader(tc.getInputStream();,BufferedReader dis=new BufferedReader(in);/,采用缓冲式输入,while(String inline=dis.readLine()!=null),showArea.append(inline+”n”);,dis.close();/,网上资源使用结束后,数据流及时关闭,10.1.2 统一资源定位符URL,网络应用模式主要有:,主机,/,终端模式,集中计算,集中管理;,客户机,/,服务器,(Client/Se
15、rver,/,),模式,分布计算,分布管理;,浏览器,/,服务器模式,利用,Internet,跨平台。,(万维网)就是建立在客户机,/,服务器模式上,以,HTML,语言和,HTTP,协议为基础,能够提供各种,Internet,服务的信息浏览系统。,网络信息放在主机的不同位置,服务器利用超文本链路链接各项信息。,客户机(浏览器,Brower,)负责与服务器建立联系,向服务器发送请求,处理,HTML,超媒体,提供图形用户界面(),显示信息等。,10.1.3 客户机/服务器模式,在,C/S,模式中,在,Server,端,要准备接受多个,Client,端计算机的通信。,为此,除用,IP,地址标识,In
16、ternet,上的计算机之外,另还引入端口号,用端口号标识正在,Server,端后台服务的线程。,端口号与,IP,地址的组合称为网络套接字(,socket,)。,Java,语言在实现,C/S,模式中,套接字分为两类:,在,Server,端,,ServerSocket,类支持底层的网络通信;,在,Client,端,,Socket,类支持网络的底层通信。,Server,机通过端口(总线,I/O,地址)提供面向,Client,机的服务;,Server,机在它的几个不同端口分别同时提供几种不同的服务。,Client,接入,Server,的某一端口,通过这个端口提请,Server,机为其服务,。,规定:
17、端口号,1023,供系统专用。,例如,,HTTP,协议在端口,80,,,telnet,协议在端口,23,。端口,102465535,供应用程序使用,10.1.3 客户机/服务器模式,当,Client,程序和,Server,程序需要通信时,可以用,Socket,类建立套接字连接。,套接字连接可想象为一个电话呼叫:,最初是,Client,程序建立呼叫,,Server,程序监听;,呼叫完成后,任何一方都可以随时讲话。,双方实现通信有流式,socket,和数据报式,socket,两种可选方式。,流式,socket,是有连接的通信,即,TCP(Transmission Control Protocol)
18、每次通信前建立连接,通信结束后断开连接。特点是可以保证传输的正确性、可靠性。,数据报式,socket,是无连接的通信,即,UDP(User Datagram Protocol),。将欲传输的数据分成小包,直接上网发送。无需建立连接和拆除连接,速度快,但无可靠保证。,流式,socket,在,Client,程序和,Server,程序间建立通信的通道。每个,socket,可以进行读和写两种操作。对于任一端,与对方的通信会话过程是:,建立,socket,连接,获得输入,/,输出流,读数据,/,写数据,通信完成后关闭,socket,(拆除连接)。,10.1.3 客户机/服务器模式,流式,Socket
19、的通信过程,【,客户端,】,:,利用,socket,的构造方法,可以在客户端建立到服务器的套接字对象:,Socket(String host,int port),host,是服务器的,IP,地址,,port,是端口号,这些是预先约定的。,例如:,try,Socket mySocket=new Socket(“”,1860,);,catch(IOException e),然后,用,getInputStream(),方法获得输入流,用这个输入流读取服务器放入“线路”的信息;,用,getOutputStream(),方法获得输出流,用这个输出流将信息写入“线路”。,10.1.3 客户机/服务器模式
20、流式,Socket,的通信过程,【,服务端,】,利用,ServerSocket,的构造方法可以在服务器建立接受客户套接字的服务器套接字对象:,ServerSocket(int port),指定端口号,创建一个,ServerSocket,对象。,port,与客户端口号相同。,try,ServerSocket serverSocket=new ServerSocket(1860);,catch(IOException e),服务器端程序在指定的端口监听,当收到,Client,程序发出的服务请求时,创建一个套接字对象与该端口对应的,Client,程序通信。确立了对象,serverSocket,后,
21、就可能它使用,accept(),方法,得到,Socket,对象,接收,Client,程序来自套接字,mySocket,的信息。,try,Socket sc=serverSocket.accept();/ac,是一个,Socket,对象,catch(IOException e),要撤销服务,可以关闭,Socket,对象,sc,;,sc.close();,【,阅读程序:,P194-195,例,10.3,和,10.4】,10.1.3 客户机/服务器模式,一个网络关系数据库应用系统是一个三层结构。,客户机与服务器采用网络连接,客户机端应用程序按通信协议与服务器端的数据库程序通信;,数据库服务程序通过,
22、SQL,命令与数据库管理系统通信,10.2 Java 数据库编程基础,Java 程序与数据库连接方法有两种。,一种是使用 JDBC-ODBC 桥接器与数据库连接,一种是用纯Java 的JDBC 驱动程序实现与数据库连接。,1 使用JDBC-ODBC 桥接器与数据库连接,先由数据库应用程序,把,JDBC API,调用转换成,ODBC API,调用,再,向 ODBC 驱动管理器发出,这个,API 调用,,ODBC 驱动管理器将这个调用转换成向数据库管理系统的 ODBC 驱动程序调用,数据库管理系统又将这个调用转换成对操作系统的数据输入/输出调用,最后,操作系统从数据库中得到实际数据逐级返回。,10
23、2.1 Java程序与数据库连接,10.2.1 Java程序与数据库连接,在设定了数据源的基础上,,Java,程序要访问数据库表,还要建立,JDBC-ODBC,桥接器,让程序与数据库连接。以后,程序就可向数据库发送,SQL,语句,处理数据库返回的结果。,Java,数据库连接,JDBC(Java DataBase Connectivity),由一组用,Java,语言编写的类和接口组成,,JDBC,是,Java,程序与数据库连接,API,。它能做以下三件事情:,与某个数据库建立连接,向数据库发送,SQL,语句,处理数据库返回的结果。,调用类方法,Class.forName(String s),能
24、建立,JDBC-ODBC,桥接器。,try,Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);/,加载驱动,catch(Exception e),10.2.1 Java程序与数据库连接,连接过程:,try,Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);/,加载驱动,Connection con=DriverManager.getConnection(url,username,password);,catch(Exception e),/,处理异常,catch(SQLExceotuib e),/,处理异常,1
25、0.2.1 Java程序与数据库连接,1,用纯,Java,的,JDBC,驱动程序实现与数据库连接,使用纯,Java,的,JDBC,驱动程序实现与数据库连接的过程如下:,(1),加载驱动程序(有两种加载驱动程序的方式):,一各是将驱动程序添加到,java.lang.System,的属性,jdbc.drivers,中。这是一个,DriverManager,类加载驱动程序类名的列表,表元用冒号分隔。,另一种方式是从相关的网站下载驱动程序后,在程序中利用,Class.forName(),方法加载指定的驱动程序:,Class.forName(“com.microsoft.jdbc.sqlserver.S
26、QLServerDriver”);,10.2.1 Java程序与数据库连接,(2),创建指定数据库的,URL,数据库的,URL,对象类似网络的统一资源定位符,其格式是:,jdbc:subProtocol:subName:/hostname:port:Databasename=XXX,其中,,subprotocol,是某种驱动程序支持的数据库连接机制;,subName,是当前连接机制下的具体名称;,hostName,是主机名;,port,是相应的连接端口;,DatabaseName,是要连接的数据库名称。,例如,以下代码可以是一个数据库的,URL,:,jdbc:Microsoft:sqlserv
27、er:/localhost:1433;Databasename=ksinfo,该数据库的,URL,说明利用,miscrosoft,提供的机制,用,sqlserve,驱动,通过,1433,端口访问本机上的,ksInfo,数据库。,10.2.1 Java程序与数据库连接,(3),建立连接,驱动程序管理器,(DriverManager),的方法,getConnection(),建立连接。,Connection con=DriverManager.getConnection(url,username,password);,10.2.1 Java程序与数据库连接,1 DriverManager类,Dri
28、verManager 类处理驱动程序的加载和建立新数据库连接。,DriverManager 是java.sql 包中用于管理数据库驱动程序的类。通常,应用程序只使用类 DriverManager 的 getConnection()静态方法,用来建立与数据库的连接,返回Connection对象:,static Connection getConnection,(,String url,String username,String password),指定数据的URL,、,用户名和密码创建数据库连接对象。,以,Oralce,为例:,Connection conn=DriverManager.get
29、Connection(“jdbc:oracle:thin:localhost:1521:DataBase Name”,“,用户名,”,“,密码,);,10.2.2 几个重要的类和接口,2 Connection类,Connection 类是 java.sql 包中用于处理与特定数据库连接的类。Connection 对象是用来表示数据库连接的对象,Java 程序对数据库的操作都在这种对象上进行。,Connection类的主要方法有:,Statement createStatement(),创建一个Statement对象。,Statement createStatement(int resultSe
30、tType,int resultSetConcurrency),创建一个 Statement 对象,生成具有特定类型的结果集。,void commit(),提交对数据库的改动并释放当前持有的数据库的锁。,void rollback(),回滚当前事务中的所有改动并释放当前连接持有的数据库的锁。,String getCatalog(),获得连接对象的当前目录。,boolean isClose(),判断连接是否已关闭。,boolean isReadOnly(),判断连接是否为只读模式。,void setReadOnly(),设置连接为只读模式。,void close(),释放连接对象的数据库和JDB
31、C资源。,10.2.2 几个重要的类和接口,3 Statement类,Statement类是java.sql包中用于在指定的连接中处理SQL语句的类。,数据库编程的要点是在程序中嵌入SQL命令。,程序需要声明和创建连接数据库的 Connection 对象,并让该对象连接数据库。,调用类 DriverManager的静态方法getConnection()获得Connection对象,实现程序与数据库的连。,然后,用Statement类声明SQL语句对象,并调用Connection对象的createStatement()方法,创建SQL语句对象。,代码如下:,Statement sql=null;
32、try,sql=con.createStatement();,catch(SQLException e),10.2.2 几个重要的类和接口,4 ResultSet类,有了,SQL,语句对象后,调用语句对象的方法,executeQuery(),执行,SQL,查询,并将查询结果存放在一个用,ResultSet,类声明的对象中,如:,ResultSet rs=sql.executeQuery(“SELECT *FROM ksInfo”);,ResultSet,对象实际上是一个由查询结果数据的表,是一个管式数据集,由统一形式的数据行组成,一行对应一条查询记录。,在,ResultSet,对象中隐含着一
33、个游标,一次只能获得游标当前所指的数据行,用,next(),方法可取下一个数据行。,用数据行的字段,(,列,),名称或位置索引,(,自,1,开始,),调用形如,getXXX(),方法获得记录的字段植。,10.2.2 几个重要的类和接口,4 ResultSet类,以下是,ResultSet,对象的部分方法:,(1)byte getByte(int columnIndex),返回指定字段的字节值。,(2)Date getDate(int columnIndex),返回指定字段的日期值。,(3)float getFloat(int columnIndex),返回指定字段的浮点值。,(4)int ge
34、tInt(int columnIndex),返回指定字段的整数值。,(5)String getString(int columnIndex),返回指定字段的字符串值。,(6)double getDouble(String columnName),返回指定字段的双精度值。,(7)long getLong(String columnName),返回指定字段的,long,型整值。,(8)boolean next(),返回是否还有下一字段。,以上方法中的,columnIndex,是位置索引,用于指定字段,,columnName,是字段名。,10.2.2 几个重要的类和接口,4 ResultSet类,用
35、户需要在查询结果集上浏览,或前后移动、或显示结果集的指定记录,这称为可滚动结果集,程序要获得一个可滚动结果集,只要在获得,SQL,的语句对象时,增加指定结果集的两个参数即可。,Statement stmt=con.createStatement(type,concurrency);,ResultSet rs=stmt.executeQuery(SQL,语句,),int,型参数,type,决定可滚动集的滚动方式:,ResultSet.TYPE_FORWORD_ONLY,结果集的游标只能向下滚动。,ResultSet.TYPE_SCROLL_INSENSITIVE,游标可上下移动,当数据库变化时,
36、当前结果集不变。,ResultSet.TYPE_SCROLL_SENSITIVE,,游标可上下移动,当数据库变化时,当前结果集同步改变,int,型参数,concurrency,决定数据库是否与可滚动集同步更新?,ResultSet.CONCUR_READ_ONLY,不能用结果集更新数据库中的表。,ResultSet.CONCUR_UPDATETABLE,能用结果集更新数据库中的表。,10.2.2 几个重要的类和接口,4 ResultSet类,可滚动集上另外一些常用的方法如下:,boolean previous(),将游标向上移动,当移到结果集的第一行时,返回,false,。,void befo
37、reFirst(),,将游标移结果集的第一行之前。,void afterLast(),将游标移到结果集的最后一行之后。,void first(),,将游标移到第一行。,void last(),将游标移到最后一行。,boolean isAfterLast(),判游标是否在最后一行之后。,boolean isBeforeFirst(),判游标是否在第一行之前。,boolean isLast(),判游标是否在最后一行。,boolean isFirst(),判游标是否在第一行。,int getRow(),获取当前所指的行,(,行号自,1,开始编号,结果集空,返回,0),。,boolean absolu
38、te(int row),将游标移到,row,行。,10.2.2 几个重要的类和接口,利用Connection对象的createStatement方法建立Statement对象,,利用Statement对象的executeQuery()方法执行SQL 查询语句进行查询,返回结果集,,再形如getXXX()的方法从结果集中读取数据。,经过这样的一系列步骤就能实现对数据库的查询。,见例 10.9,10.2.3 数据库查询,数据库更新操作包括数据表创建、删除、以及数据表记录的增加、删除、修改等操作。,如果利用数据,SQL,命令实现,则利用,Statement,对旬的,executeUpdate(),方
39、法,,执行,SQL,的,update,语句,实现数据表的修改;,执行,SQL,的,insert,语句,实现数据表记录的添加。,与数据表连接时,需指定获得的,ResultSet,对象是可更新的。,stmt=connect.createStatement(,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE,);,10.2.4 数据库更新,1,插入数据表记录(插入数据表记录有,3,种方案),(1),使用,Statement,对象,实现插入数据表记录的,SQL,语句的语法是:,insert into,表名,(,字段名,1,,字段名
40、2,)value(,字段值,1,,字段值,2,,,),(2),使用,ResultSet,对象,使用,ResultSet,对象的方法,moveToInsertRow(),将数据表游标移到插入位置,输入数据后,用方法,insertRow(),插入记录。,(3),使用,PrepareStatement,对象,与使用,Statement,对象的方法类似,只是创建,SQL,语句时暂时用参数?表示值,然后由,SQL,语句对象生成,PrepareStatement,对象,插入时通过设定实际参数,实现记录的更新。,10.2.4 数据库更新,2 修改数据表记录,(有,3,种方案),(1),使用,Stateme
41、nt,对象,update,表名,set,字段名,1=,字段值,1,,字段名,2=,字段值,2,,,where,特定条件,(2),使用,ResultSet,对象,先建立,ResultSet,对象,然后直接设定记录的字段值,修改数据表的记录,(3),使用,PrepareStatement,对象,创建SQL 语句时,暂时用参数?表示值,然后由SQL 语句对象生成PrepareStatement对象,接着通过设定实际参数实现记录的更新。,10.2.4 数据库更新,3 删除数据表记录,(有,3,种方案),(1),使用,Statement,对象,delete from,表名,where,特定条件,(2),使用,ResultSet,对象,先创建一个,SQL,语句,然后调用,Statement,对象的,executeUpdate(),方法,(3),使用,PrepareStatement,对象,创建SQL 语句时,暂时用参数?表示值,然后由SQL 语句对象生成PrepareStatement对象,接着设定实际参数实现特定记录的删除。,10.2.4 数据库更新,






