网络与数据库编程基础经典教程_第1页
网络与数据库编程基础经典教程_第2页
网络与数据库编程基础经典教程_第3页
网络与数据库编程基础经典教程_第4页
网络与数据库编程基础经典教程_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

第十章网络与数据库编程基础主要内容支持Java程序访问网上资源的类及其方法。支持Java程序与数据库连接、数据表查询、数据记录修改和插入的类及其方法。重点支持Java程序访问网上资源的类及其方法,网络编程应用。支持Java程序与数据库连接、数据表查询、数据记录修改和插入的类及其方法,数据库编程应用。难点网络套接字、客户机端与服务器端实现通信的应用程序。支持Java实现数据库编程的类,程序实现数据记录修改和插入的方法,数据库编程应用。Java网络编程基础IP地址和InetAddress类1.TCP/IP协议和IP地址通信双方必须遵守通讯协议。目前最广泛使用的是TCP/IP协议,它是Internet网中各方所遵循的公共协议。TCP(TransportControlProtocol)是一种传输控制协议,IP(InternetProtocol)是一种网际协议,TCP/IP代表这两个协议的结合。TCP/IP分为四个层次:网络接口层,负责接收和发送物理帧;网络层,负责相邻节点之间的通信;传输层,负责起点到终点的通信;应用层,提供诸如文件传输、电子函件等应用程序。TCP协议将任何网络信息传输当作信息流。例如,机器A上的一个长报文发送到机器B,发送端A需要将数据分片,把一片片数据分别打包发送。数据包有一个头,指明该数据包发往何处、包中数据在接收序列中所处的位置。每个包都按照IP地址提供的目的地从一台机器传送到另一台机器,或从一个网络节点传送到另一个网络节点。在接收端B,这些数据包都能够按照正确的顺序重新组装起来。TCP/IP协议是一个协议族,由一组协议组成,主要包含以下更具体的协议:Telnet(RemoteLogin),远程登录,允许一台计算机用户可以登录到另一台远程计算机上,使远程操作如同在本地计算机上操作一样。

FTP(FileTransferProtocol),文件传输协议,允许用户将远程主机上的文件拷贝到自己的计算机上。TCP/IP协议是Internet网中各方所遵循的公共协议。TCP(TransportControlProtocol)是一种传输控制协议。IP(InternetProtocol)是一种网际协议。TCP/IP是协议族,TCP/IP可分为:网络接口层:负责接收和发送物理帧。网络层:负责相邻接点之间的通信。传输层:责起点到终点的通信应用层:提供诸如文件传输、电子函件等应用程序。TCP/IP协议族Telnet(RemoteLogin)提供远程登录功能,一台计算机用户可以登录到远程另一台计算机上,远程操作如同本地直接操作一样。

FTP(FileTransferProtocol)远程文件传输协议,允许用户将远程主机上的文件拷贝到自己的计算机上。SMTP(SimpleMailtransferProtocol)简单邮政传输协议,用于传输电子邮件。NFS(NetworkFileServer)网络文件服务器,使多台计算机透明地访问彼此的目录。IP地址用于指出因特网上的一台计算机在网中的地置,由32位

二进位表示具体的地址。地址分A、B、C、D、E五类,常用的是A、B、C三类。A(-55),0,7位网络号,后24位为主机号B(-55),10,14位网络号,后16位为主机号C(-55),110,21位网络号,后8位为主机号D(-55),1110,28位多点广播组标号E(-55),1111,保留试验使用通常地址表示形式用四段十进制数表示(8位一段):

或用文字域名表示:

其中:文字名称在因特网上有一种特殊的服务器(域名服务器(DomainNameServer,DNS)),来执行这种地址映射。InetAddress类

包中有InetAddress类的定义,InetAddress类的对象用于存储IP地址和域名,该类提供以下方法:(1)getByName(Strings),获得一个InetAddress对象,该对象中含有主机的IP地址和域名,该对象用如下格式表示它包含的信息:/0(2)StringgetHostName(),获取InetAddress对象的域名。(3)StringgetHostAddress(),获取InetAddress对象的IP地址。

