1 / 33

第 十 三 章

第 十 三 章. JDBC 基础知识. 回顾 1. File 类用于访问文件系统,但只能操作文件的属性,而不能对文件进行读 / 写 流是指一连串流动的字符,是以先进先出方式发送信息的通道 从流动方向上区分,流可以分为输入流和输出流,从格式上区分,可以分为字节流和字符流 使用 FileInputStream 类和 FileOutputStream 类以字节方式读写文件. 回顾 2. 对于 Unicode 编码的文件,使用 FileReader 类配合 BufferedReader 类读文件,使用 FileWriter 类配合 BufferedWriter 类写文件

chaney
Download Presentation

第 十 三 章

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第 十 三 章 JDBC基础知识

  2. 回顾1 • File类用于访问文件系统,但只能操作文件的属性,而不能对文件进行读/写 • 流是指一连串流动的字符,是以先进先出方式发送信息的通道 • 从流动方向上区分,流可以分为输入流和输出流,从格式上区分,可以分为字节流和字符流 • 使用FileInputStream类和FileOutputStream类以字节方式读写文件

  3. 回顾2 • 对于Unicode编码的文件,使用FileReader类配合BufferedReader类读文件,使用FileWriter类配合BufferedWriter类写文件 • 要从控制台接受输入,需要将System.in对象进行包装,使用如下语句: InputStreamReader isr = new InputStreamRader(System.in); BufferedReader br = new BufferedReader(isr); • 使用br.readLine()方法接受输入

  4. 本章目标 • 了解JDBC的概念和必要性 • 了解JDBC驱动程序类型 • 理解JDBC程序的结构 • 使用JDBC进行数据库编程

  5. 数据库访问技术简介 • 当今企业级应用程序大部分采用了客户机/服务器(C/S)模式; • 客户端机器需要与服务器进行通讯,要操作数据库中的数据,执行SQL语句以及检索查询结果; • 在Java中实现这些活动的常用技术有ODBC和JDBC两种。

  6. 数据库编程 执行 SQL 语句 客户机/服务器 应用程序 数据库 检索查询结果 ODBC JDBC 数据库编程示意图

  7. 关于DBMS • DBMS(DataBase Management System)是指数据库管理系统; • 目前DBMS的生产商众多,产品也不尽相同,如: • Oracle公司的Oracle系列; • Microsoft公司的Access系列和SQL Server系列; • Microsoft公司早期的FoxPro; • IBM公司的DB2; • Sybase公司的Sybase; • 还有自由开源的MySQL等等。 • 这就意味着编程语言要针对不同的DBMS开发不同的应用程序,这将是一个非常枯燥的工作。

  8. ODBC • ODBC(Open DataBase Connectivity)是指开放式数据库连接,是由Microsoft公司提供的应用程序接口(API,Application Programming Interface); • 它负责连接各种不同产商和类型的DBMS,然后为各种不同的编程语言提供查询、插入、修改和删除数据库的功能; • 如同在各种不同的DBMS和各种不同的编程语言之间架设了一座通用的桥梁。

  9. JDBC • JDBC(Java DataBase Connectivity)是由Sun Microsystem公司提供的API; • 它为Java应用程序提供了一系列的类,使其能够快速高效地访问数据库; • 这些功能是由一系列的类和对象来完成的,我们只需使用相关的对象,即可完成对数据库的操作。

  10. Java 程序 JDBC 驱动程序 SQL 命令 结果 数据库 JDBC工作方式示意图

  11. JDBC驱动程序类型 • 使用JDBC连接数据库可以通过不同的驱动实现,有4种驱动类型: • JDBC-ODBC桥驱动 • 纯Java驱动 • 本地API部分Java驱动 • JDBC网络纯Java驱动 • 不论采用哪种驱动类型,在程序对数据库的操作方式基本相似,只是加载不同的驱动程序即可。

  12. java.sql包 • java.sql包也是Java内置的包,其中包含了一组用于与数据库进行通信的类和接口; • 如果要使用到这些类和接口的话,则必须显式地声明如下语句: import java.sql.*;

  13. java.sql包中的一些接口

  14. java.sql包中的一些类

  15. 开 始 导入 java.sql包 JDBC-ODBC桥方式 纯Java驱动方式 建立数据源(ODBC) 附加相应产商提供的驱动 加载并注册驱动程序 创建Connection 对象 创建 Statement 对象 关闭ResultSet对象 使用ResultSet对象 执行SQL语句 关闭Statement对象 关闭Connection对象 结 束 JDBC程序访问数据库步骤

  16. 步骤详解1:建立数据源 • 这里以JDBC-ODBC桥驱动方式为例,逐步详细地讲解在Java程序中如何操作数据库,而对于其他驱动方式,只需更换驱动程序即可,其余不变; • 首先建立ODBC数据源: 【开始】→ 【设置】→ 【控制面板】→【管理工具】→【数据源(ODBC)】 • 新建数据源,名称可以任意,这里假设已建立了一个名为myODBC的数据源,连接到SQL Server 2000中的pubs数据库。

  17. 步骤详解2:加载驱动程序 • 使用Class.forName()方法,将驱动程序的类加载到JVM(Java虚拟机,Java Virtual Machine)中; • 对于使用JDBC-ODBC桥驱动方式,应该加载sun.jdbc.odbc.JdbcOdbcDriver类,如: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); • 如果指定的类不能成功加载,将会引发ClassNotFoundException异常。

  18. 步骤详解3:创建连接对象 • 成功加载驱动程序后,必须使用DriverManager类的静态方法getConnection()来获得连接对象; • 其函数原型: Connection getConnection(String url, String user, String password); • 该方法需要3个参数,url是连接字符串,表示数据库的类型和名称,user是登录数据库的用户名,password是登录口令,并返回一个Connection对象,如果连接不成功,将抛出SQLExcption异常; • 对于使用JDBC-ODBC桥的连接方式,连接字符串的一般形式是:“jdbc:odbc:数据源名称” • 如: Connection con = DriverManager.getConnection(“jdbc:odbc:MyODBC”, “sa”, “”);

  19. 步骤详解4:创建操作句柄 • 一旦成功连接到数据库,获得连接对象后,必须通过连接对象创建操作句柄对象,才可以执行SQL语句; • 可以使用连接对象的createStatement()方法来创建操作句柄对象,其函数原型: statement createStatement(); • 如: Statement sta = con.createStatement(); • 如果创建失败,将抛出SQLException异常。

  20. 步骤详解5:执行SQL语句 • 使用操作句柄来执行SQL语句,有两种情况: • 一种是执行DELETE、UPDATE和INSERT之类的数据库操作语句(DML),这样的语句没有数据结果返回,使用Statement对象的executeUpdate()方法执行; • 函数原型: int executeUpdate(String sql); 参数sql是要执行的SQL语句,执行成功返回受该语句影响的行数,否则抛出SQLException异常 • 如: sta.executeUpdate("DELETE FROM [authors] WHERE [au_lname] = 'McBadden'")

  21. 步骤详解5:执行SQL语句(续) • 另一种是执行SELECT这样的数据查询语句(DQL),这样的语句将从数据库中获得所需的数据,使用Statement对象的executeQuery ()方法执行; • 函数原型: ResultSet executQuery(String sql); 参数sql是要执行的查询语句,查询成功返回包含有结果数据的结果集对象,否则抛出SQLException异常; • 如: ResultSet rs = sta.executeQuery("SELECT * FROM [authors]");

  22. 步骤详解6:关闭资源 • 当对数据库的操作结束后,应当将所有已经被打开的资源关闭,否则将会造成资源泄漏; • 连接对象、操作句柄对象和结果集对象都有执行关闭的方法close(); • 函数原型都是:void close(); • 如: rs.close(); //关闭结果集 sta.close(); //关闭操作句柄 con.close(); //关闭数据库连接 • 有可能抛出SQLException异常; • 请注意关闭的顺序,最后打开的资源最先关闭,最先打开的资源最后关闭。

  23. 数据库操作示例 import java.sql.*; //导入java.sql包 publicclass JDBCDemo { publicstaticvoid main(String[] args) { String strCon = “jdbc:odbc:MyODBC”; //连接字符串 String strUser = “sa”; //数据库用户名 String strPwd = “”; //口令 System.out.println("正在连接数据库..."); try { //监控异常 Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); //加载驱动程序 Connection con; //获得连接对象 con = DriverManager.getConnection(strCon, strUser, strPwd); System.out.println("成功连接到数据库。"); Statement sta = con.createStatement(); //创建操作句柄 //执行SQL语句 String strSql = "DELETE FROM [Friends] WHERE [Name] = '郑六'"; int count = sta.executeUpdate(strSql); System.out.println("成功删除" + count + "行数据。"); sta.close(); con.close(); //关闭所有已经打开的资源 } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } catch (SQLException sqle) { sqle.printStackTrace(); } } }

  24. 操作结果集 • 使用Statement对象的executeQuery()方法成功执行SELECT语句后,将返回一个包含有结果数据的ResultSet对象,要从ResultSet对象中取得需要的数据,将使用到如下方法:

  25. 操作结果集示例 try { String strCon = "jdbc:odbc:MyODBC"; System.out.println("正在连接数据库..."); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con; con = DriverManager.getConnection(strCon, "sa", ""); System.out.println("成功连接到数据库。"); Statement sta = con.createStatement(); ResultSet rs = sta.executeQuery("SELECT * FROM [Friends]"); System.out.println(“查询到的数据如下:"); while (rs.next()) { //循环将结果集游标往下移动,到达末尾返回false //根据字段名称获得各个字段的值 System.out.print(rs.getString(“Name”) + “\t”); //获得字符串 System.out.print(rs.getString(“Address”) + “\t”); //获得字符串 System.out.print(rs.getInt(“Telephone”) + “\t”); //获得整数 System.out.print(rs.getDate(“HireDate”) + “\t”); //获得日期型数据 System.out.println(rs.getFloat(“Salary”)); //获得浮点型数据 } rs.close(); sta.close(); con.close(); } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } catch (SQLException sqle) { sqle.printStackTrace(); }

  26. PreparedStatement接口 • Statement对象可以执行SQL语句,但如果要多次执行相似的操作时,使用PreparedStatement(预编译操作句柄)对象来执行,将会获得更高的执行效率; • PreparedStatement对象适用于为特定的SQL命令指定多个参数; • 可以通过Connection对象的prepareStatement()方法创建预编译操作句柄对象,函数原型: PrepareStatement PrepareStatement(String sql); 参数sql是要执行的SQL语句,其中可以包含参数,该方法有可能抛出SQLException异常; • PreparedStatement对象会将SQL语句预先编译,这样将会获得更高的执行效率。

  27. PreparedStatement接口(续) • 包含在PreparedStatement对象中的SQL语句可以包含一个或多个参数,使用问号?作为占位符,如: PreparedStatement ps = con.prepareStatement("UPDATE [Friends] SET [Address] = ? WHERE [Name] = ?"); • 在执行之前,必须先设置每个?位置的参数值,使用PreparedStatement对象的setX()方法设置,这里的X是参数的数据类型,视具体情况而定, • 设置好每个参数后,就可以调用PreparedStatement对象的executeUpdate()方法和executeQuery()方法执行SQL语句了,这一点与Statement对象相似; • 执行不成功将抛出SQLException异常。

  28. PreparedStatement对象示例 String strCon = "jdbc:odbc:MyODBC"; System.out.println("正在连接数据库..."); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con; con = DriverManager.getConnection(strCon, "sa", ""); System.out.println("成功连接到数据库。"); PreparedStatement ps; //使用带参数的SQL语句创建PreparedStatement对象 ps = con.prepareStatement("UPDATE [Friends] SET [Address] = ? WHERE [Name] = ?"); //设置SQL语句中的参数值 ps.setString(1, “长沙”); ps.setString(2, "王五"); int count = ps.executeUpdate(); //执行命令 System.out.println("成功更新了" + count + "行数据。"); ps.close(); //关闭资源 con.close();

  29. 纯Java驱动方式连接数据库 • 使用JDBC-ODBC桥方式连接数据库,其性能完全取决于数据源(ODBC)的性能,并且无法脱离Microsoft的平台,这样将带来不便; • 大部分DBMS产商都为自己的产品开发了纯Java的驱动程序,我们只需要加载相应的驱动,就可以直接连接到数据库,而无需通过ODBC桥接; • 鉴于DBMS产品太多,这里只针对当今比较流行的SQL Server 2000和Oracle 9i进行介绍。

  30. 下载驱动程序包 • 要使用纯Java驱动,首先必须获得数据库的驱动程序包; • 根据数据库的种类,登录对应产商的官方网站,一般都可以免费获得; • 下载后,复制到本地磁盘,并将完整路径设置到classpath环境变量中,如用开发工具开发程序,还需在开发环境中设置路径。

  31. 纯Java驱动连接SQL Server • 使用纯Java驱动连接到SQL Server 2000数据库,加载驱动程序应改成如下语句: Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”); • 连接字符串应如下格式: "jdbc:microsoft:sqlserver://服务器名或IP:1433;databaseName=数据库名" • 如: Connection con = DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=pubs", "sa", "");

  32. 纯Java驱动连接Oracle • 使用纯Java驱动连接到Oracle 9i数据库,加载驱动程序应改成如下语句: Class.forName("oracle.jdbc.driver.OracleDriver"); • 连接字符串应如下格式: "jdbc:oracle:thin:@服务名或IP:1521:数据库名" • 如: Connection con = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:NEWER", "scott", "tiger");

  33. 总结 • JDBC是使用Java程序操作数据库的技术 • 使用 Class.forName() 方法可以将驱动程序加载到 Java 解释器中 • 使用 DriverManager 类的 getConnection() 方法和 Connection 对象的 createStatement() 方法可建立连接 • 使用 executeQuery() 或 executeUpdate() 方法通过 Statement 实例构建并执行 SQL 语句 • PreparedStatement 接口允许创建预编译的 SQL 语句,并使得在后续阶段可以指定语句的参数

More Related