大学JAVA程序设计技能教程-彭德林-课件PPT
收藏
资源目录
压缩包内文档预览:(预览前20页/共30页)
编号:21836413
类型:共享资源
大小:13.18MB
格式:ZIP
上传时间:2019-09-06
上传人:QQ24****1780
认证信息
个人认证
王**(实名认证)
浙江
IP属地:浙江
25
积分
- 关 键 词:
-
大学
java
程序设计
技能
技巧
教程
彭德林
课件
ppt
- 资源描述:
-
大学JAVA程序设计技能教程-彭德林-课件PPT,大学,java,程序设计,技能,技巧,教程,彭德林,课件,ppt
- 内容简介:
-
Java程序设计技能教程,主编 彭德林 李德有 中国水利水电出版社 ,第10章 键盘与鼠标事件响应,任务一:掌握事件处理机制,任务三:掌握对鼠标事件的响应方法,任务二:掌握对键盘事件响应方法,任务四:实训十 事件响应实训,10.1 任务一 掌握事件处理机制,10.1.1 相关概念 1事件:是一个对象,它描述发生了什么事情。事件对象由在Java中预先定义好的类产生,Java定义了所有事件的事件类,如键盘操作对应的事件类是KeyEvent。 java.awt.AWTEvent类是所有事件类的父类。 2事件源:能够产生事件的对象都可以称之为事件源,如键盘、鼠标、按钮等。 3事件处理方法:能够接收、解析处理事件类对象,实现和用户交互的方法。它以事件对象为参数。 4监视器:对事件源进行监视,使发生事件时做出处理的一种特殊的对象。事件源通过调用相应的方法将某个对象作为自己的监视器。,10.1.2 事件处理机制,Java采用“授权事件模型”(Event Delegation Model)的事件处理模式。其原理为:事先定义多种事件类型(即用户在GUI组件上进行的操作,如单击事件),当用户对某个GUI组件进行操作时,可能触发相应的事件,这个组件就是事件源。如果此组件注册了事件监听器(可以通过addXXXXListener方法注册),事件被传送给已注册的监听器,事件监听器负责处理事件的过程。一个组件可以注册一个或多个监听器。,监视器负责处理事件源发生的事件。监视器是个对象,为了处理事件源发生的事件,监视器会自动调用一个方法来处理事件。为了让监视器能对事件源发生的事件进行处理,创建该监视器的类必须声明实现相应的接口,即必须在类体中给出该接口中所有方法的方法体,这样在事件源发生事件时,监视器就自动调用执行被类实现的某个接口方法,若要保证一个组件产生的某种类型事件XXXEvent有效,需要注册一个“事件监听器”监听它。用如下语句设置事件监听器: 事件源.addXXXListener(XXXListener代表某种事件监听器)。 组件作为事件源,不同类型的组件会产生特定类型的事件。 一旦产生事件后,事件会被传送给已注册的一个或多个监听器。事件监听器是实现了与该事件相对应的XXXListener接口的类。 事件监听器监听到事件后,会根据事件的类型调用相应的事件处理方法。,1java.awt.event包 (1)文本框回车、按钮单击、计时器、菜单项 引发动作事件:java.awt.event.ActionEvent 处理事件的接口:java.awt.event.ActionListener 接口中的方法:public void actionPerformed(ActionEvent event) (2)单选按钮、多选按钮、下拉列表 引发选项事件:java.awt.event.ItemEvent 处理事件的接口:java.awt.event.ItemListener 接口中的方法:public void itemStateChanged(ItemEvent event),(3)键盘 引发动作事件:java.awt.event.KeyEvent 处理事件的接口:java.awt.event.KeyListener (4)鼠标 引发鼠标事件:java.awt.event.MouseEvent 处理事件的接口:java.awt.event.MouseListener 与java.awt.event.MouseMotionListener接口。,2java.swing.event包 (1)列表(JList) 引发列表选择事件:java.swing.event.ListSelectionEvent 处理事件接口:java.swing.event.ListSelectionListener 接口中的方法: public void valueChanged(ListSelectionEvent event) (2)树(JTree) 引发树选择事件:java.swing.event.TreeSelectionEvent 处理事件接口:java.swing.event.TreeSelectionListener 接口中的方法: public void valueChanged(TreeSelectionEvent event),(3)滑动杆(JSlider) 引发改变事件:java.swing.event.ChangeEvent 处理事件接口:java.swing.event.ChangeListener 接口中的方法: public void stateChanged(ChangeEvent event),10.2 任务二 掌握对键盘事件响应方法 10.2.1 键盘事件 当键盘按下、释放、点击时都会触发键盘事件(java.awt.event.KeyEvent),常用的KeyEvent方法是public int getKeyCode(),它用于获取所按下键的编码值。 键盘事件类提供了很多静态常量表示键的编码值,如: VK_A 键A的编码值 VK_DOWN 下箭头键的编码值 VK_UP 上箭头键的编码值 VK_1 键1的编码值 VK_ENTER 表示回车编码值 VK_SPACE 表示空格键编码值,更多的键码值可以查阅Java API文档来获得。 编写键盘事件响应程序时,使用语句if(e.getKeyCode()=KeyEvent.VK_B)可以判断是否按下了字母键B,然后做相应处理,语句中的e是事件处理时接收的键盘事件对象参数名。,10.2.2 键盘监听接口KeyListener 对键盘事件可以通过java.awt.event.KeyListener接口中提供的方法来处理。 这个接口有三个方法: 1keyPressed(KeyEvent e)响应按下键盘事件; 2keyTyped(KeyEvent e)响应按下又松开键盘事件; 3keyReleased(KeyEvent e)响应松开键盘事件; 它们都是public void方法,事件源要使用addKeyListener方法添加监视器来获得事件。,【例10-1】对键盘事件进行响应。 import java.awt.event.*; import javax.swing.*; import java.awt.*; public class hh extends JFrame implements KeyListener JButton JButton1; hh() JPanel jpanel1=new JPanel(); JButton1=new JButton(“请按M键!“); JButton1.addKeyListener(this); this.setSize(200,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jpanel1.add(JButton1); this.add(jpanel1); this.setVisible(true); ,public void keyPressed(KeyEvent e) if(e.getKeyCode()=KeyEvent.VK_M) JButton1.setBounds(60,60,90,90); JButton1.setBackground(Color.red); public void keyReleased(KeyEvent e) public void keyTyped(KeyEvent e) public static void main(String args) new hh(); ,10.2.3 键盘适配器类KeyAdapter 使用KeyListener接口时,即使有些方法不使用也必须在程序中写出接口的所有方法,因此比较麻烦,而java.awt.event.keyAdapter类本身就使用了KeyListener接口,并对接口的三个方法增加了空方法体,因此使用keyAdapter类时不必像使用接口那样实现所有方法,只需覆盖要响应的键盘事件方法即可。 下面的程序是通过使用键盘适配器类来实现响应键盘事件,当分别按“R”、“G”、“B”时将圆的颜色设置为红色、绿色和蓝色。,【例10-2】 import java.awt.event.*; import javax.swing.*; import java.awt.*; public class hh extends JFrame Color c; hh() this.setSize(200,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); addKeyListener(new MyType(); class MyType extends KeyAdapter public void keyTyped(KeyEvent e) if(e.getKeyChar()=r|e.getKeyChar()=R) c=Color.red; else if(e.getKeyChar()=g|e.getKeyChar()=G) c=Color.green;,else if(e.getKeyChar()=b|e.getKeyChar()=B) c=Color.blue; else c=Color.black; repaint(); public void paint(Graphics g) g.setColor(c); g.fillOval(60,60,100,100); public static void main(String args) new hh(); ,10.3 任务三 掌握对鼠标事件的响应方法,10.3.1 鼠标事件 鼠标事件源各种动作可以触发鼠标事件,如按下鼠标、点击鼠标、释放鼠标、鼠标进入和鼠标退出。鼠标事件类型是java.awt.event.MouseEvent,当发生鼠标事件时MouseEvent类自动创建一个鼠标事件对象。 1MouseEvent类有几个常用的方法: (1)getX()用于获取鼠标x坐标 (2)getY()用于获取鼠标y坐标;,(3)getButton()用于获取鼠标的左中右键值;根据键值来知道按的是哪一个键,MouseEvent.BUTTON1、MouseEvent.BUTTON2和MouseEvent.BUTTON3分别是左中右三个键值。例如在程序中通过if(e.getButton()=MouseEvent.BUTTON1)可以判断按的是否是左键。 (4)getClickCount()获取点击次数; 2添加鼠标监视器的方法:public void addMouseListener()。 3移去鼠标监视器的方法:public void removeMouseListener().,10.3.2 使用MouseListener接口处理鼠标事件 通过使用java.awt.event.MouseListener接口可以对鼠标事件进行处理,它有以五个方法: (1)mousePressed(MouseEvent)方法,按下鼠标时,接口监视器发现这个事件后自动调用这个方法。 (2)mouseReleased(MouseEvent)方法,松开鼠标时,接口监视器发现这个事件后自动调用这个方法。 (3)mouseEntered(MouseEvent)方法,鼠标指针进入容器时,接口监视器发现这个事件后自动调用这个方法。,(4)mouseExited(MouseEvent)方法,鼠标指针离开容器时,接口监视器发现这个事件后自动调用这个方法。 (5)mouseClicked(MouseEvent)方法,点击鼠标时,接口监视器发现这个事件后自动调用这个方法。 这五个方法不管鼠标按键是左中右都会执行,如果要根据不同键进行不同处理就要先用getButton()方法来判断。 下面通过例10-3来说明如何用MouseListener接口来响应鼠标事件,【例10-3】 import java.awt.*; import java.applet.*; import java.awt.event.*; public class m1 extends Applet implements MouseListener TextField text1; int x; public void init()x=10; text1=new TextField(40); add(text1); text1.setFont(new Font(“隶书“,Font.BOLD,20); addMouseListener(this); public void mousePressed(MouseEvent e) text1.setText(“鼠标被按下,重新画圆!“); repaint();,public void mouseReleased(MouseEvent e) text1.setText (“鼠标被松开,指针坐标是:“+e.getX()+“,“+e.getY(); public void mouseEntered(MouseEvent e) text1.setText (“鼠标进入文本框,指针坐标是:“+e.getX()+“,“+e.getY(); public void mouseExited(MouseEvent e) text1.setText (“鼠标离开文本框了!“); public void mouseClicked(MouseEvent e) if(e.getClickCount()=2) text1.setText (“双击鼠标,指针坐标是:“+e.getX()+“,“+e.getY(); ,public void paint(Graphics g) x=x+5; g.setColor(Color.red); g.drawOval( 60, 60,x,x ); g.setColor(Color.blue); g.fillOval(60,60,x,x); ,10.3.3 使用MouseMotionListener接口处理鼠标事件 MouseListener接口中没有鼠标移动(不按下鼠标)和拖动(按下鼠标)的事件处理,对这两种事件响应就要用java.awt.event.MouseMotionListener接口来处理。 它有两个方法: 1)mouseDragged(MouseEvent)处理鼠标拖动事件 2)mouseMoved(MouseEvent)处理鼠标移动事件 事件源添加监视器方法:public void addMouseMotionListener() 通过下面的画画程序我们了解一下使用MouseMotionListener接口处理鼠标事件的方法。,【例10-4】 import java.awt.*; import java.applet.*; import java.awt.event.*; public class m2 extends Applet implements MouseMotionListener int x=0,y =0; public void init() setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); setBackground(Color.green); addMouseMotionListener(this); public void paint(Graphics g) if(x!=0/起点与终点相同则画一个点 ,public void mouseDragged(MouseEvent e) x=(int)e.getX(); y=(int)e.getY(); repaint(); public void mouseMoved(MouseEvent e) public void update(Graphics g) /重写update方法 paint(g); ,10.4 任务四 实训十 键盘及鼠标事件响应实训,1在程序中通过对键盘事件响应实现移动按钮的功能; 2在程序中通过鼠标事件进行响应实现单击左右键画变大变小的圆。,本章小结 本章主要介绍了如下内容: 1Java中事件处理机制 JAVA事件处理中采用授权处理机制,授权模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监视器分开的机制,要为每个事件源设置一个监视器。事件处理时涉及到java.awt.event包与java.swing.event包中相关的类与接口。 2对键盘事件响应方法 对键盘事件响应主要使用java.awt.event.KeyListener接口中提供的方法来处理,还可以使用键盘适配器类KeyAdapter。 3对鼠标事件响应方法。 对鼠标事件响应主要使用java.awt.event.MouseListener接口与java.awt.event.MouseMotionListener接口。,Java程序设计技能教程主编 彭德林 李德有中国水利水电出版社 第10章 键盘与鼠标事件响应 任务一:掌握事件处理机制 任务三:掌握对鼠标事件的响应方法任务二:掌握对键盘事件响应方法 任务四:实训十 事件响应实训10.1 任务一 掌握事件处理机制 10.1.1 相关概念1事件:是一个对象,它描述发生了什么事情。事件对象由在Java中预先定义好的类产生,Java定义了所有事件的事件类,如键盘操作对应的事件类是KeyEvent。java.awt.AWTEvent类是所有事件类的父类。2事件源:能够产生事件的对象都可以称之为事件源,如键盘、鼠标、按钮等。3事件处理方法:能够接收、解析处理事件类对象,实现和用户交互的方法。它以事件对象为参数。4监视器:对事件源进行监视,使发生事件时做出处理的一种特殊的对象。事件源通过调用相应的方法将某个对象作为自己的监视器。10.1.2 事件处理机制Java采用“授权事件模型”(Event Delegation Model)的事件处理模式。其原理为:事先定义多种事件类型(即用户在GUI组件上进行的操作,如单击事件),当用户对某个GUI组件进行操作时,可能触发相应的事件,这个组件就是事件源。如果此组件注册了事件监听器(可以通过addXXXXListener方法注册),事件被传送给已注册的监听器,事件监听器负责处理事件的过程。一个组件可以注册一个或多个监听器。监视器负责处理事件源发生的事件。监视器是个对象,为了处理事件源发生的事件,监视器会自动调用一个方法来处理事件。为了让监视器能对事件源发生的事件进行处理,创建该监视器的类必须声明实现相应的接口,即必须在类体中给出该接口中所有方法的方法体,这样在事件源发生事件时,监视器就自动调用执行被类实现的某个接口方法 若要保证一个组件产生的某种类型事件XXXEvent有效,需要注册一个“事件监听器”监听它。用如下语句设置事件监听器:事件源.addXXXListener(XXXListener代表某种事件监听器)。组件作为事件源,不同类型的组件会产生特定类型的事件。 一旦产生事件后,事件会被传送给已注册的一个或多个监听器。事件监听器是实现了与该事件相对应的XXXListener接口的类。事件监听器监听到事件后,会根据事件的类型调用相应的事件处理方法。 1java.awt.event包(1)文本框回车、按钮单击、计时器、菜单项引发动作事件:java.awt.event.ActionEvent处理事件的接口:java.awt.event.ActionListener接口中的方法:public void actionPerformed(ActionEvent event)(2)单选按钮、多选按钮、下拉列表引发选项事件:java.awt.event.ItemEvent处理事件的接口:java.awt.event.ItemListener接口中的方法:public void itemStateChanged(ItemEvent event)(3)键盘引发动作事件:java.awt.event.KeyEvent处理事件的接口:java.awt.event.KeyListener(4)鼠标引发鼠标事件:java.awt.event.MouseEvent处理事件的接口:java.awt.event.MouseListener与java.awt.event.MouseMotionListener接口。2java.swing.event包(1)列表(JList)引发列表选择事件:java.swing.event.ListSelectionEvent处理事件接口:java.swing.event.ListSelectionListener接口中的方法:public void valueChanged(ListSelectionEvent event) (2)树(JTree)引发树选择事件:java.swing.event.TreeSelectionEvent处理事件接口:java.swing.event.TreeSelectionListener接口中的方法:public void valueChanged(TreeSelectionEvent event) (3)滑动杆(JSlider)引发改变事件:java.swing.event.ChangeEvent处理事件接口:java.swing.event.ChangeListener接口中的方法:public void stateChanged(ChangeEvent event)10.2 任务二 掌握对键盘事件响应方法10.2.1 键盘事件当键盘按下、释放、点击时都会触发键盘事件(java.awt.event.KeyEvent),常用的KeyEvent方法是public int getKeyCode(),它用于获取所按下键的编码值。键盘事件类提供了很多静态常量表示键的编码值,如:VK_A 键A的编码值VK_DOWN 下箭头键的编码值VK_UP 上箭头键的编码值VK_1 键1的编码值VK_ENTER 表示回车编码值VK_SPACE 表示空格键编码值 更多的键码值可以查阅Java API文档来获得。编写键盘事件响应程序时,使用语句if(e.getKeyCode()=KeyEvent.VK_B)可以判断是否按下了字母键B,然后做相应处理,语句中的e是事件处理时接收的键盘事件对象参数名。10.2.2 键盘监听接口KeyListener对键盘事件可以通过java.awt.event.KeyListener接口中提供的方法来处理。这个接口有三个方法:1keyPressed(KeyEvent e)响应按下键盘事件;2keyTyped(KeyEvent e)响应按下又松开键盘事件;3keyReleased(KeyEvent e)响应松开键盘事件;它们都是public void方法,事件源要使用addKeyListener方法添加监视器来获得事件。【例10-1】对键盘事件进行响应。import java.awt.event.*;import javax.swing.*;import java.awt.*;public class hh extends JFrame implements KeyListenerJButton JButton1;hh() JPanel jpanel1=new JPanel();JButton1=new JButton(请按M键!);JButton1.addKeyListener(this);this.setSize(200,300);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jpanel1.add(JButton1);this.add(jpanel1);this.setVisible(true);public void keyPressed(KeyEvent e)if(e.getKeyCode()=KeyEvent.VK_M) JButton1.setBounds(60,60,90,90);JButton1.setBackground(Color.red);public void keyReleased(KeyEvent e)public void keyTyped(KeyEvent e)public static void main(String args)new hh();10.2.3 键盘适配器类KeyAdapter使用KeyListener接口时,即使有些方法不使用也必须在程序中写出接口的所有方法,因此比较麻烦,而java.awt.event.keyAdapter类本身就使用了KeyListener接口,并对接口的三个方法增加了空方法体,因此使用keyAdapter类时不必像使用接口那样实现所有方法,只需覆盖要响应的键盘事件方法即可。下面的程序是通过使用键盘适配器类来实现响应键盘事件,当分别按“R”、“G”、“B”时将圆的颜色设置为红色、绿色和蓝色。【例10-2】import java.awt.event.*;import javax.swing.*;import java.awt.*;public class hh extends JFrameColor c;hh()this.setSize(200,300);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);addKeyListener(new MyType();class MyType extends KeyAdapter public void keyTyped(KeyEvent e) if(e.getKeyChar()=r|e.getKeyChar()=R) c=Color.red; else if(e.getKeyChar()=g|e.getKeyChar()=G) c=Color.green;else if(e.getKeyChar()=b|e.getKeyChar()=B) c=Color.blue; else c=Color.black; repaint(); public void paint(Graphics g) g.setColor(c);g.fillOval(60,60,100,100); public static void main(String args) new hh(); 10.3 任务三 掌握对鼠标事件的响应方法10.3.1 鼠标事件鼠标事件源各种动作可以触发鼠标事件,如按下鼠标、点击鼠标、释放鼠标、鼠标进入和鼠标退出。鼠标事件类型是java.awt.event.MouseEvent,当发生鼠标事件时MouseEvent类自动创建一个鼠标事件对象。1MouseEvent类有几个常用的方法:(1)getX()用于获取鼠标x坐标(2)getY()用于获取鼠标y坐标;(3)getButton()用于获取鼠标的左中右键值;根据键值来知道按的是哪一个键,MouseEvent.BUTTON1、MouseEvent.BUTTON2和MouseEvent.BUTTON3分别是左中右三个键值。例如在程序中通过if(e.getButton()=MouseEvent.BUTTON1)可以判断按的是否是左键。(4)getClickCount()获取点击次数;2添加鼠标监视器的方法:public void addMouseListener()。3移去鼠标监视器的方法:public void removeMouseListener().10.3.2 使用MouseListener接口处理鼠标事件通过使用java.awt.event.MouseListener接口可以对鼠标事件进行处理,它有以五个方法:(1)mousePressed(MouseEvent)方法,按下鼠标时,接口监视器发现这个事件后自动调用这个方法。(2)mouseReleased(MouseEvent)方法,松开鼠标时,接口监视器发现这个事件后自动调用这个方法。(3)mouseEntered(MouseEvent)方法,鼠标指针进入容器时,接口监视器发现这个事件后自动调用这个方法。(4)mouseExited(MouseEvent)方法,鼠标指针离开容器时,接口监视器发现这个事件后自动调用这个方法。(5)mouseClicked(MouseEvent)方法,点击鼠标时,接口监视器发现这个事件后自动调用这个方法。这五个方法不管鼠标按键是左中右都会执行,如果要根据不同键进行不同处理就要先用getButton()方法来判断。下面通过例10-3来说明如何用MouseListener接口来响应鼠标事件 【例10-3】import java.awt.*;import java.applet.*;import java.awt.event.*;public class m1 extends Applet implements MouseListenerTextField text1;int x;public void init()x=10;text1=new TextField(40);add(text1);text1.setFont(new Font(隶书,Font.BOLD,20);addMouseListener(this);public void mousePressed(MouseEvent e)text1.setText(鼠标被按下,重新画圆!);repaint();public void mouseReleased(MouseEvent e)text1.setText (鼠标被松开,指针坐标是:+e.getX()+,+e.getY();public void mouseEntered(MouseEvent e)text1.setText (鼠标进入文本框,指针坐标是:+e.getX()+,+e.getY();public void mouseExited(MouseEvent e)text1.setText (鼠标离开文本框了!);public void mouseClicked(MouseEvent e)if(e.getClickCount()=2)text1.setText (双击鼠标,指针坐标是:+e.getX()+,+e.getY();public void paint(Graphics g) x=x+5;g.setColor(Color.red);g.drawOval( 60, 60,x,x );g.setColor(Color.blue);g.fillOval(60,60,x,x);10.3.3 使用MouseMotionListener接口处理鼠标事件MouseListener接口中没有鼠标移动(不按下鼠标)和拖动(按下鼠标)的事件处理,对这两种事件响应就要用java.awt.event.MouseMotionListener接口来处理。它有两个方法:1)mouseDragged(MouseEvent)处理鼠标拖动事件2)mouseMoved(MouseEvent)处理鼠标移动事件事件源添加监视器方法:public void addMouseMotionListener()通过下面的画画程序我们了解一下使用MouseMotionListener接口处理鼠标事件的方法。【例10-4】import java.awt.*;import java.applet.*;import java.awt.event.*;public class m2 extends Applet implements MouseMotionListenerint x=0,y =0;public void init() setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);setBackground(Color.green);addMouseMotionListener(this);public void paint(Graphics g) if(x!=0&y!=0)g.setColor(Color.red);g.drawLine(x,y ,x,y);/起点与终点相同则画一个点 public void mouseDragged(MouseEvent e)x=(int)e.getX();y=(int)e.getY();repaint();public void mouseMoved(MouseEvent e)public void update(Graphics g) /重写update方法paint(g);10.4 任务四 实训十 键盘及鼠标事件响应实训 1在程序中通过对键盘事件响应实现移动按钮的功能; 2在程序中通过鼠标事件进行响应实现单击左右键画变大变小的圆。本章小结本章主要介绍了如下内容:1Java中事件处理机制JAVA事件处理中采用授权处理机制,授权模型把事件的处理委托给外部的处理实体进行处理,实现了将事件源和监视器分开的机制,要为每个事件源设置一个监视器。事件处理时涉及到java.awt.event包与java.swing.event包中相关的类与接口。 2对键盘事件响应方法对键盘事件响应主要使用java.awt.event.KeyListener接口中提供的方法来处理,还可以使用键盘适配器类KeyAdapter。 3对鼠标事件响应方法。对鼠标事件响应主要使用java.awt.event.MouseListener接口与java.awt.event.MouseMotionListener接口。Java程序设计技能教程,主编 彭德林 李德有 中国水利水电出版社 ,第11章 数据库编程,任务一 :使用JDBC连接数据库,任务三 :数据库编程,任务二 :建立数据源,任务四 :实训十一 数据库编程实训,11.1 任务一 使用JDBC连接数据库,11.1.1 JDBC简介 1JDBC概述 JDBC(Java Database Connectivity,即Java数据库连接),是一种在Java应用程序中访问数据库的综合技术,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成,主要提供三方面的功能:建立同数据库的连接,然后向数据库发送SQL语句,处理从数据库中返回的SQL执行结果。,图 4-1 简单的条件语句,JDBC在Web和Internet应用程序中的作用和ODBC在 Windows系列平台应用程序中的作用类似,但ODBC只针对Windows平台,而且ODBC需要在客户机上安装和注册,因而维护成本相对较大。而JDBC是由Java语言编写的,使得JDBC代码可在所有Java平台上运行,这样使得程序的可移植性和安全性显著提高了。 应用程序通过相应接口(API)访问数据库,JDBC是Java应用程序访问数据库的通用接口,称为JDBC API。,使用JDBC来完成对数据库的访问包括以下四个主要组件: Java的应用程序、JDBC驱动器管理器、驱动器和数据源。 图 11-1 JDBC框架图,2JDBC的结构 (1)、面向应用程序设计的JDBC API:它主要是由一系列的接口组成,通过调用此API从而实现连接数据库、执行SQL语句并返回结果集等编程数据库的能力,如: java.sql.DriveManager:该接口主要定义了用来处理装载驱动程序并且为创建新的数据库连接提供支持。 java.sql.Connection:该接口主要定义了实现对某一种指定数据库连接的功能。 java.sql.Statement:该接口主要定义了在一个给定的连接中作为SQL语句执行声明的容器以实现对数据库的操作。它主要包含有如下的两种子类型。 java.sql.PreparedStatement:该接口主要定义了用于执行带或不带 IN 参数的预编译 SQL 语句。,java.sql.CallableStatement:该接口主要定义了用于执行数据库的存储过程的雕用。 java.sql.ResultSet:该接口主要定义了用于执行对数据库的操作所返回的结果集。 (2)、面向数据库厂商的JDBC Drive API : 数据库厂商必须提供相应的驱动程序并实现JDBC API所要求的基本接口(每个数据库系统厂商必须提供对DriveManager、Connection、Statement、ResultSet等接口的具体实现),从而最终保证Java程序员通过JDBC实现对不同的数据库操作。,11.1.2 JDBC驱动 目前比较常见的JDBC驱动程序可分为以下四个种类型: 1JDBC-ODBC桥接 通过JDBC-ODBC桥接可以很容易地使用JDBC访问ODBC数据源。JDBC-ODBC 桥接方式是利用微软的开放数据库互连接口(ODBC API)同数据库服务器通讯的,它要求客户端上都要安装ODBC驱动,同时还要求配置ODBC数据源。这种连接方式虽然简单但效率低。这种类型的驱动程序最适合于企业网络,或者是用Java编写的三层结构的应用程序服务器代码。 2部分Java的本地API驱动程序 这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。注意,象桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。它比第一种驱动要快。,3JDBC网络纯Java驱动程序 这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为一种DBMS协议。这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。所用的具体协议取决于提供者。通常,这是最为灵活的JDBC驱动程序。此种驱动很适合Internet应 4本地协议纯Java驱动程序,11.2 任务二 建立数据源 11.2.1 建立Access数据库 1ACCESS数据库的设计 在设计数据库时要确定设计数据库的目的、库中需要的表及表中需要的字段。每张表只包含关于一个主题的信息,在设计表时,应注意: 明确有唯一值的字段 确定表间的关系 优化设计 添加数据和新建其他数据库对象 根据用户需求,表的结构设计完成后,就可以继续创建所需的任何查询、窗体、报表、宏和模块等。,2表的创建及操作 Access提供了四种创建空表的方法: (1)、使用数据库向导,可以在一个操作中创建整个数据库所需的全部表、窗体及报表。数据库向导用于新建数据库,但不能用来将新表、窗体或报表添加到已有的数据库中。 (2)、使用表向导来选择表的字段,这些字段可以从各种各样预先定义好的表中选择。 (3)、将数据直接输入到空白的数据表中。当保存新的数据表时,Access将分析数据并且自动为每一字段指定适当的数据类型及格式。 (4)、使用“设计”视图从无到有指定表的全部细节。 创建了数据表后,可以针对表进行添加记录 、定位记录 、编辑数据 、插入记录、选择记录、删除记录和记录的复制等操作了。,11.2.2 建立数据源 1在window xp系统中,单击【开始】-【设置】-【控制面板】-【管理工具】 。 2在弹出的窗口中双击打开【数据源ODBC】应用程序图标,再在打开的【ODBC数据源管理器】窗口中选择【系统DSN】标签。 3单击【添加】按钮,在弹出的对话框中选择【Microsoft Access Driver (*.mdb) 】标签。 4点击【完成】后,在弹出的Access数据源设置对话框中,输入【数据源名】为”mylibDB”,然后单击【选择】按钮,找到刚才建立的数据库(即E盘jpp文件夹下的library.mdb文件),选中它并确定即可。(如果想设置访问密码,可以单击【高级】按钮,会弹出“高级设置选项”对话框)。 5单击确定后,ODBC数据源的设置就完成了。,11.3 任务三 数据库编程,11.3.1 数据库编程过程 1JDBC数据库编程用到的相关类和接口 (1)、DriverManager类: 负责管理JDBC驱动程序。使用JDBC驱动程序之前,必须先将驱动程序加载并向DriverManager注册后才可以使用,同时提供方法来建立与数据库的连接。 方法如下: Class.forName(String driver):加载注册驱动程序 。 Static Connection getConnection(String url,String user,String password) throws SQLException:取得对数据库的连接 。 Static Driver getDriver(String url) throws SQLExcetion:在已经向DriverManager注册的驱动程序中寻找一个能够打开url所指定的数据库的驱动程序。,(2)、Connection类 Connection对象是通过DriverManager.getConnection()方法获得的,主要负责维护JSP/JAVA数据库程序和数据库之间的联机,建立Java程序与数据库之间的连接,并生成三个非常有用的类对象:Statement类对象、DatabaseMetaData类对象和PreparedStatement类对象。 建立Statement类对象的方法如下: Statement createStatement() throws SQLException; Statement createStatement(int resultSetType,int resultSetConcurrency) throws SQLException; 建立DatabaseMetaData类对象的方法如下 : DatabaseMetaData getMetaData() throws SQLException; 建立PreparedStatement类对象的方法如下: PreparedStatement prepareStatement(String sql) throws SQLException;,(3)、Statement类 Statement类用于将SQL语句发送到已连接的数据库中,通过Statement类所提供的方法(见表11-4),可以利用标准的SQL命令,对数据库直接新增、删除或修改等操作。 (4)、PreparedStatement类 PreparedStatement类和Statement类的不同之处在于PreparedStatement类对象会将传入的SQL命令事先编好等待使用,当有单一的SQL指令比多次执行时,用PreparedStatement类会比Statement类有效率。,(5)、DatabaseMetaData类 DatabaseMetaData类保存了数据库的所有特性,并且提供许多方法(见表11-6)来取得这些信息。 (6)、ResultSet类 ResultSet类是Statement类招待SQL语句后生成的记录集。可以认为它是一个二维的表格,主要负责存储查询数据库的结果。并提供一系列的方法(见表11-7)对数据库进行新增、删除和修改操作。也负责维护一个记录指针(Cursor),记录指针指向数据表中的某个记录,通过适当的移动记录指针,可以随心所欲的存取数据库,加强程序的效率。 (7)、ResultSetMetaData类 ResultSetMetaData类对象保存了所有ResultSet类对象中关于字段的信息,提供许多方法(见表11-8)来取得这些信息:,2. 数据库访问过程 (1)、 首先装载驱动程序 装载驱动程序DriverManager类使用Class类的forName方法。语法如下: Class.forName(“)或Class.forName(“).newInstance() 根据需要装载的驱动的不同,具体方法也不同。这里是加载ODBCJDBC桥接的例子: String jdbcDriver=“sun.jdbc.odbc.JdbcOdbcDriver“ try Class.forName(jdbcDriver); catch(java.lang.ClassNotFoundException e) System.out.println(“类未找到错误!“+e); 注意: 装载驱动程序要处理异常。,(2)、 建立连接 指定装载的数据库驱动程序后,可用DriverManager类来进行数据源或数据库的连接。DriverManager类是JDBC基础,用来管理JDBC驱动程序。该类有静态的getConnection()方法,用于验证JDBC数据源,并返回接口Connection对象。 使用JDBCODBC桥接器的例子: Connection con = DriverManager.getConnection (“jdbc:odbc:mylibDB“); 其中的“mylibDB“为建立的数据源的名称。,根据需要装载的驱动的不同,具体的连接方法也不同。 A、这里是加载mySQL JDBC驱动程序 Class.forName(“org.gjt.mm.mysql.Driver “).newInstance(); String url=“jdbc:mysql:/localhost/myDB? user=mymouse&password=mouse2008&useUnicode=true&characterEncoding=8859_1“ Connection con=DriverManager.getConnection(url),B、装载Oracle JDBC OCI驱动程序(用thin模式) Class.forName(“oracle.jdbc.driver.OracleDriver “); String url=“jdbc:oracle:thin:localhost:1521:orcl“; String user=“bigmouse“; String password=“mouse“; Connection con=DriverManager.getConnection(url,user,password); 注意:也可以通过con.setCatalog(“MyDatabase“)来加载数据库。,C、装载DB2驱动程序 Class.forName(“COM.ibm.db2.jdbc.app.DB2Driver “) String url=“jdbc:db2:/localhost:5000/mydata“; / mydata为你的数据库名 String user=“admin“; String password=“; Connection con= DriverManager.getConnection(url,user,password);,D、装载MicroSoft SQLServer驱动程序 Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver“); String url=“jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=bookstore“; / bookstore为你的数据库 String user=“book“; String password=“; Connection con= DriverManager.getConnection(url,user,password);,(3)、 获取数据库信息和创建接口Statement对象 数据库连接成功后,可以使用Connection对象的getMetaData方法取得接口DatabaseMetaData(提供大量的方法)对象来了解数据源或数据库的各种信息。 数据库连接成功后,还可以使用向数据库发送访问数据库的SQL语句的方法来存取数据库。JDBC使用接口Statement的对象(或执行数据库存储过程的子接口CallableStatement、发送带参数的SQL语句的子接口PreparedStatement)来发送SQL语句,Statement对象可用Connection的方法createStatement()来返回。例如: Statement st = con.createStatement();,(4)、 执行SQL语句以存取数据库 希望执行的SQL语句串作为Statement的方法execute()等的参数向数据库传送,以交给数据库引擎,执行SQL对数据库的访问操作。对数据库访问结果是一个数据表的情况,可将这个表(结果集)存入接口ResultSet的对象。 提交SQL语句的Statement的方法有execute、executeQuery和executeUpdate等,分别用于不同类型的SQL语句的提交。 executeQuery:用于产生单个结果集的语句,如查询语句select。 executeUpdate:用于执行不产生结果集的语句,如insert,delete,update等。 execute:可用于执行产生多个结果集或对数据库进行多个操作的SQL语句。,(5)、 对执行SQL语句的结果进行处理 Statement对象将SQL语句封装起来交给数据库引擎,执行select查询语句,将得到结果集ResultSet对象(注意:执行insert、delete、update等查询语句无结果集)。 接口ResultSet对象封装了执行SQL语句的返回结果,以后可根据需要,以便在屏幕上显示结果或做进一步的处理。 在执行select语句后的返回结果中,包含了数据表和数据表内容的相关信息。关于数据表的信息可通过ResultSet的getMetaData方法来创建ResultSetMetaData对象,由这个对象可获取所需数据库的信息。,例如: ResultSetMetaData rsmd = rs.getMetaData(); rsmd.getColumnCount() / 获取列(字段)数 rsmd.getColumnName(列号) / 获取指定列(字段)的列名 在ResultSet中,提供了一整套的getXXX方法(如getInt,getString,getFloat,getDouble等)来访问结果集中当前行的不同列(用列序号或列标题作为这些方法的参数)的数据(类型不同时可将字段类型按照XXX类型来进行类型转换),而next方法可使得访问可对不同的行来进行。,例如,可用下面的程序段对book表的书名(name)和作者(author)进行访问: ResultSet rs = st.executeQuery( “select name,author from book“); while(rs.next() System.out.println(rs.getString(name) +“ “ + rs.getString(3); ,ResultSet自动维护结果集当前数据行的指向光标,首先获得结果集时,指向光标置于结果集的第一行前,以后每调用一次next方法,光标就向下移动一行,这样可按照顺序从第一行到最后一行逐行访问结果集的每一行(访问结束时next返回false值)。 在有些情况下,可能希望任意访问而不是顺序访问结果集的数据行,对某些结果集,可能还希望通过结果集修改数据库的数据,则应在createStatement 方法中加入如下的两个参数,即: Statement st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);,如果只希望任意滚动结果集的指向光标,而不修改数据库的数据,则可在上述两个参数中将第二个参数设置为ResultSet.CONCUR_READ_ONLY。 通过参数的设置,就可以用ResultSet的first,last,previous,absolute,relative等方法来设置当前行,并且还可以根据参数的更新设置,用insertRow(插入行)、deleteRow(删除行)、updateRow(更新行)等方法来对数据库表进行增、删、改的操作。 (6)、 关闭连接 数据库访问结束,为保证数据库数据的完整性和释放系统资源,应明确地关闭数据库的连接:一般是关闭结果集、关闭数据库访问对象和关闭连接。,11.3.2 数据库编程实例 1查询数据库举例 利用前面创建的数据库library.MDB和数据源mylibDB来对数据库中的表book进行查询,显示表中所有图书的编号(no)、书名(name)、作者(author)、出版日期(printdate)和版次(times)。 【例11-2】查询数据库举例。 import java.sql.*; class jdbccx public static void main(String args) try Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“); catch(ClassNotFoundException ce) System.out.println(“SQLException:“+ce.getMessage(); ,try Connection conn= DriverManager.getConnection(“jdbc:odbc:mylibDB“); Statement stmt=conn.createStatement(); ResultSet rs=stmt.executeQuery(“select * from book“); while(rs.next() System.out.println(“编号:”+rs.getString(“no”)+“t”+ “书 名:“+rs.getString(“name“)+“t“+“作者:“+rs.getString (“author“)+“t“+“出版日期:“+rs.getDate(4)+“t“ +“印刷次数:“+rs.getInt(5)+“t“+“价格
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。