(4)getLocalHost(),获得一个InetAddress对象,该对象含有本地机的域名和IP地址。【例10.1】说明InetAddress类的用法的应用程序。程序演示如何获取的域名和IP地址。运行结果为:import.*;classExample10_1{public

static

voidmain(Stringargs[]){try{//以下代码通过域名建立InetAddress对象: InetAddressaddr=InetAddress.getByName(""); StringdomainName=addr.getHostName();//获得主机名 StringIPName=addr.getHostAddress();//获得IP地址 System.out.println(domainName); System.out.println(IPName);}catch(UnknownHostExceptione){ e.printStackTrace();}}}统一资源定位符URL统一资源定位符URL(UniformResourceLocation)是WWW客户机访问Internet网上资源时用来标识资源的名字和地址。超文本链路由统一资源定位符URL维持。URL的格式是:<METHOD>://<HOSTNAME:PORT>/<PATH>/<FILE>其中:METHOD是传输协议;HOSTNAME是文档和服务器所在的Internet主机名(域名系统DNS中的点地址);PORT是服务端口号(可省略);PATH是路径名,FILE是文件名。例如:

/(http是协议名,是主机名)

http:///home/welcome.html(是主机名,home/welcome.html是文件路径和文件名)1.URL类包有URL类,一个URL对象可以表示一个网络资源。程序利用URL对象能实现Internet寻址、网络资源的定位连接,在客户机与服务器之间直接访问等。URL类的构造方法是URL(Strings)其中,s指出网络中的一个资源。利用URL对象访问网上资源需先创建URL对象,如以下代码所示:URLmyURL;try{myURL=newURL(":80/");}catch(MalformedURLExceptione){System.out.println("有错的URL:"+url+e);};因创建URL对象可能会产生MalformedURLException异常。所以,创建URL对象的代码应出现在try-catch语句块中,以便能捕捉网址错误异常。2.URLConnection类要接收和发送信息还需用URLConnection类,程序获得一个URLConnection对象,相当于完成对指定URL的一个HTTP连接。以下是示意获得URLConnection对象的代码。URLmu=newURL("/");//先要创建一个URL对象URLConnection

muC=mu.openConnection();//获得URLConnection对象上述代码说明,先要创建一个URL对象,然后利用URL对象的openConnection()方法,从系统获得一个URLConnection对象。程序有了URLConnection对象后,就可使用URLConnection类提供的以下方法获得流对象和实现网络连接:(1)getOutputStream(),获得向远程主机发送信息的OutputStream流对象。(2)getInputStream(),获得从远程主机获取信息的InputStream流对象。有了网络连接的输入流和输出流,程序就可实现远程通信。(3)connect(),设置网络连接。3.信息的发送和接收发送和接收信息要获得流对象,并由流对象创建输入或输出数据流对象。然后,就可以用流的方法访问网上资源。参见例10.2程序中的方法readByURL(),该方法说明已知网址读取网页内容的过程。方法利用网址参数创建一个URL对象url,接着利用对象url的openConnection()方法,获得URLConnection对象tc,用对象tc的connect()方法建立网络连接,接着获得网络连接的InputStreamReader类对象in,将对象in转化成为BufferedRead对象dis,改为缓冲式输入。以后,用对象dis的readLine()方法完成读取网络文本数据。如同本地数据流一样,网上资源使用结束后,数据流也应及时关闭。例如,代码dis.close();关闭先前代码建立的流dis。【例10.2】以数据流方式读取网页内容的应用程序。程序运行时,网址从文本框中读取。import.*;importjava.awt.*;importjava.awt.event.*;importjava.io.*;importjavax.swing.*;public

classExample10_2{

public

static

voidmain(Stringargs[]){

newDownNetFile(); }}class

DownNetFile

extends

JFrame

implements

ActionListener{

JTextField

inField=new

JTextField(30);

JTextArea

showArea=new

JTextArea();

JButtonb=new

JButton("下载");

JPanelp=new

JPanel();

DownNetFile(){

super("读取网络文本文件示意程序"); Containercon=this.getContentPane();

p.add(inField);p.add(b);

JScrollPane

jsp=new

JScrollPane(showArea);

b.addActionListener(this);

con.add(p,"North");con.add(jsp,"Center");

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(500,400); setVisible(true); }public

void

actionPerformed(ActionEvente){

readByURL(inField.getText());}

public

void

readByURL(StringurlName){

try{ URLurl=newURL(urlName);//由网址创建URL对象

URLConnection

tc=url.openConnection();//获得URLConnection对象

tc.connect();//设置网络连接

InputStreamReaderin=new

InputStreamReader(tc.getInputStream());

BufferedReader

dis=new

BufferedReader(in);//采用缓冲式输入 StringinLine;

while((inLine=dis.readLine())!=null){

showArea.append(inLine+"\n"); } dis.close();//网上资源使用结束后,数据流及时关闭 }catch(MalformedURLExceptione){e.printStackTrace();}

catch(IOExceptione){ e.printStackTrace();}/*访问网上资源可能产生MalformedURLException和IOException异常*/}}客户机/服务器模式网络应用模式主要有:主机/终端模式,集中计算,集中管理;客户机/服务器(Client/Server,简称C/S)模式,分布计算,分布管理;浏览器/服务器模式,利用Internet跨平台。WWW(万维网)就是建立在客户机/服务器模式上,以HTML语言和HTTP协议为基础,能够提供各种Internet服务的信息浏览系统。网络信息放在主机的不同位置,WWW服务器利用超文本链路链接各项信息。WWW客户机(浏览器Browser)负责与服务器建立联系,向服务器发送请求,处理HTML超媒体,提供图形用户界面(GUI),显示信息等。在客户机/服务器工作模式中,在Server端,要准备接受多个Client端计算机的通信。为此,除用IP地址标识Internet上的计算机之外,另还引入端口号,用端口号标识正在Server端后台服务的线程。端口号与IP地址的组合称为网络套接字(socket)。Java语言在实现C/S模式中,套接字分为两类:在Server端,ServerSocket类支持底层的网络通讯;在Client端,Socket类支持网络的底层通讯。Server机通过端口(总线I/O地址)提供面向Client机的服务;Server机在它的几个不同端口分别同时提供几种不同的服务。Client接入Server的某一端口,通过这个端口提请Server机为其服务。规定:端口号0~1023供系统专用。例如,HTTP协议在端口80,telnet协议在端口23。端口号1024~65535供应用程序使用。当Client程序和Server程序需要通信时,可以用Socket类建立套接字连接。套接字连接可想象为一个电话呼叫:最初是Client程序建立呼叫,Server程序监听;呼叫完成后,任何一方都可以随时讲话。双方实现通讯有流式socket和数据报式socket两种可选方式。流式socket是有连接的通讯,即TCP(TransmissionControlProtocol)。每次通讯前建立连接,通讯结束后断开连接。特点是可以保证传输的正确性、可靠性。数据报式socket是无连接的通讯,即UDP(UserDatagramProtocol)。将欲传输的数据分成小包,直接上网发送。无需建立连接和拆除连接,速度快,但无可靠保证。流式socket在Client程序和Server程序间建立连接通讯的通道。每个socket可以进行读和写两种操作。对于任一端,与对方的通信会话过程是:建立socket连接,获得输入/输出流,读数据/写数据,通讯完成后关闭socket(拆除连接)。流式Socket的通讯过程见图10.1。利用Socket的构造方法,可以在客户端建立到服务器的套接字对象:Socket(Stringhost,intport),host是服务器的IP地址,port是端口号,这些都是预先约定的。try{SocketmySocket=newSocket("",1860);}catch(IOExceptione){}然后,用getInputStream()方法获得输入流,用这个输入流读取服务器放入“线路”的信息;用getOutputStream()方法获得输出流,用这个输出流将信息写入“线路”。利用ServerSocket的构造方法,可以在服务器端建立接受客户套接字的服务器套接字对象:ServerSocket(intport),指定端口号,创建一个ServerSocket对象。端口号port要与客户呼叫的端口号相同。用以下形式代码:try{ServerSocketserverSocket=newServerSocket(1860);}catch(IOExceptione){}服务端程序在指定的端口监听,当收到Client程序发出的服务请求时,创建一个套接字对象与该端口对应的Client程序通讯。例如,执行上述建立服务器套接字对象的代码,确立了对象serverSocket后,就可对它使用accept()方法,得到Socket对象,接收Client程序来自套接字mySocket的信息。代码:

try{Socketsc=serverSocket.accept();//sc是一个Socket对象}catch(IOExceptione){}要撤消服务,关闭Socket对象sc:sc.close();【例10.3】C/S模式中的Client端应用程序。这是一个Client端的流式Socket通讯的简单实例,代码说明Client端程序的编写方法。例中,Client程序向服务器主机的端口4441提出请求,连接建立后完成对服务器的读写。importjava.io.*;import.*;publicclassClint{publicstaticvoidmain(Stringargs[]){ Strings=null; SocketmySocket;

DataInputStreamin=null;

DataOutputStreamout=null; try{

mySocket=newSocket("localhost",4441);//本地机IP地址 in=newDataInputStream(mySocket.getInputStream()); out=new

DataOutputStream(mySocket.getOutputStream());

out.writeUTF("服务器,你好!");//通过out向“线路”写入信息

while(true){ s=in.readUTF();//通过使用in读取服务器放入“线路”里的信息

if(s==null) break;//输入无信息结束输入 elseSystem.out.println(s);}

mySocket.close();//关闭Socket}catch(IOExceptione){

System.out.println("无法连接"); }}}【例10.4】与例10.3Client端应用程序对应的Server端应用程序。程序在4441端口监听,当检测到有客户机请求时,产生一个“客户,你好,我是服务器”字符串输出到客户端。importjava.io.*;import.*;public

classServer{public

static

voidmain(Stringargs[]){

ServerSocketserver=null; Socketyou=null; Strings=null;

DataOutputStreamout=null;

DataInputStreamin=null;

try{ server=new

ServerSocket(4441); }catch(IOExceptione1){

System.out.println(“ERROR:”+e1); }

try{ you=server.accept(); in=new

DataInputStream(you.getInputStream()); out=new

DataOutputStream(you.getOutputStream());

while(true){ s=in.readUTF();//通过使用in读取客户放入"线路"里的信息

if(s!=null) break; }

out.writeUTF("客户,你好,我是服务器");//通过out向"线路"写入信息

out.close();}catch(IOExceptione){ System.out.println("ERRO:"+e);}}}为了充分发挥计算机的平行工作能力,可以把套接字连接工作让一个线程完成。当客户端要请求服务器给予服务,或当服务器端接收到一个客户的服务请求,就启动一个专门完成信息通讯的线程,在该线程中创建输入输出流,并完成客户端与服务器端的信息交流。【例10.5】将套接字连接工作置于线程的客户端小应用程序。界面中有一个发送信息按钮、一个文本框和一个文本区。客户端应用程序首先与服务器建立套接字连接。使用数据输入流in反复读取服务器放入线路里的信息,将收到的信息在文本区中显示。如果读取的信息是“结束”,则关闭套接字连接,并结束程序。用户也可在文本框输入信息,并按发送信息按钮,则客户端程序利用数据输出流out,将文本框中的内容发送给服务器。import.*;importjava.io.*;importjava.awt.*;import

javax.swing.*;import

java.awt.event.*;import

java.applet.*;public

classAclient

extendsAppletimplements

Runnable,ActionListener{

JButtonbutton; JTextField

textF;JTextArea

textA;Socketsocket; Threadthread;

DataInputStreamin; DataOutputStreamout;public

voidinit(){

setBackground(newColor(120,153,137));

setLayout(new

BorderLayout());button=new

JButton(“发送信息”);

textF=new

JTextField(20); textA=new

JTextArea(20,30);

setSize(450,350);

JPanelp=new

JPanel();

p.add(textF); p.add(button);add(textA,“Center”); add(p,“South”);

button.addActionListener(this);}public

voidstart(){try{ socket=newSocket(this.getCodeBase().getHost(),4441); in=new

DataInputStream(socket.getInputStream()); out=new

DataOutputStream(socket.getOutputStream()); }catch(IOExceptione){ }

if(thread==null){ thread=newThread(this);

thread.setPriority(Thread.MIN_PRIORITY);

thread.start(); }}publicvoidrun(){ Strings=null; while(true){try{s=in.readUTF();/*通过in读取服务器放入“线路”里的信息*/ }catch(IOExceptione){} if(s.equals("结束")){ try{ socket.close(); break; }catch(IOExceptione){} } elsetextA.append(s+"\n"); }} publicvoidactionPerformed(ActionEvente){ if(e.getSource()==button){ Strings=textF.getText(); if(s!=null){ try{ out.writeUTF(s); }catch(IOExceptione1){ } }else{ try{ out.writeUTF("请说话"); }catch(IOExceptione1){ } } } }}【例10.6】对应例10.5客户端小应用程序的服务器端小应用程序。程序以端口4441建立与客户端的套接字连接,服务器端收到客户端的申请后,以客户的套接字建立一个线程,并启动。如果没有客户申请,则继续监听客户的申请。线程按客户的套接字建立输入数据流in和输出数据流out。线程利用in读取客户放入线路的信息。如果接受的信息是“结束”,则服务器回复”结束”后关闭套接字的连接;否则回复:“我是服务器你对我说”,以及服务器接收到的信息。importjava.io.*;import.*;importjava.util.*;public

class

Aserver{public

static

voidmain(Stringargs[]){ ServerSocketserver=null; ServerThreadthread; Socketclient=null;

while(true){

try{ server=new

ServerSocket(4441); }catch(IOExceptione1){

System.out.println("监听时发现错误"+"ERROR:"+e1); }

try{ client=server.accept(); }catch(IOExceptione){

System.out.println("正在等待客户时,出错!"); }

if(client!=null){new

ServerThread(client).start(); }else{continue; }//继续等待客户呼叫 }}}class

ServerThread

extendsThread{Socketsocket; Strings=null;

DataOutputStreamout=null;

DataInputStreamin=null;

ServerThread(Sockett){ socket=t;//参照t创建输入流和输出流

try{ in=new

DataInputStream(t.getInputStream()); out=new

DataOutputStream(t.getOutputStream()); }catch(IOExceptione){ }}public

voidrun(){while(true){

try{ s=in.readUTF();//通过in读取客户放入“线路”的信息 }catch(IOExceptione){

System.out.println(“ERROR:”+e); }

try{

if(s.equals("结束")){//客户离开,服务器也离开

out.writeUTF(s); socket.close(); }else{

try{out.writeUTF("我是服务器你对我说:"+s); //通过out向“线路”写入回复信息 }catch(IOExceptione1){ } } }catch(IOExceptione){}}}}Java数据库编程基础一个网络关系数据库应用系统是一个三层次结构。客户机与服务器采用网络连接,客户机端应用程序按通信协议与服务器端的数据库服务程序通信;数据库服务程序通过SQL命令与数据库管理系统通信。Java程序与数据库连接Java程序与数据库连接方法有两种。一种是使用JDBC-ODBC桥接器与数据库连接;另一种是利用纯Java的JDBC驱动程序与数据库连接。1.使用JDBC-ODBC桥接器与数据库连接Java程序使用JDBC-ODBC桥接器与数据库连接,Java程序与数据库通信的过程是:先由数据库应用程序向ODBC驱动管理器发出API调用,ODBC驱动管理器将这个调用转换成向数据库管理系统的ODBC驱动程序调用,数据库管理系统又将这个调用转换成对操作系统的数据输入/输出调用。最后,操作系统从数据库中得到实际数据逐级返回。数据库编程首先要设置数据源,在ODBC中设置数据源的步骤如下:(1)打开windows控制面板中的管理工具。对于WindowsXP:选择“性能维护”→“管理工具”→“数据源(ODBC)”;对于Windows2000:选择“管理工具”→“数据源(ODBC)”。(2)打开“数据源(ODBC)”。出现ODBC数据源管理器对话框,显示现有的数据源名称。(3)选择“用户DSN”,单击“添加”按钮,出现安装数据源驱动程序对话框。选择Access(*.mdb)数据源,单击“完成”按钮,出现“创建数据源对话框”,键入需要创建的数据源名,并为创建的数据源选择一个数据库表。(4)单击数据库区域的“选择”按钮,选择需要的数据库表。当需要为数据源授权访问级别时,单击“高级”按钮。设置登录名和密码后,单击“确定”按钮。完成Access数据库在ODBC管理器中的配置。(5)如果还没有数据库表,则需创建一个数据库表。数据源就是数据库,在设定了数据源的基础上,Java程序要访问数据库表,还要建立JDBC-ODBC桥接器,让程序与数据库连接。以后,程序就可向数据库发送SQL语句,处理数据库返回的结果。Java数据库连接JDBC(JavaDataBaseConnectivity)由一组用Java语言编写的类和接口组成,JDBC是Java程序与数据库连接的API。它能做以下三件事情:与某个数据库建立连接、向数据库发送SQL语句和处理数据库返回的结果。调用类方法Class.forName(Strings)能建立JDBC-ODBC桥接器。例如,代码:try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(Exceptione){}为Java程序加载了驱动程序。【例10.7】说明与数据库连接的方法connectByJdbcOdbc(),该方法按给定的数据库URL、用户名和密码连接数据库,如果连接成功,方法返回连接对象,连接不成功,则返回空。public

staticConnectionconnectByJdbcOdbc(Stringurl,Stringusername,Stringpassword){ Connectioncon=null;try{ Class.forName(//加载ODBC驱动程序“sun.jdbc.odbc.JdbcOdbcDriver”);}catch(Exceptione){e.printStackTrace(); return

null;//连接失败}try{con=DriverManager.getConnection(url,username,password);}catch(SQLExceptione){

e.printStackTrace();return

null;//连接失败}return

con;//连接成功}以下代码是对connectByJdbcOdbc()方法的一个调用,数据库连接成功,弹出数据库连接成功信息窗,否则弹出数据库连接不成功信息窗。

if((con=connectByJdbcOdbc( "jdbc:odbc:redsun","xia","1234"))!=null){ JOptionPane.showMessageDialog(null,"数据库连接成功!");

try{ con.close(); con=null; }catch(SQLExceptione){ }}else JOptionPane.showMessageDialog(null,"数据库连接失败!");2.用纯Java的JDBC驱动程序实现与数据库连接Java程序也可以用纯Java的JDBC驱动程序实现与数据库连接。这种方法应用较广泛,但是需要下载相应的驱动程序包,因为不同的数据库的连接代码可能不同,连接不同的数据库,加载的驱动程序也可能不相同。例如,连接SQLServer的驱动程序在网站下载,有3个包:msbase.jar,mssqlserver.jar和msutil.jar,并要求将这3个包放在jdk\jre\lib\ext\目录下,或将放置位置在CLASSPATH中设置。使用纯JavaJDBC驱动程序连接数据库的过程如下:(1)加载驱动程序有两种加载驱动程序的方式:一种是将驱动程序添加到java.lang.System的属性jdbc.drivers中。这是一个由DriverManager类加载驱动程序类名的列表,表元用冒号分隔。另一种方式是从相关的网站下载驱动程序后,在程序中利用Class.forName()方法加载指定的驱动程序。例如,Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);(2)创建指定数据库的URL数据库的URL对象类似网络的统一资源定位符,其格式是:jdbc:subProtocol:subName://hostName:port;DatabaseName=XXX其中,subProtocol是某种驱动程序支持的数据库连接机制;subName是当前连接机制下的具体名称;hostName是主机名;port是相应的连接端口;DatabaseName是要连接的数据库名称。例如,以下代码可以是一个数据库的URL:jdbc:Microsoft:sqlserver://localhost:1433;DatabaseName=ksInfo该数据库的URL说明利用microsoft提供的机制,用sqlserver驱动,通过1433端口访问本机上的ksInfo数据库。(3)建立连接通过驱动程序管理器(DriverManager)的方法getConnection()建立连接。参见10.2.2关于DriverManager类的介绍。【例10.8】说明与数据库连接的静态方法connectByJdbc(),该方法按给定的数据库URL、用户名和密码连接数据库,如果连接成功,方法返回true,连接不成功,则返回false。public

staticConnectionconnectByJdbc(Stringurl,Stringusername,Stringpassword){ Connectioncon=null;try{ Class.forName(//加载特定的驱动程序"com.microsoft.jdbc.sqlserver.SQLServerDriver"); }catch(Exceptione){

e.printStackTrace();

return

null;//连接失败 }

try{

con=DriverManager.getConnection(url,username,password); }catch(SQLExceptione){

e.printStackTrace();

return

null;//连接失败 }

return

con;//连接成功}几个重要的类和接口编写访问数据库的Java程序还需要几个重要的类和接口。1.DriverManager类DriverManager类处理驱动程序的加载和建立数据库连接。DriverManager是java.sql包中用于管理数据库驱动程序的类。通常,应用程序只使用类DriverManager的getConnection()静态方法,用来建立与数据库的连接,返回Connection对象:staticConnectiongetConnection(Stringurl,Stringusername,Stringpassword),通过指定数据的URL及用户名和密码创建数据库连接对象。其中url的语法格式是:jdbc:<数据库的连接机制>:<ODBC数据库名>。2.Connection类Connection类是java.sql包中用于处理与数据库连接的类。Connection对象是用来表示数据库连接的对象,Java程序对数据库的操作都在这种对象上进行。Connection类的主要方法有:StatementcreateStatement(),创建一个Statement对象。StatementcreateStatement(int

resultSetType,int

resultSetConcurrency),创建一个Statement对象,生成具有特定类型的结果集。voidcommit(),提交对数据库的改动并释放当前持有的数据库的锁。voidrollback(),回滚当前事务中的所有改动并释放当前连接持有的数据库的锁。StringgetCatalog(),获得连接对象的当前目录。boolean

isClose(),判断连接是否已关闭。boolean

isReadOnly(),判断连接是否为只读模式。voidsetReadOnly(),设置连接为只读模式。voidclose(),释放连接对象的数据库和JDBC资源。3.Statement类Statement类是java.sql包中用于在指定的连接中处理SQL语句的类。数据库编程的要点是在程序中嵌入SQL命令。程序需要声明和创建连接数据库的Connection对象,并让该对象连接数据库。调用类DriverManager的静态方法getConnection()获得Connection对象,实现程序与数据据的连接。然后,用Statement类声明SQL语句对象,并调用Connection对象的createStatement()方法,创建SQL语句对象。例如,以下代码创建语句对象sql:Statementsql=null;try{sql=con.createStatement();}catch(SQLExceptione){}4.ResultSet类有了SQL语句对象后,调用语句对象的方法executeQuery()执行SQL语句查询,并将查询结果存放在一个用ResultSet类声明的对象中。例如,以下代码读取学生成绩表存于rs对象中:ResultSetrs=sql.executeQuery("SELECT*FROMksInfo");ResultSet对象实际上是一个由查询结果数据构成的表,是一个管式数据集,由统一形式的数据行组成,一行对应一条查询记录。在ResultSet对象中隐含着一个游标,一次只能获得游标当前所指的数据行,用next方法可取下一个数据行。用数据行的字段(列)名称或位置索引(自1开始)调用形如getXXXX()方法获得记录的字段值。ResultSet对象的部分方法:(1)bytegetByte(int

columnIndex),返回指定字段的字节值。(2)DategetDate(int

columnIndex),返回指定字段的日期值。(3)floatgetFloat(int

columnIndex),返回指定字段的浮点值。(4)int

getInt(int

columnIndex),返回指定字段整数值。(5)StringgetString(int

columnIndex),返回指定字段的字符串值。(6)doublegetDouble(StringcolumnName),返回指定字段的双精度值。(7)longgetLong(StringcolumnName),返回指定字段的long型整值。(8)booleannext(),返回是否还有下一字段。以上方法中的columnIndex是位置索引,用于指定字段,columnName是字段名。用户需要在查询结果集上浏览,或前后移动、或显示结果集的指定记录,这称为可滚动结果集。程序要获得一个可滚动结果集,只要在获得SQL的语句对象时,增加指定结果集的两个参数即可。例如,以下代码所示:Statementstmt=con.createStatement(type,concurrency);ResultSetre=stmt.executeQuery(SQL语句);语句对象stmt的SQL查询就能得到相应类型的结果集。int型参数type决定可滚动集的滚动方式:ResultSet.TYPE_FORWORD_ONLY,结果集的游标只能向下滚动。ResultSet.TYPE_SCROLL_INSENSITIVE,游标可上下移动,当数据库变化时,当前结果集不变。ResultSet.TYPE_SCROLL_SENSITIVE,游标可上下移动,当数据库变化时,当前结果集同步改变。int型参数concurrency决定数据库是否与可滚动集同步更新:ResultSet.CONCUR_READ_ONLY,不能用结果集更新数据库中的表。ResultSet.CONCUR_UPDATETABLE,能用结果集更新数据库中的表。利用连接对象connect,创建Statement对象stmt,指定结果集可滚动,并以只读方式读数据库:Stmt=connect.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);可滚动集上另外一些常用的方法如下:booleanprevious(),将游标向上移动,当移到结果集第一行时,返回false。voidbeforeFirst(),将游标移到结果集的第一行前。voidafterLast(),将游标移到最后一行之后。voidfirst(),将游标移到第一行。voidlast(),将游标移到最后一行。booleanisAfterLast(),判游标是否在最后一行之后。booleanisBeforeFirst(),判游标是否在第一行之前。booleanisLast(),判游标是否在最后一行。booleanisFirst(),判游标是否在第一行。intgetRow(),获取当前所指的行(行号自1开始编号,结果集空,返回0)。booleanabsolute(introw),将游标移到row行。数据库查询利用Connection对象的createStatement方法建立Statement对象,利用Statement对象的executeQuery()方法执行SQL查询语句进行查询,返回结果集,再利用形如getXXX()方法从结果集中读取数据。经过这样的一系列步骤就能实现对数据库的查询。【例10.9】Java应用程序访问数据库。应用程序打开考生信息表ksInfo,从中取出考生的各项信息。设考生信息数据库的结构如下:importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.util.*;importjava.sql.*;类型字符串字符串整数字符串字符串字段名考号姓名成绩地址简历public

classExample10_9extendsJFrameimplementsActionListener{public

staticConnectionconnectByJdbcOdbc(Stringurl,Stringusername,Stringpassword){ Connectioncon=null;

try{ Class.forName(//加载ODBC驱动程序 "sun.jdbc.odbc.JdbcOdbcDriver"); }catch(Exceptione){ e.printStackTrace(); return

null;//加载失败,连接不成功 }

try{con=DriverManager.getConnection(url,username,password); }catch(SQLExceptione){ e.printStackTrace(); return

null;//连接失败 }

returncon;//连接成功} Stringtitle[]={"考号","姓名","成绩","地址","简历"};

JTextField

txtNo=new

JTextField(8);

JTextField

txtName=new

JTextField(10);

JTextField

txtScore=new

JTextField(3);

JTextField

txtAddr=new

JTextField(30);

JTextArea

txtResume=new

JTextArea();

JButton

prev=new

JButton("前一个");

JButtonnext=new

JButton("后一个");

JButtonfirst=new

JButton("第一个");

JButtonlast=new

JButton("最后一个"); Statementsql;//SQL语句对象

ResultSet

rs;//存放查询结果对象Example10_9(Connectionconnect){//构造方法

super("考生信息查看窗口"); setSize(450,350);

try{ sql=connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); rs=sql.executeQuery("SELECT*FROMksInfo"); Containercon=getContentPane(); con.setLayout(newBorderLayout(0,6)); JPanelp[]=newJPanel[4];

for(inti=0;i<4;i++){ p[i]=newJPanel(newFlowLayout(FlowLayout.LEFT,8,0)); p[i].add(newJLabel(title[i])); } p[0].add(txtNo);p[1].add(txtName);p[2].add(txtScore); p[3].add(txtAddr); JPanelp1=newJPanel(newGridLayout(4,1,0,8)); JScrollPanejsp=newJScrollPane(txtResume,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); jsp.setPreferredSize(newDimension(300,60));

for(inti=0;i<4;i++){ p1.add(p[i]); }

JPanelp2=newJPanel(newFlowLayout(FlowLayout.LEFT,10,0)); p2.add(newJLabel(title[4]));p2.add(jsp); JPanelp3=newJPanel(); p3.add(prev);p3.add(next);p3.add(first);p3.add(last); prev.addActionListener(this); next.addActionListener(this); first.addActionListener(this); last.addActionListener(this); rs.first(); readRecord();}catch(Exceptione){e.printStackTrace();}setVisible(true);}public

void

modifyRecord(Connectionconnect){StringstuNo=(String)JOptionPane.showInputDialog(

null,"请输入考生考号","输入考号对话框",

JOptionPane.PLAIN_MESSAGE,null,null,“”);try{

sql=connect.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_READ_ONLY);

rs=sql.executeQuery("SELECT*FROMksInfo"); Containercon=getContentPane();

con.setLayout(new

BorderLayout(0,6));

JPanelp[]=new

JPanel[4];

for(int

i=0;i<4;i++){ p[i]=new

JPanel(new

FlowLayout(FlowLayout.LEFT,8,0)); p[i].add(new

JLabel(title[i])); }p[0].add(txtNo);p[1].add(txtName);p[2].add(txtScore);p[3].add(txtAddr);JPanelp1=newJPanel(newGridLayout(4,1,0,8));JScrollPanejsp=newJScrollPane(txtResume,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);jsp.setPreferredSize(newDimension(300,60));for(inti=0;i<4;i++){ p1.add(p[i]); }JPanelp2=newJPanel(newFlowLayout(FlowLayout.LEFT,10,0)); p2.add(new

JLabel(title[4]));p2.add(jsp);

JPanelp3=new

JPanel(); p3.add(prev);p3.add(next);p3.add(first);p3.add(last);

prev.addActionListener(this);

next.addActionListener(this);

first.addActionListener(this);

last.addActionListener(this);

rs.first(); readRecord();}catch(Exceptione){e.printStackTrace();}

setVisible(true);}booleanreadRecord(){

try{ txtNo.setText(rs.getString(“考号”)); txtName.setText(rs.getString(“姓名”)); txtScore.setText(“”+rs.getInt(“成绩”)); txtAddr.setText(rs.getString(“地址”)); txtResume.setText(rs.getString(“简历”)); }catch(SQLExceptione){e.printStackTrace();return

false;}

return

true;}public

void

actionPerformed(ActionEvente){

try{

if(e.getSource()==prev)

rs.previous();

else

if(e.getSource()==next)

rs

温馨提示

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

评论

0/150

提交评论