JDBC 基础知识 第 七 章
Java 的高级组件 回顾 1
本章相关词汇 单 词说 明 driver 驱动,驱动程序 connection 连接 manager 管理器 statement 语句 prepared 预备的,预编译的 result 结果 create 创建,创造 execute 执行 query 查询
本章目标 了解 JDBC 的概念和必要性 了解 JDBC 驱动程序类型 了解 java.sql 包 理解 JDBC 程序的结构 使用 JDBC 进行数据库编程 T-sql 语句的拼接 预编译
数据库访问技术简介 当今企业级应用程序大部分采用 了客户机 / 服务器( C/S ) Client/Server 模式; 客户端机器需要与服务器进行通 讯,要操作数据库中的数据,执 行 SQL ( Structured Query Language 结构化查询语言)语 句以及检索查询结果; 在 Java 中实现这些活动的技术称 作 JDBC 。
JDBC 连接数据库类型 使用 JDBC 连接数据库可以通过 不同的驱动方式来实现,有 4 种 驱动类型: JDBC-ODBC 桥驱动 纯 Java 驱动 本地 API 部分 Java 驱动 JDBC 网络纯 Java 驱动 不论采用哪种驱动方式,在程序 中对数据库的操作方式基本相同, 只是加载不同的驱动程序即可。
JDBC JDBC ( Java DataBase Connectivity )是由 Sun Microsystem 公司提供的 API ( Application Programming Interface 应用程序编程接口); 它为 Java 应用程序提供了一系列 的类,使其能够快速高效地访问 数据库; 这些功能是由一系列的类和对象 来完成的,我们只需使用相关的 对象,即可完成对数据库的操作。
ODBC ODBC ( Open DataBase Connectivity )指开放式数据库 连接,是由 Microsoft 公司提供的 应用程序接口; 它负责连接各种不同产商和类型 的 DBMS ,然后为各种不同的编 程语言提供查询、插入、修改和 删除数据的功能; 如同在各种不同的 DBMS 和各种 不同的编程语言之间架设了一座 通用的桥梁。
JDBC 程序访问数据库步骤 开 始 导入 java.sql 包 加载并注册驱动程序 创建 Connection 对象 创建 Statement 对象 执行 SQL 语句 关闭 ResultSet 对象 关闭 Statement 对象 关闭 Connection 对象 使用 ResultSet 对象 建立数据源( ODBC ) 附加相应产商提供的驱动 结 束 JDBC-ODBC 桥方式纯 Java 驱动方式
步骤详解 1 :建立数据源 这里以 JDBC-ODBC 桥驱动方式为例,逐步 详细地讲解在 Java 程序中如何操作数据库, 而对于其它驱动方式,只需更换驱动程序即 可,其余不变; 首先建立 ODBC 数据源: 【开始】 → 【设置】 → 【控制面板】 → 【管 理工具】 → 【数据源( ODBC )】 新建数据源,名称可以任意,这里假设已经 建立了一个名为 myODBC 的数据源,连接到 SQL Server 2005 中的 pubs 数据库。
步骤详解 2 :加载驱动程序 使用 Class 类的 forName 方法,将驱动程序类 加载到 JVM ( Java 虚拟机)中; 对于使用 JDBC-ODBC 桥的驱动方式,应该 加载: sun.jdbc.odbc.JdbcOdbcDriver 类 如: Class.forName("sun.jdbc.odbc.J dbcOdbcDriver"); 方 法 原 型方 法 原 型说 明 static Class forName(String className) throws ClassNotFoundExcepti on 将由 className 指定 完整名称的类加载到 JVM 中,如果加载失 败,将抛出异常,必 须捕捉
步骤详解 3 :获得连接对象 成功加载驱动后,必须使用 DriverManager 类的静态方法 getConnection 来获得连接对象; 对于使用 JDBC-ODBC 桥的连接方式, 连接字符串的一般形式是: “jdbc:odbc: 数据源名称 ” ,如: Connection con = DriverManager.getConnection("jdb c:odbc:myODBC", "sa", ""); 方 法 原 型方 法 原 型说 明 static Connection getConnection (String url, String user, String password) throws SQLException 参数 url 是连接字符串,参数 user 是数据库用户名,参数 password 是登录口令,成功 连接到数据库返回 Connection 对象,连接失败则抛出 SQLException 异常,必须捕 捉
步骤详解释 4 :创建语句对象 一旦成功连接到数据库,获得 Connection 对 象后,必须通过 Connection 对象的 createStatement 方法来创建语句对象,才可 以执行 SQL 语句; 如: Statement sta = con.createStatement(); 方 法 原 型方 法 原 型说 明 Statement createStatement() throws SQLException 成功创建返回 Statement 对象,否 则抛出 SQLException 异常, 必须捕捉
步骤详解 5 :执行 SQL 语句 使用语句对象来执行 SQL 语句,有两种 情况: 一种是执行 DELETE 、 UPDATE 和 INSERT 之类的数据库操作语句 ( DML ),这样的语句没有数据结果返 回,使用 Statement 对象的 executeUpdate 方法执行; 如: sta.executeUpdate("INSERT INTO Friends VALUES(' 田七 ', ' 重庆 ', , ' ', 7500)"); 方 法 原 型方 法 原 型说 明 int executeUpdate(S tring sql) throws SQLException 参数 sql 是要执行的 SQL 语 句,执行成功返回受影响 的行数,执行失败则抛出 SQLException 异常,必须 捕捉
步骤详解 5 :执行 SQL 语句(续) 另一种是执行 SELECT 这样的数据查询 语句( DQL ),这样的语句将从数据库 中获得所需的数据,使用 Statement 对 象的 executeQuery 方法执行; 如: ResultSet rs = sta.executeQuery("SELECT * FROM Friend"); 方 法 原 型方 法 原 型说 明 ResultSet executeQuery(String sql) throws SQLException 参数 sql 是要执行的 SQL 语句,查询成功返 回包含有结果数据的 ResultSet 对象,否则 抛出 SQLException 异 常,必须捕捉
步骤详解 6 :关闭资源 当对数据库的操作结束后,应当将所有已经 被打开的资源关闭,否则将会造成资源泄漏; Connection 对象、 Statement 对象和 ResultSet 对象都有执行关闭的 close 方法; 函数原型都是: void close() throws SQLException 如: rs.close(); // 关闭 ResultSet 对象 sta.close(); // 关闭 Statement 对象 con.close(); // 关闭 Connection 对象 有可能抛出 SQLException 异常,必须捕捉; 请注意关闭的顺序,最后打开的资源最先关 闭,最先打开的资源最后关闭。
数据库操作示例 import java.sql.*; // 导入 java.sql 包 public class JDBCDemo { public static void 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 对象,要 从该对象中获取数据,将使用到如下方 法: 方 法 原 型方 法 原 型说 明 boolean next() throws SQLException 将结果集游标往下移动一 行,如果已经到达结果集 最后,将会返回 false ,有 可能抛异常,必须捕捉 X getX(String columnName) throws SQLException 获得某个字段的值, X 是 指具体的数据类型,视数 据库表中字段的具体情况 而定,该方法有一组,并 且每个都有两种重载方法, 一种是以字段名称为参数, 另一种是以字段索引为参 数(字段索引从 1 开始), 有可能抛异常,必须捕捉 X getX(int columnIndex) throws SQLException
操作结果集示例 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(); }
纯 Java 驱动方式连接数据库 使用 JDBC-ODBC 桥方式连接数据库,其性 能完全取决于数据源( ODBC )的性能,并 且无法脱离 Microsoft 的平台,这样将带来不 便; 大部分 DBMS 产商都为自己的产品开发了纯 Java 的驱动程序,我们只需要加载相应的驱 动,就可以直接连接到数据库,而无需通过 ODBC 桥连接; 鉴于 DBMS 产品太多,这里只针对当今比较 流行的 SQL Server 2005 和 Oracle 9i 进行介绍。
下载驱动程序包 要使用纯 Java 驱动,首先必须获 得相应数据库的驱动程序包; 将驱动程序包复制到本地磁盘, 在命令提示行下,将完整路径设 置到 classpath 环境变量中。
纯 Java 驱动连接 SQL Server2005 使用纯 Java 驱动连接到 SQL Server 2005 数据库,加载驱动 程序应改成如下语句: Class.forName("com.microsoft. sqlserver.jdbc.SQLServerDrive r"); 连接字符串应如下格式: "jdbc:sqlserver:// 服务器名或 IP:1433;databaseName= 数据库名 " 如: Connection con = DriverManager.getConnection(" jdbc:sqlserver:// :14 33; databaseName=pubs", "sa", "");
纯 Java 驱动连接 Oracle 使用纯 Java 驱动连接到 Oracle 9i 数据库,加 载驱动程序应改成如下语句: Class.forName("oracle.jdbc.drive r.OracleDriver"); 连接字符串应如下格式: 服务名或 IP:1521: 数据库 名 " 如: Connection con = DriverManager.getConnection("jdb WER", "scott", "tiger");
T-sql 语句的拼接 在通常情况下,增加,删除,修改的内容以 及查询的条件都是由用户自己输入。 拼接的方式: 增加语句: “ insert into userinfo values('"+username+"','"+password+"') “ 修改语句: “ update userinfo set password = '"+password+"' where username ='"+username+"‘ "
T-sql 语句的拼接 删除语句: “ delete userinfo where username = '"+username+"‘ " 查询语句: String sql = "select * from userinfo where 1=1"; if(!username.equals("")){ sql+=" and username = '"+username+"' "; } if(!password.equals("")){ sql+=" and password = '"+password+"' "; }
预编译 数据查询的安全性 使用预编译如何提高查询的安全性 PrepareStatement 类 预编译的用法: String sql = "select * from students where id=? and name=?"; pst=conn.prepareStatement(sql); pst.setString(1, username); pst.setString(2, password); rs = pst.executeQuery();
总结 JDBC 是使用 Java 程序操作数据库的技 术; 使用 Class 类的 forName 方法可以将驱 动程序加载到 Java 解释器中; 使用 DriverManager 类的 getConnection 方法获得 Connection 对象,从而建立与 数据库的连接; 使用 Connection 对象的 createStatement 方法创建语句对象,以 便执行 SQL 语句; 使用 Statement 对象的 executeQuery 或 executeUpdate 方法执行 SQL 语句,并 使用 ResultSet 对象来操作结果数据; PreparedStatement 接口允许创建预编 译的 SQL 语句,并使得在后续阶段可以 指定语句的参数。