




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
233第第第15章 Java数据库编程第15章 Java数据库编程现在很多程序中都要涉及到有关数据库的操作,其中相当一部分程序还是以数据库为核心来组织整个系统的,因此Java程序对数据库的访问和操作是Java程序设计中比较重要的一个部分,本章将介绍这个方面的内容。由于篇幅的关系,在这里只是简单介绍,要想深入学习,读者可以去查阅相关资料。15.1 数据库连接要进行数据库的编程,首先要做的就是让程序连接数据库。下面就Java语言连接数据库的方法进行介绍。15.1.1 JDBC简介JDBC是Java DataBase Connection的简称,是一种用Java实现的数据库接口技术,是开放数据库ODBC的Java实现。数据库前端应用要完成对数据库中数据的操作,必须要使用SQL语言的有关语句,但是SQL是一种非过程语言,除了对数据库基本操作外,它所能完成的功能非常有限,并不能适应整个前端的应用编程。为此,需要其他的语言来实现SQL语言的功能以完成对数据库的操作。为了达到这个目的,Java中专门设置了一个java.sql包,这个包里定义了很多用来实现SQL功能的类,使用这些类,编程人员就可以很方便地开发出数据库前端的应用。辅助Java程序实现数据库功能的配套支持技术通称为JDBC。用JDBC开发数据库应用的原理如图15-1所示。图15-1 JDBC工作原理由图15-1可知,JDBC由两层组成。上面一层是JDBC API,负责与Java应用程序通信,向Java应用程序提供数据(Java应用程序通过JDBC中提供的相关类来管理JDBC的驱动程序)。下面一层是JDBC Driver API,主要负责和具体数据环境的连接。图11-6中列出了利用JDBC Driver API访问数据库的几种不同方式。第一种方法是使用JDBCODBC桥实现JDBC到ODBC的转化,转化后就可以使用ODBC的数据库专用驱动程序与某个特定的数据库相连。这种方法借用了ODBC的部分技术,使用起来比较简单,但同时由于C驱动程序的引入而失去了Java的跨平台性。第二种方法使JDBC与某数据库系统专用的驱动程序相连,然后直接连入数据库。这种方法的优点是程序效率高,但由于要下载和安装专门的驱动程序,限制了前端应用与其他数据库系统的配合使用。第三种方法使用JDBC与一种通用的数据库协议驱动程序相连,然后再利用中间件和协议解释器将这个协议驱动程序与某种具体的数据库系统相连。这个方法的优点是程序不但可以跨平台,而且可以连接不同的数据库系统,有很好的通用性,但运行这样的程序需要购买第三方厂商开发的中间件和协议解释器。下面就前两种Java连接数据库的方法进行介绍。在介绍Java数据库连接之前,先设计一个本书例子中用到的数据库,选用微软SQLServer的数据库环境。假设读者都已经安装了这个数据库环境,并已经进行了初步的配置。在SQL Server数据库中建立一个company数据库,并在数据库中加入如下的例子表employee。当然真正的数据库远远比这个复杂多了,表和数据也比这个多得多,这个实例数据库只是用来学习Java的数据库编程,已经够用了。表15-1 员工信息表employeefirstnamelastnameageaddresscityLiMing45No.77 Changan RoadBeijingWangMing28No.88 zhonghua RoadBeijingZhangXiaogang40No.23 Gardon RoadShanghaiLiuLi35No.23 Gardon RoadShanghaiHongXiaoxiao25No.777 Zhongshan RoadNanjing15.1.2 用JDBC-ODBC连接数据库用JDBC-ODBC连接数据库首先要建立数据源,关于数据源创建的相信读者也非常熟悉了,本书不做介绍,假设为上述的company数据库建立一个同名的company数据源。则以下是用JDBC-ODBC连接数据库的步骤:1加载驱动程序加载Java应用程序所用的数据库的驱动程序。当然现在用的是JDBC-ODBC驱动,这个驱动程序不需要专门安装。代码格式如下:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);2建立连接 与数据库建立连接的标准方法是调用方法:Drivermanger.getConnection(Stringurl,Stringuser,Stringpassword)。Drivermanger类用于处理驱动程序的调入,并且对新的数据库连接提供支持。其中url是数据库连接字符串,格式为“jdbc:odbc:数据源名称”,user和password分别是数据库的用户名和密码。3执行SQL语句 JDBC提供了Statement类来发送SQL语句,Statement类的对象由createStatement方法创建;SQL语句发送后,返回的结果通常存放在一个ResultSet类的对象中,ResultSet可以看作是一个表,这个表包含由SQL返回的列名和相应的值,ResultSet对象中维持了一个指向当前行的指针,通过一系列的getXXX方法,可以检索当前行的各个列,从而显示出来。例15.1 JDBCODBC连接company数据库的示例程序JDBCTest.javaimport java.sql.*;public class JDBCTest public static void main(String args)String url=jdbc:odbc:company; String user=sa;String password=sa;String ls_1=select * from employee;tryClass.forName(sun.jdbc.odbc.JdbcOdbcDriver); /加载驱动程序 /建立连接Connection con=DriverManager.getConnection(url,user,password); Statement stmt=con.createStatement(); /执行SQL ResultSet rs=stmt.executeQuery(ls_1);/得到结果System.out.print(fistname );System.out.print(lastname );System.out.print(age );System.out.print(address );System.out.println(city);while(rs.next() /打印数据库中的数据System.out.print(rs.getString(1)+ | );System.out.print(rs.getString(2)+ | );System.out.print(rs.getInt(3)+ | );System.out.print(rs.getString(4)+ | );System.out.println(rs.getString(5);rs.close();stmt.close();con.close();catch(SQLException sqle)System.out.println(1+sqle.toString();catch(Exception e)System.out.println(2+e.toString();图15-2 例15.1的运行效果图这个程序的主要作用是将前面建立的employee表中的所有数据从数据库company中查询出来,传送到运行Java程序的计算机并在屏幕上显示出来。为了达到这个目标,用到了JDBC API中的类DriverManager、Statement和ResultSet。其中DriverManager主要负责把数据库驱动装入,Statement是用来执行SQL语句,在程序中是一个查询语句,ResultSet是用来接收从数据库中返回的数据。在Java中对数据库的编程主要就是对这些JDBC API的灵活使用,将在下一节中详细介绍这几个类的使用方法。15.1.3 用JDBC专用驱动程序连接数据库 用数据库专用的驱动程序连接首先要安装数据库的JDBC驱动程序,有时候这些驱动程序可以从SUN公司或有关数据库系统生产商的网站上下载,它们必须首先安装在运行Java程序的本地机上并正确设置环境变量。对于本书中的SQL Server数据库,要求下载SQL Server 2000 Driver for JDBC驱动程序,然后正确安装,并为安装目录下的msbase.jar、mssqlsever.jar和msutil.jar三个jar文件设置正确的类路径或者导入到相应的开发环境中。 用JDBC驱动和JDBC-ODBC驱动连接数据库的步骤完全一样,只是具体的驱动程序和连接字符串不一样,如例15.2:例15.2 JDBC连接company数据库的示例程序JDBCTest.java(部分)public static void main(String args)String url= jdbc:microsoft:sqlserver:/127.0.0.1:1433;DatabaseName=company ; tryClass.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver ); /加载驱动程序 Connection con=DriverManager.getConnection(url,user,password); 在本例中加载的驱动程序是com.microsoft.jdbc.sqlserver.SQLServerDriver。连接字符串为jdbc:microsoft:sqlserver:/127.0.0.1:1433;DatabaseName=company,这里只有部分程序,其它的代码和例15.1完全相同,这里用到的数据库服务器是本地服务器,若是其它服务器,则只要将127.0.0.1改为相应的服务器名称或IP地址即可。程序的运行效果完全和例15.1相同。15.2 JDBC编程图15-3 JDBC API的主要结构在Java中,用JDBC对数据库编程,主要是对JDBC API的应用,在JDBC API中对数据库的应用主要是对DriverManager、Connection、Statement和ResultSet这几个类的应用。图15-3是JDBA API的主要结构。下面对这几个类作一个简单说明。1DriverManagerDriverManager类是JDBC的管理层,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。对于简单的应用程序,一般程序员需要在此类中直接使用的惟一方法是DriverManager.getConnection。正如名称所示,该方法将建立与数据库的连接。DriverManager类包含一列Driver类,它们已通过调用方法DriverManager.registerDriver对自己进行了注册。通过调用方法Class.forName,可显式地加载驱动程序类,然后自动在DriverManager类中注册。以下代码加载类jdbc.odbcJdbcOdbcDriver:class.forName(sun.jdbc.odbc.JdbcOdbcDriver);加载Driver类并在DriverManager类中注册后,它们即可用来与数据库建立连接。当调用DriverManager.getConnection方法发出连接请求时,DriverManager将检查每个驱动程序,查看它是否可以建立连接。以下代码是通常情况下用驱动程序(例如JDBC-ODBC桥驱动程序)建立连接所需步骤的示例:Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);/加载驱动程序 Stringurl=jdbc:odbc:company;Connection con=DriverManager.getConnection(url,userID,passwd); 这个示例表示在DriverManager中注册一个sun.jdbc.odbc.JdbcOdbcDriver驱动(使用JDBC-ODBC桥驱动),然后用DriverManager的getConnection方法创建一个Connection对象,然后这个对象就可以连接url指定的数据库。在本例中连接的数据库是ODBC数据源company,这个数据源的用户名是userID,密码是passwd。2StatementStatement对象用于将SQL语句发送到数据库中。建立了到特定数据库的连接之后,就可用该连接发送SQL语句。Statement对象用Connection的方法createStatement创建,代码如下:Connectioncon=DriverManager.getConnection(url,userID,passwd); Statementstmt=con.createStatement();为了执行Statement对象,被发送到数据库的SQL语句将被作为参数提供给Statement的方法。下面这句代码通过一个查询语句创建了一个结果集,用户就可以从这个rs结果集中读出数据供Java程序使用:ResultSetrs=stmt.executeQuery(SELECTa,b,cFROMTable2); Statement接口提供了三种执行SQL语句的方法:executeQuery、executeUpdate和execute。使用哪一个方法由SQL语句的内容决定。方法executeQuery用于产生单个结果集的语句,如SELECT语句。方法executeUpdate用于执行INSERT、UPDATE或DELETE语句以及SQLDDL(数据定义语言)语句,如CREATETABLE和DROPTABLE。INSERT、UPDATE或DELETE语句的效果是修改表中零行或多行中的一列或多列。executeUpdate的返回值是一个整数,指示受影响的行数(即更新计数)。对于CREATETABLE或DROPTABLE等不操作行的语句,executeUpdate的返回值总为零。方法execute用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要使用这些高级功能,所以在此不再细述。执行语句的所有方法都将关闭所调用的Statement对象的当前打开结果集(如果存在),这意味着在重新执行Statement对象之前,需要完成对当前ResultSet对象的处理。3ResultSetResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。ResultSet.next方法用于移动到ResultSet中的下一行,使下一行成为当前行。结果集一般是一个表,其中有查询所返回的列标题及相应的值。例如,如果查询为SELECT*FROMemployee,则结果集将返回employee表中的所有记录。 下面的代码段是执行SQL语句的示例。该SQL语句将返回行集合,其中列1为fristname,列2为lastname,而列3为age,列4为address,列5则为city。java.sql.Statementstmt=conn.createStatement(); ResultSetrs=stmt.executeQuery(SELECT*FROMemployee); while(rs.next() /打印数据库中的数据System.out.print(rs.getString(1)+ | );System.out.print(rs.getString(2)+ | );System.out.print(rs.getInt(3)+ | );System.out.print(rs.getString(4)+ | );System.out.println(rs.getString(5);ResultSet维护指向其当前数据行的光标。每调用一次next方法,光标向下移动一行。最初它位于第一行之前,因此第一次调用next将把光标置于第一行上,使它成为当前行。随着每次调用next导致光标向下移动一行,按照从上至下的次序获取ResultSet行。在ResultSet对象或其父辈Statement对象关闭之前,光标一直保持有效。方法getXXX提供了获取当前行中某列值的途径。列名或列号可用于标识要从中获取数据的列。例如,如果ResultSet对象rs的第二列名为“title”,并将值存储为字符串,则下列任一代码将获取存储在该列中的值。Strings=rs.getString(title); Strings=rs.getString(2);注意:列是从左至右编号的,并且从列1开始。同时,用getXXX方法输入的列名不区分大小写。下面是一个JDBC数据库编程的例子,在这个例子中,设计了一个GUI数据库查询的软件,在程序的用户窗体中设计了一个下拉项,通过用户选择的下拉选择查询数据库,并将用户需要的数据显示在文本框中。例15.4 设计用户界面查询数据库数据的示例程序。import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.sql.*;class MainFrame extends JFrame implements ActionListener JPanel contentPane; BorderLayout borderLayout1 = new BorderLayout(5, 10); Label prompt; Choice firstname; Button querybutton; TextArea result;public MainFrame()contentPane = (JPanel)this.getContentPane(); contentPane.setLayout(borderLayout1);this.setTitle(DBQuery);addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); prompt=new Label(firstname); firstname=new Choice(); querybutton=new Button(Query); result=new TextArea(); tryClass.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver ); /加载驱动程序String url= jdbc:microsoft:sqlserver:/127.0.0.1:1433;DatabaseName=company ;String user=sa;String password=sa; String ls_1=select firstname from employee;Connection con=DriverManager.getConnection(url,user,password);Statement Stmt=con.createStatement(); /执行SQL ResultSet rs=stmt.executeQuery(ls_1);while(rs.next()firstname.add(rs.getString(1);rs.close();stmt.close();con.close();catch(SQLException sqle)catch(Exception e)contentPane.add(prompt,BorderLayout.WEST);contentPane.add(firstname,BorderLayout.CENTER);contentPane.add(querybutton,BorderLayout.EAST);contentPane.add(result,BorderLayout.SOUTH);querybutton.addActionListener(this); public void actionPerformed(ActionEvent e) if(e.getSource()=querybutton) tryClass.forName(sun.jdbc.odbc.JdbcOdbcDriver); /加载驱动程序String url=jdbc:odbc:company;String user=sa;String password=sa; String queryfirstname=firstname.getSelectedItem();String ls_1=select * from employee+ where firstname=+queryfirstname+; Connection con=DriverManager.getConnection(url,user,password);Statement stmt=con.createStatement(); /执行SQL ResultSet rs=stmt.executeQuery(ls_1);result.setText();while(rs.next()String msg=rs.getString(1)+|+ rs.getString(2)+|+ rs.getInt(3)+|+ rs.getString(4)+|+ rs.getString(5) ;result.append(msg);rs.close();stmt.close();con.close();catch(SQLException sqle)catch(Exception exce) public static void main(String args)MainFrame frame = new
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东古代文学自考试题及答案
- 乐谱理论考试题及答案
- 护士从业资格考试试题及答案解析
- 课件显示倒计时
- 勘测测量考试题及答案
- 铝电解筑炉工内部技能考核试卷及答案
- 酒吧音乐考试题及答案
- 加工中心操作工转正考核试卷及答案
- 抗生素酶裂解工基础考核试卷及答案
- 2025年教师招聘之《幼儿教师招聘》模考模拟试题及答案详解(必刷)
- 2025-2030中国金红石开发利用市场发展潜力与产销规模规划报告
- 成本控制与成本分析方法指导手册
- 环境灾害预警系统-洞察及研究
- 广播电视机线员技能操作考核试卷及答案
- 辅警结构化面试题及答案(2025年)
- 2025年托管厨师合同协议书
- 2025年医疗器械专业知识培训试题及答案
- 矛盾纠纷调解课件
- 《我是什么》课件 统编版语文二年级上册
- 师生互动与课件使用
- 烷烃的命名教学课件
评论
0/150
提交评论