Java程序设计实用教程-教学ppt课件 -第11章Java数据库连接(JDBC.ppt
JAVA程序设计实用教程程序设计实用教程 在线教务辅导网:在线教务辅导网:http:/教材其余课件及动画素材请查阅在线教务辅导网教材其余课件及动画素材请查阅在线教务辅导网QQ:349134187 或者直接输入下面地址:或者直接输入下面地址:http:/第11章Java数据库连接(JDBC)JAVA程序设计实用教程程序设计实用教程 第11章Java数据库连接(JDBC)11.1JDBC基础 11.2配置ODBC数据源 11.3JDBC数据库编程 11.4示例 11.5程序实例 JAVA程序设计实用教程程序设计实用教程 11.1JDBC基础 11.1.1JDBC驱动程序 11.1.2JDBCAPI常用类和接口 JAVA程序设计实用教程程序设计实用教程 11.1.1JDBC驱动程序 nJava开发者常常需要访问包括关系数据库在内的各种各样的数据源,JDBC驱动程序利用JDBC标准建立起了Java程序和数据源之间的桥梁。n目前JDBC支持以下几种类型的驱动程序:JAVA程序设计实用教程程序设计实用教程 n1类型1驱动程序负责将JDBC转换为ODBC,并将使用一个ODBC驱动程序与数据库进行通信。Sun的Java2JDK提供(sun.jdbc.odbc.JdbcOdbcDriver)JDBC-ODBC桥接驱动程序。这类驱动程序必须在使用者端的计算机上事先安装好ODBC驱动程序,然后通过JDBC-ODBC的调用方法,进而通过ODBC来存取数据库。适用没有提供JDBC驱动的数据库如Access。通过JDBC-ODBC桥访问数据库工作流程如图11.1所示。JAVA程序设计实用教程程序设计实用教程 n2类型2驱动程序是部分使用Java语言编写的和部分用本机代码编写的驱动程序,这类驱动程序也必须先在使用者计算机上先安装好特定的驱动程序(类似ODBC),然后通过桥接器的转换,把JavaAPI调用转换成特定驱动程序的调用方法,进而存取数据库。JAVA程序设计实用教程程序设计实用教程 n3类型3驱动程序是将JDBC命令转换为与数据库系统无关的网络协议,将数据库访问请求传给服务器,然后服务器将访问请求转换成特定的数据库协议。JAVA程序设计实用教程程序设计实用教程 n4类型4驱动程序是将JDBC访问请求直接转换为特定数据库系统协议。不但无需在使用者计算机上安装任何额外的驱动程序,也不需要在服务器端安装任何中介程序,所有存取数据库的操作,都直接由驱动程序来完成。JAVA程序设计实用教程程序设计实用教程 11.1.2JDBCAPI常用类和接口 1.DriverManager(java.sql.DriverManager)类类 DriverManager类提供了用于管理JDBC驱动程序的方法,装载驱动程序,管理应用程序与驱动程序之间的连接。DriverManager类中的最主要方法是getConnection()方法。该方法建立与数据库的连接。对于简单的应用程序,一般程序员需要在此类中直接使用的方法是getConnection()方法。public static synchronized Connection getConnection(String url);public static synchronized Connection getConnection(String url,String user,String password);这三个参数都是String类型的,user为用户登录名,password为登录口令,url的标准语法由三部分组成,各部分间用冒号分隔:JAVA程序设计实用教程程序设计实用教程 njdbc:njdbc协议。JDBCURL中的协议总是jdbc.n例如,为了通过JDBC-ODBC桥来访问某个数据库,可以用如下的所示的URL:njdbc:odbc:mydatabasen本例中,子协议为odbc,子名称mydatabase是本地ODBC数据资源。JAVA程序设计实用教程程序设计实用教程 2 2DateDate类类Date类中的主要方法:(1)Date()构造方法Date()构造方法有两个,Date(intyear,intmonth,intday)通过参数year(年)、month(月)、day(日)来构造一个日期对象。Date(longdate)通过参数date对应的日期构造一个日期对象,参数date作为一个长整数,表示从1970年1月1日零时零分零秒起开始计时并以毫秒为单位的格林尼治标准时间。JAVA程序设计实用教程程序设计实用教程(2)toString()方法toString()方法用于将Date对象表示的日期转换为yyyy-mm-dd(年月日)格式的字符串。(3)setTime()方法setTime(long date)方法用于将参数date对应的日期设置为当前日期。(4)valueOf()方法valueOf(Strings)方法将日期字符串(参数s为以yyyy-mm-dd格式存放的日期字符串)转换成Date类型值。JAVA程序设计实用教程程序设计实用教程 3Time类类Time类中的主要方法:(1)Time()方法是使用指定的参数(hour、minute、second或time)构造一个时间对象。参数time表示从1970年1月1日零时零分零秒计算的一个日期的毫秒数。(2)valueOf()方法valueOf(Strings)方法将指定字符串参数构造成时间值,参数为hh:mm:ss形式的字符串。JAVA程序设计实用教程程序设计实用教程 4Connection接口 Connection接口的功能是建立数据库应用程序与数据库的连接。只有应用程序成功地与指定的数据源建立了连接,SQL语句才可能发送到数据库,最终被执行并且返回结果。Connection接口中的最主要方法:(1)createStatement()方法createStatement()方法定义如下:JAVA程序设计实用教程程序设计实用教程 Statement createStatement()throws SQLException;createStatement()方法用于创建一个Statement对象。如不带参数的SQL查询(select)语句可通过使用Statement对象来执行。createStatement()方法创建一个Statement对象格式如下:Statement stmt=conn.createStatement();该方法返回一个Statement接口对象stmt,用于发送SQL语句。(2)close()方法close()方法用于关闭一个连接。JAVA程序设计实用教程程序设计实用教程 5Statement接口 Statement接口对象用于将SQL语句发送到数据库中。Statement接口的主要方法:(1)executeUpdate()方法executeUpdate()方法定义如下:intexecuteUpdate(Stringsql)throwsSQLException;executeUpdate(Stringsql)方法用于执行SQL语句的insert(插入)、update(更新)和delete(删除)语句以及SQLDDL(数据定义语句)语句,sql参数字符串,即SQL语句用双引号形成字符串表达式。JAVA程序设计实用教程程序设计实用教程(2)executeQuery()方法 executeUpdate()方法定义如下:ResultSet executeQuery(String sql)throws SQLException;executeQuery(sqlStr)方法用于执行SQL语句的select(查询)并且返回一个结果集。executeQuery(sqlStr)方法执行SQL语句并且返回一个结果集格式如下:ResultSet rs=stmt.executeQuery(SELECT no,name,sex FROM Table1);该方法返回一个ResultSet对象rs,用于处理返回的结果集。其中no、name、sex为字段名,Table1为表名。JAVA程序设计实用教程程序设计实用教程 6ResultSet接口nResultSet接口是用于获取数据库中的表或查询结果。结果集是一个表,它包含符合SQL条件语句的所有行。ResultSet接口提供了访问结果集的许多方法,它通过提供一套getXXX()方法,获得当前行中的不同数据类型的字段值。JAVA程序设计实用教程程序设计实用教程(1)记录指针定位方法记录指针定位方法包括:first()、next()、previous()和last()方法。记录指针是指向结果集中当前数据行的游标。每调用一次next()方法,游标向下移动一行。最初记录指针位于第一行之前,因此,第一次调用next()方法将游标置于第一行上,使第一行为当前行。first()方法使记录指针是指向结果集中的第一行,last()方法使记录指针是指向结果集中的最后一行,previous()方法使游标向上移动一行。这些方法返回值是布尔量,当有新行存在时,返回值为true。JAVA程序设计实用教程程序设计实用教程(2)getXXX()方法getXXX(int columnIndex或String columnName)方法(是所有get方法的总称)用于获取结果集中指定列的值,参数int columnIndex代表列的索引号,参数String columnName代表列的名称的字符串。JAVA程序设计实用教程程序设计实用教程 getXXX()的主要方法:(1)boolean getBoolean()获取结果集中指定列的boolean型的值。(2)byet geyByte()获取结果集中指定列的byet型的值。(3)Date getDate()获取结果集中指定列的Date型的值。(4)double getDouble()获取结果集中指定列的double型的值。(5)float getFloat()获取结果集中指定列的float型的值。(6)int getInt()获取结果集中指定列的int型的值。(7)long getLong()获取结果集中指定列的long型的值。(8)short getShort()获取结果集中指定列的short型的值。(9)String getString()获取结果集中指定列的String型的值。(10)Time getTime()获取结果集中指定列的Time型的值。JAVA程序设计实用教程程序设计实用教程 11.2配置ODBC数据源 n数据库应用程序在使用ODBC管理数据库时,首先需要做的工作是在ODBC管理器中对数据库进行登记注册和连接测试,该项工作就是配置ODBC数据源,数据源即数据库的位置、数据库的类型以及ODBC驱动程序等信息的集合。JAVA程序设计实用教程程序设计实用教程 n我们已经有一个用Access2000设计的数据库:数据库名为student.mdb,数据库存在d:javajcjavaData目录下。n为student.mdb数据库在ODBC管理器中配置数据源的步骤如下:JAVA程序设计实用教程程序设计实用教程(1)打开Windows中的控制面版。(2)双击管理工具图标,出现管理工具窗口。在该窗口中双击数据源(ODBC)图标,出现ODBC数据源对话框,如图11.2所示。(3)在ODBC管理器中,选择用户DSN选项卡,单击“添加”按钮,出现创建新数据源界面,如图11.3所示。(4)在ODBC管理器创建新数据库源中选择Microsoft Access Driver(*.mdb),单击“完成”按钮,出现安装Access数据库界面,如图11.4所示。(5)在ODBC Microsoft Access安装对话框中,输入数据源名为student,单击数据库区域的“选择”按钮,出现选择数据库对话框,如图11.5所示。选择Access数据库(student.mdb)后,单击确定按钮,回到ODBC Microsoft Access安装对话框窗口,如图11.6所示。如果我们要为数据源student设置登录用户名和密码,在ODBC Microsoft Access安装对话框中,选择高级按钮,出现设置高级选项对话框,如图11.7所示。否则单击按钮就完成了数据源设置的全部步骤。JAVA程序设计实用教程程序设计实用教程 n在登录名称文本框里输入一个用户名,在密码文本框里输入口令。然后单击确定按钮,回到ODBCMicrosoftAccess安装界面如图11.4所示,再单击确定按钮就完成了配置数据源的全部过程。最后,关闭控制面版。JAVA程序设计实用教程程序设计实用教程 11.3JDBC数据库编程 在Java 程序设计中,通过JDBC使用数据库的应用程序,需要以下四个步骤:(1)加载JDBC驱动程序。(2)建立与数据库的连接。(3)向数据库发送SQL语句。(4)处理查询结果。JAVA程序设计实用教程程序设计实用教程 1加载JDBC驱动程序 例如:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);/加载JDBC-ODBC桥接驱动程序驱动程序Class.forName(“oracle.jdbc.driver.OracleDriver”);/加载Oracle驱动程序驱动JAVA程序设计实用教程程序设计实用教程 2建立与数据库的连接 利用DriverManager类的静态方法getConnection()来获得与特定数据库的连接实例 lConnection conn=DriverManager.getConnection(url);其中url见下面讲述的有关内容,类型是String,在没有设置用户登录名和密码时,使用此格式方法。lConnection conn=DriverManager.getConnection(url,user,password);这三个参数都是String类型的,user参数是用户登录名,password是登录口令,对于不同的驱动程序与不同的数据库建立连接时,url的内容是不同的,通过JDBC-ODBC桥来访问某个数据库,url是jdbc:driverType:dataSource,有三个部分组成,可分解如下:jdbc:JDBC-ODBC的桥接驱动程序;driverType:为odbc;dataSource:则为ODBC的数据源。JAVA程序设计实用教程程序设计实用教程 3向数据库发送SQL语句 Statement对象用于将SQL语句发送到数据库中。通过上面已创建的连接数据库对象conn的createStatement()方法来创建一个Statement对象。(1)创建Statement对象 如下面代码段中所示:Connection con=DriverManager.getConnection(url,user,password);Statement stmt=con.createStatement();(2)使用Statement对象执行语句 方法executeQuery()用于产生单个结果集的语句,例如SELECT查询语句。方法 executeUpdate()用于执行 INSERT、UPDATE 或 DELETE 语句以及SQL DDL(数据定义语言,例如 CREATE TABLE 和 DROP TABLE)语句,该方法执行后的返回值是一个整数,指示受影响的行数(即更新计数)。例如删除成绩表中,学号为951001的记录的executeUpdate()方法格式如下:stmt.executeUpdate(“Delete from 成绩 WHERE 学号=951001”);例如查询学生表中所有记录的executeQuery()方法格式如下:ResultSet rs=stmt.executeQuery(select*from 学生 )JAVA程序设计实用教程程序设计实用教程 4处理查询结果 ResultSet(包含符合SQL条件语句的所有行),它通过一套get方法(这些get方法可以访问当前行中的不同列)对这些数据的访问。ResultSet.next方法使游标移动到ResultSet中的下一行,使下一行成为当前行。下面的代码段是执行SQL语句的示例,该SQL语句将返回行集合,并且对结果集进行处理。Statementstmt=conn.createStatement();ResultSet rs=stmt.executeQuery(SELECT*FROM 学生);while(rs.next()String xh=rs.getString(学号);String xm=rs.getString(“姓名”);Stringxb=rs.getString(性别);Date yy=rs.getDate(“出生日期”);String jl=rs.getString(“简历”);int jj=rs.getInt(“奖学金”);System.out.println(学号+xh+姓名+xm+性别+xb+出生年月+yy+简历+jl+奖学金+jj );JAVA程序设计实用教程程序设计实用教程 5关闭连接对数据库操作完毕后,应该与数据源的连接关闭。关闭与数据源连接的方法是close()。其格式为:对象.close();例如要关闭数据源连接conn,使用下面语句:conn.close();JAVA程序设计实用教程程序设计实用教程 11.4 示例示例下列代码段给出了以上三步的基本示例:Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);Connection con=DriverManager.getConnection(jdbc:odbc:student,);Statement Stmt=con.createStatement();ResultSet rs=Stmt.executeQuery(select*from 学生 );while(rs.next()String xh=rs.getString(“学号”);String xm=rs.getString(姓名);String xb=rs.getString(性别);Date yy=rs.getDate(出生日期);String jl=rs.getString(简历);int jj=rs.getInt(奖学金);System.out.println(学号+xh+姓名+xm+性别+xb+出生年月+yy+简历+jl+奖学金+jj);/打印输出 conn.close();JAVA程序设计实用教程程序设计实用教程 11.5程序实例 实际我们在加载JDBC驱动程序、建立与数据库的连接、向数据库发送SQL语句和处理查询结果时,可能发生异常,因此必须捕获这些异常。所以加载JDBC驱动程序的标准方法是:try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);catch(ClassNotFoundException ex2)System.out.println(加载JDBC驱动程序失败!+ex2.getMessage();/打印异常信息 JAVA程序设计实用教程程序设计实用教程 11.5.1实例1 本实例利用JDBC-ODBC桥驱动程序访问数据源student所对应的Access数据库student.mdb,该数据库为空结构,要求创建表文件“成绩”表,其表结构如表11.1所示。数据源student所对应的Access数据库student.mdb JAVA程序设计实用教程程序设计实用教程 n表11.1成绩表结构 JAVA程序设计实用教程程序设计实用教程 算法分析:(1)加载JDBC驱数据库动程序。(2)建立与数据源student的连接。(3)创建Statement对象stmt。(4)向数据库发送SQL语言(利用“Statement”对象)create table 成绩(+学号 VARCHAR(10),+课程号 VARCHAR(6),+成绩 INTEGER);。源程序(javajcch11CreatTable.java):JAVA程序设计实用教程程序设计实用教程 packagech11;/在数据库student.mdb中创建成绩表(数据源名为student)importjava.sql.*;publicclassCreatTablepublicstaticvoidmain(Stringargs)Stringurl=jdbc:odbc:student;Connectionconn=null;Statementstmt=null;try/加载JDBC驱数据库动程序Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);catch(java.lang.ClassNotFoundExceptione)System.err.print(ClassNotFoundException:);System.err.println(e.getMessage();JAVA程序设计实用教程程序设计实用教程 try/建立与数据源student(student.mdb)的连接conn=DriverManager.getConnection(url);/创建Statement对象stmt=conn.createStatement();StringstrSQLCreateTable=createtable成绩(+学号VARCHAR(10),+课程号VARCHAR(6),+成绩INTEGER);/向数据库发送SQL语言(利用“Statement”对象)stmt.executeUpdate(strSQLCreateTable);/stmt.close();conn.close();System.out.println(Tablesuccessfullycreated!);catch(SQLExceptionex)System.err.println(SQLException:+ex.getMessage();JAVA程序设计实用教程程序设计实用教程 11.5.2实例2 本实例利用JDBC-ODBC桥驱动程序访问数据源student所对应的Access数据库student.mdb,在“成绩”表中插入数据如表11.2所示。算法分析:(1)加载JDBC驱数据库动程序。(2)建立与数据源student的连接。(3)创建Statement对象stmt。(4)向数据库发送SQL语言(利用“Statement”对象)insert into 成绩 values(951001,0001,89)等。源程序(javajcsrcch11 InsertData.java):JAVA程序设计实用教程程序设计实用教程 n表11.2成绩表内容 JAVA程序设计实用教程程序设计实用教程 package ch11;import java.sql.*;/在成绩表中插入数据(数据源名为student)public class InsertData public static void main(String args)try /加载JDBC驱数据库动程序 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);System.out.println(成功加载JDBC-ODBC驱动程序!);catch(ClassNotFoundException ee)System.out.println(加载JDBC-ODBC驱动程序失败!);System.out.println(ee.getMessage();return;JAVA程序设计实用教程程序设计实用教程 try /建立与数据源student的连接,用户名和口令为空 Connection conn=DriverManager.getConnection(jdbc:odbc:student,);/创建Statement对象 Statement Stmt=conn.createStatement();/向数据库发送SQL语言(利用“Statement”对象)Stmt.executeUpdate(“insert into 成绩 values(951001,0001,89);System.out.println(在成绩表插入数据成功!);conn.close();catch(SQLException e1)System.out.println(在成绩表插入数据失败!);System.err.println(SQLException:+e1.getMessage();return;JAVA程序设计实用教程程序设计实用教程 11.5.3实例3 本实例利用JDBC-ODBC桥驱动程序访问数据源student所对应的Access数据库student.mdb,修改“成绩”表中记录,将学号为951001并且课程号为0002的成绩修改成100分,最后得到表的内容如表11.3所示。算法分析:(1)加载JDBC驱数据库动程序。(2)建立与数据源student的连接。(3)创建Statement对象stmt。(4)向数据库发送SQL语言(利用“Statement”对象)UPDATE 成绩 SET 成绩=100 WHERE 学号=951001 and 课程号=0002;。源程序(javajcsrcch11UpdateRecord.java):JAVA程序设计实用教程程序设计实用教程 package ch11;import java.sql.*;/修改成绩表中数据(数据源名为student)public class UpdateRecord public static void main(String args)try/加载JDBC驱数据库动程序 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);System.out.println(成功加载JDBC-ODBC驱动程序!);catch(ClassNotFoundException ee)System.out.println(加载JDBC-ODBC驱动程序失败!);System.out.println(ee.getMessage();return;JAVA程序设计实用教程程序设计实用教程 try /建立与数据库student.mdb(student)的连接 Connection conn=DriverManager.getConnection(jdbc:odbc:student,);/创建Statement对象 Statement Stmt=conn.createStatement();String sqlstr=UPDATE 成绩 SET 成绩=100 WHERE 学号=951001 and 课程号=0002;/向数据库发送SQL语言(利用“Statement”对象)Stmt.executeUpdate(sqlstr);System.out.println(修改成绩表成功!);conn.close();catch(SQLException e1)System.out.println(修改成绩表失败!);System.err.println(SQLException:+e1.getMessage();return;JAVA程序设计实用教程程序设计实用教程 11.5.4实例4 本实例利用JDBC-ODBC桥驱动程序访问数据源student所对应的Access数据库student.mdb,删除“成绩”表中记录,将学号为951001的学生的成绩删除,最后得到表的内容如表11.4所示。算法分析:(1)加载JDBC驱数据库动程序。(2)建立与数据源student的连接。(3)创建Statement对象stmt。(4)向数据库发送SQL语言(利用“Statement”对象)Delete from 成绩 WHERE 学号=951001;。源程序(javajcsrcch11DeleteRecord.java):JAVA程序设计实用教程程序设计实用教程 package ch11;import java.sql.*;/删除成绩表中记录(数据源名为student)public class DeleteRecord public static void main(String args)try/加载JDBC驱数据库动程序 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);System.out.println(成功加载JDBC-ODBC驱动程序!);catch(ClassNotFoundException ee)System.out.println(加载JDBC-ODBC驱动程序失败!);System.out.println(ee.getMessage();return;JAVA程序设计实用教程程序设计实用教程 try /建立与数据库student.mdb(student)的连接 Connection con=DriverManager.getConnection(jdbc:odbc:student,);/创建Statement对象 Statement Stmt=con.createStatement();String sqlstr=Delete from 成绩 WHERE 学号=951001;/向数据库发送SQL语言(利用“Statement”对象)Stmt.executeUpdate(sqlstr);System.out.println(删除学生成绩成功!);con.close();catch(SQLException e1)System.out.println(删除学生成绩失败!);System.err.println(SQLException:+e1.getMessage();return;JAVA程序设计实用教程程序设计实用教程 11.5.5实例5 本实例利用JDBC-ODBC桥驱动程序访问数据源student所对应的Access数据库student.mdb,查询“学生”表记录,学生表结构和学生表记录如表11.5和表11.6所示。算法分析:(1)加载JDBC驱数据库动程序。(2)建立与数据源student的连接。(3)创建Statement对象stmt。(4)向数据库发送SQL语言(利用“Statement”对象)select*from 学生。(5)处理查询结果。源程序(javajcsrcch11QueryRecord.java):JAVA程序设计实用教程程序设计实用教程 表11.5学生表结构 JAVA程序设计实用教程程序设计实用教程 package ch11;import java.sql.*;import javax.swing.*;/查询成绩的数据,并显示(数据源名为student)public class QueryRecord public static void main(String args)try/加载JDBC驱数据库动程序 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);System.out.println(成功加载JDBC-ODBC驱动程序!);catch(ClassNotFoundException ee)System.out.println(加载JDBC-ODBC驱动程序失败!);System.out.println(ee.getMessage();return;JAVA程序设计实用教程程序设计实用教程 try /建立与数据源student的连接 Connection conn=DriverManager.getConnection(jdbc:odbc:student,);System.out.println(连接 学生.mdb数据库成功!);Statement Stmt=conn.createStatement();ResultSet rs=Stmt.executeQuery(select*from 学生 );/定位到第一条记录 boolean moreRecords=rs.next();if(!moreRecords)/如果没有记录,则显示一条消息 JOptionPane.showMessageDialog(null,结果集中无记录);return;do String xh=rs.getString(学号);String xm=rs.getString(姓名);String xb=rs.getString(性别);Date yy=rs.getDate(出生年月);String jl=rs.getString(简历);JAVA程序设计实用教程程序设计实用教程 int jj=rs.getInt(“奖学金”);System.out.println(学号+xh+姓名+xm+性别+xb+出生年月+yy+简历+jl+奖学金+jj );while(rs.next();conn.close();catch(SQLException e1)System.out.println(发送(sql)学生.mdb数据库失败!);System.err.println(SQLException:+e1.getMessage();return;