330 likes | 449 Views
第 å 三 ç« . JDBC 基础知识. 回顾 1. File 类用于访问文件系统,但åªèƒ½æ“作文件的属性,而ä¸èƒ½å¯¹æ–‡ä»¶è¿›è¡Œè¯» / 写 æµæ˜¯æŒ‡ä¸€è¿žä¸²æµåŠ¨çš„å—符,是以先进先出方å¼å‘é€ä¿¡æ¯çš„é€šé“ ä»ŽæµåŠ¨æ–¹å‘上区分,æµå¯ä»¥åˆ†ä¸ºè¾“å…¥æµå’Œè¾“出æµï¼Œä»Žæ ¼å¼ä¸ŠåŒºåˆ†ï¼Œå¯ä»¥åˆ†ä¸ºå—节æµå’Œå—ç¬¦æµ ä½¿ç”¨ FileInputStream 类和 FileOutputStream 类以å—节方å¼è¯»å†™æ–‡ä»¶. 回顾 2. 对于 Unicode ç¼–ç 的文件,使用 FileReader ç±»é…åˆ BufferedReader 类读文件,使用 FileWriter ç±»é…åˆ BufferedWriter 类写文件
E N D
第 十 三 章 JDBC基础知识
回顾1 • File类用于访问文件系统,但只能操作文件的属性,而不能对文件进行读/写 • 流是指一连串流动的字符,是以先进先出方式发送信息的通道 • 从流动方向上区分,流可以分为输入流和输出流,从格式上区分,可以分为字节流和字符流 • 使用FileInputStream类和FileOutputStream类以字节方式读写文件
回顾2 • 对于Unicode编码的文件,使用FileReader类配合BufferedReader类读文件,使用FileWriter类配合BufferedWriter类写文件 • 要从控制台接受输入,需要将System.in对象进行包装,使用如下语句: InputStreamReader isr = new InputStreamRader(System.in); BufferedReader br = new BufferedReader(isr); • 使用br.readLine()方法接受输入
本章目标 • 了解JDBC的概念和必要性 • 了解JDBC驱动程序类型 • 理解JDBC程序的结构 • 使用JDBC进行数据库编程
数据库访问技术简介 • 当今企业级应用程序大部分采用了客户机/服务器(C/S)模式; • 客户端机器需要与服务器进行通讯,要操作数据库中的数据,执行SQL语句以及检索查询结果; • 在Java中实现这些活动的常用技术有ODBC和JDBC两种。
数据库编程 执行 SQL 语句 客户机/服务器 应用程序 数据库 检索查询结果 ODBC JDBC 数据库编程示意图
关于DBMS • DBMS(DataBase Management System)是指数据库管理系统; • 目前DBMS的生产商众多,产品也不尽相同,如: • Oracle公司的Oracle系列; • Microsoft公司的Access系列和SQL Server系列; • Microsoft公司早期的FoxPro; • IBM公司的DB2; • Sybase公司的Sybase; • 还有自由开源的MySQL等等。 • 这就意味着编程语言要针对不同的DBMS开发不同的应用程序,这将是一个非常枯燥的工作。
ODBC • ODBC(Open DataBase Connectivity)是指开放式数据库连接,是由Microsoft公司提供的应用程序接口(API,Application Programming Interface); • 它负责连接各种不同产商和类型的DBMS,然后为各种不同的编程语言提供查询、插入、修改和删除数据库的功能; • 如同在各种不同的DBMS和各种不同的编程语言之间架设了一座通用的桥梁。
JDBC • JDBC(Java DataBase Connectivity)是由Sun Microsystem公司提供的API; • 它为Java应用程序提供了一系列的类,使其能够快速高效地访问数据库; • 这些功能是由一系列的类和对象来完成的,我们只需使用相关的对象,即可完成对数据库的操作。
Java 程序 JDBC 驱动程序 SQL 命令 结果 数据库 JDBC工作方式示意图
JDBC驱动程序类型 • 使用JDBC连接数据库可以通过不同的驱动实现,有4种驱动类型: • JDBC-ODBC桥驱动 • 纯Java驱动 • 本地API部分Java驱动 • JDBC网络纯Java驱动 • 不论采用哪种驱动类型,在程序对数据库的操作方式基本相似,只是加载不同的驱动程序即可。
java.sql包 • java.sql包也是Java内置的包,其中包含了一组用于与数据库进行通信的类和接口; • 如果要使用到这些类和接口的话,则必须显式地声明如下语句: import java.sql.*;
开 始 导入 java.sql包 JDBC-ODBC桥方式 纯Java驱动方式 建立数据源(ODBC) 附加相应产商提供的驱动 加载并注册驱动程序 创建Connection 对象 创建 Statement 对象 关闭ResultSet对象 使用ResultSet对象 执行SQL语句 关闭Statement对象 关闭Connection对象 结 束 JDBC程序访问数据库步骤
步骤详解1:建立数据源 • 这里以JDBC-ODBC桥驱动方式为例,逐步详细地讲解在Java程序中如何操作数据库,而对于其他驱动方式,只需更换驱动程序即可,其余不变; • 首先建立ODBC数据源: 【开始】→ 【设置】→ 【控制面板】→【管理工具】→【数据源(ODBC)】 • 新建数据源,名称可以任意,这里假设已建立了一个名为myODBC的数据源,连接到SQL Server 2000中的pubs数据库。
步骤详解2:加载驱动程序 • 使用Class.forName()方法,将驱动程序的类加载到JVM(Java虚拟机,Java Virtual Machine)中; • 对于使用JDBC-ODBC桥驱动方式,应该加载sun.jdbc.odbc.JdbcOdbcDriver类,如: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); • 如果指定的类不能成功加载,将会引发ClassNotFoundException异常。
步骤详解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”, “”);
步骤详解4:创建操作句柄 • 一旦成功连接到数据库,获得连接对象后,必须通过连接对象创建操作句柄对象,才可以执行SQL语句; • 可以使用连接对象的createStatement()方法来创建操作句柄对象,其函数原型: statement createStatement(); • 如: Statement sta = con.createStatement(); • 如果创建失败,将抛出SQLException异常。
步骤详解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'")
步骤详解5:执行SQL语句(续) • 另一种是执行SELECT这样的数据查询语句(DQL),这样的语句将从数据库中获得所需的数据,使用Statement对象的executeQuery ()方法执行; • 函数原型: ResultSet executQuery(String sql); 参数sql是要执行的查询语句,查询成功返回包含有结果数据的结果集对象,否则抛出SQLException异常; • 如: ResultSet rs = sta.executeQuery("SELECT * FROM [authors]");
步骤详解6:关闭资源 • 当对数据库的操作结束后,应当将所有已经被打开的资源关闭,否则将会造成资源泄漏; • 连接对象、操作句柄对象和结果集对象都有执行关闭的方法close(); • 函数原型都是:void close(); • 如: rs.close(); //关闭结果集 sta.close(); //关闭操作句柄 con.close(); //关闭数据库连接 • 有可能抛出SQLException异常; • 请注意关闭的顺序,最后打开的资源最先关闭,最先打开的资源最后关闭。
数据库操作示例 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(); } } }
操作结果集 • 使用Statement对象的executeQuery()方法成功执行SELECT语句后,将返回一个包含有结果数据的ResultSet对象,要从ResultSet对象中取得需要的数据,将使用到如下方法:
操作结果集示例 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(); }
PreparedStatement接口 • Statement对象可以执行SQL语句,但如果要多次执行相似的操作时,使用PreparedStatement(预编译操作句柄)对象来执行,将会获得更高的执行效率; • PreparedStatement对象适用于为特定的SQL命令指定多个参数; • 可以通过Connection对象的prepareStatement()方法创建预编译操作句柄对象,函数原型: PrepareStatement PrepareStatement(String sql); 参数sql是要执行的SQL语句,其中可以包含参数,该方法有可能抛出SQLException异常; • PreparedStatement对象会将SQL语句预先编译,这样将会获得更高的执行效率。
PreparedStatement接口(续) • 包含在PreparedStatement对象中的SQL语句可以包含一个或多个参数,使用问号?作为占位符,如: PreparedStatement ps = con.prepareStatement("UPDATE [Friends] SET [Address] = ? WHERE [Name] = ?"); • 在执行之前,必须先设置每个?位置的参数值,使用PreparedStatement对象的setX()方法设置,这里的X是参数的数据类型,视具体情况而定, • 设置好每个参数后,就可以调用PreparedStatement对象的executeUpdate()方法和executeQuery()方法执行SQL语句了,这一点与Statement对象相似; • 执行不成功将抛出SQLException异常。
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();
纯Java驱动方式连接数据库 • 使用JDBC-ODBC桥方式连接数据库,其性能完全取决于数据源(ODBC)的性能,并且无法脱离Microsoft的平台,这样将带来不便; • 大部分DBMS产商都为自己的产品开发了纯Java的驱动程序,我们只需要加载相应的驱动,就可以直接连接到数据库,而无需通过ODBC桥接; • 鉴于DBMS产品太多,这里只针对当今比较流行的SQL Server 2000和Oracle 9i进行介绍。
下载驱动程序包 • 要使用纯Java驱动,首先必须获得数据库的驱动程序包; • 根据数据库的种类,登录对应产商的官方网站,一般都可以免费获得; • 下载后,复制到本地磁盘,并将完整路径设置到classpath环境变量中,如用开发工具开发程序,还需在开发环境中设置路径。
纯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", "");
纯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");
总结 • JDBC是使用Java程序操作数据库的技术 • 使用 Class.forName() 方法可以将驱动程序加载到 Java 解释器中 • 使用 DriverManager 类的 getConnection() 方法和 Connection 对象的 createStatement() 方法可建立连接 • 使用 executeQuery() 或 executeUpdate() 方法通过 Statement 实例构建并执行 SQL 语句 • PreparedStatement 接口允许创建预编译的 SQL 语句,并使得在后续阶段可以指定语句的参数