1、第十三章,JDBC 基础知识,2,回顾,JTable的用途 如何使用JTable JTree 的用途 如何使用JTree,3,本章目标,了解JDBC的概念及必要性 了解JDBC驱动程序类型 理解JDBC 程序的结构 运用JDBC进行数据库编程,4,数据库访问技术简介,客户机/服务器 应用程序,数据库编程,ODBC,JDBC,两个常用的API,数据库,执行 SQL 语句,检索查询结果,5,数据库,ODBC,客户机/服务器 GUI应用程序,ODBC (开放式数据库连接) (Microsoft 提供),插 入,删 除,修 改,应用程序编程接口,查询,6,JDBC,JDBC (Java 数据库连接)
2、(sun公司提供),Java 应用程序编程接口,Java应用程序,数据库,插 入,修 改,删 除,查询,7,JDBC 驱动程序的类型,JDBC 驱动程序 的类型,JDBC-ODBC桥驱动程序及ODBC驱动程序,本地API部分Java驱动程序,JDBC-Net 纯Java驱动程序,本地协议纯Java驱动程序,8,JDBC 体系结构 2-1,Java 程序,JDBC 驱动程序,数据库,SQL 命令,结果,9,JDBC 体系结构 2-2,应用层,Driver,Statement,ResultSet,Connection,各接口,驱动层,10,java.sql 包 3-1,11,java.sql 包
3、3-2,12,java.sql 包 3-3,SQLException,/* fooBar*/ public void foobar() throws SQLException throw new SQLException(“刚引发了一个 SQLException ”); , tryfooBar(); catch(SQLException ex) System.out.println(“已捕获一个 SQLException 异常!”);System.out.println(“消息: “ + ex.getMessage();System.out.println(“错误代码: “ + ex.getE
4、rrorCode(); ,调用 fooBar,13,JDBC 程序访问数据库的步骤 2-1,开 始,导入 java.sql包,加载并注册驱动程序,创建一个 Connection 对象,创建一个 Statement 对象,执行语句,关闭ResultSet 对象,关闭Statement对象,关闭连接,结 束,使用ResultSet对象,14,Friends 表的结构,JDBC 程序访问数据库的步骤 2-2,它演示访问数据库的各个步骤 在执行示例 1 中的程序之前,SQL Server 中应该存在一个名为 friends 的表,演示:示例 1,/* 2005 Aptech Limited* 版权所有
5、 */ import java.sql.SQLException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.sql.ResultSet; /* 这个类演示访问数据库需遵循的各个步骤. * version 1.0, 2005 年 8 月 26 日 * author Ben*/ class Jdbctest /* 构造方法 */protected Jdbctest() ,/*这是 main 方法. */ public static void m
6、ain(String args) try Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“); catch (ClassNotFoundException ce) System.out.println(ce);try String url = “jdbc:odbc:test“;Connection con = DriverManager.getConnection(url);Statement s = con.createStatement();ResultSet rs = s.executeQuery(“select * from friends“);
7、while (rs.next() System.out.print(rs.getString(1) + “t“);System.out.print(rs.getString(2) + “t“);System.out.print(rs.getInt(3) + “t“);System.out.print(rs.getDate(4) + “t“);System.out.println(“ “);rs.close();s.close();con.close(); catch (SQLException ce) System.out.println(ce); ,15,JDBC 查询2-1,SQL 查询字
8、符串,executeQuery() 方法,作为参数传递,ResultSet,返回查询数据,SELECT name, email, phone FROM colleagues;,使用 SQL 语句,查询可编写为:,String str = “SELECT emp_id, lname, fname FROM colleagues“; Statement stmt = con.createStatement(); ResultSet rset = stmt.executeQuery(str);,使用 JDBC 编写此查询,则代码为:,Statement接口,16,JDBC 查询2-2,它演示 SQL
9、 中 sum( ) 方法的用法,演示:示例 2,/* * Jdbctest2 */ import java.sql.SQLException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.sql.ResultSet; /* 这个类演示 SQL 中 sum() 方法的用法* version 1.0, 2005 年 8 月 26 日* author Ben*/ class Jdbctest2 /* 构造方法*/protected Jdbctest2
10、() ,/* 这是 main 方法*/public static void main(String args) try Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“); catch (ClassNotFoundException ce) System.out.println(ce); try String url = “jdbc:odbc:test“;Connection con = DriverManager.getConnection(url);Statement s = con.createStatement();ResultSet rs =
11、s.executeQuery(“select hiredate, sum(salary) from friends group by hiredate“);while (rs.next() System.out.print(rs.getDate(1) + “t“);System.out.print(rs.getInt(2) + “t“);System.out.println(“ “);rs.close;s.close();con.close(); catch (SQLException ce) System.out.println(ce); ,17,演示:示例 3,它演示 SQL 中 INSE
12、RT 语句的用法,/* * Jdbctest3*/ import java.sql.SQLException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.sql.ResultSet; /* 这个类演示 INSERT 语句的用法.* version 1.0, 2005 年 8 月 26 日* author Ben*/ class Jdbctest3 /* 构造方法 */protected Jdbctest3() ,JDBC 插入数据实现,/*
13、这是 main 方法*/ public static void main(String args) try Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“); catch (ClassNotFoundException ce) System.out.println(ce);try String url = “jdbc:odbc:test“;String str = “INSERT INTO “ + friends(name,address,salary)“+ “VALUES(朱八,深圳 ,25690)“;Connection con = DriverM
14、anager.getConnection(url);Statement s = con.createStatement();int rowcount = s.executeUpdate(str);String str1 = “select name, sum(salary) “+from friends“+ “ group by name“;,ResultSet rs = s.executeQuery(str1);while (rs.next() System.out.print(rs.getString(1) + “t“);System.out.print(rs.getInt(2) + “t
15、“);System.out.println(“ “);rs.close();s.close();con.close(); catch (SQLException ce) System.out.println(ce); ,18,JDBC 删除和修改实现,它演示 SQL 中各种命令的用法,演示:示例 4,/* * Jdbc2*/ import java.sql.SQLException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; /* 这这个类演示 SQL 中命令的用法
16、.* version 1.0, 2005 年 8 月 26 日 * author Ben*/ class Jdbc2 /* 构造方法.*/protected Jdbc2() ,public static void main(String args) Connection con;Statement stmt;String url;String sql;try Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“); catch (ClassNotFoundException ce) System.out.println(ce);try url = “jdbc
17、:odbc:test“;con = DriverManager.getConnection(url);sql = “Delete from friends where rtrim(name)like张三 ;“;System.out.println(“ “);stmt = con.createStatement();stmt.executeUpdate(sql);System.out.println(“张三 的记录已删除“);stmt.close();con.close();,con = DriverManager.getConnection(url);sql = “Update friends
18、 set address=青岛 where “+ “rtrim(name) like 李四; “;System.out.println(“ “);stmt = con.createStatement();stmt.executeUpdate(sql);stmt.close();con.close();System.out.println(“李四的记录已更新“); catch (SQLException ce) System.out.println(ce); ,19,PreparedStatement接口 3-1,PreparedStatement接口 (预编译的 SQL 语句),Prepare
19、dStatement用于提高运行时效率,执行 PreparedStatement 对象比执行 Statement 对象快,Statement 接口,20,PreparedStatement接口 3-2,它演示了PreparedStatement 的用法,演示:示例 5,/* * CourseAppl*/ import java.sql.SQLException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.sql.ResultSet; impo
20、rt java.sql.PreparedStatement; /* 这个类演示 SQL 中 PreparedStatement 的用法*/ class CourseAppl private Connection con; private String url; private String serverName; private String portNumber; private String databaseName; private String userName; private String password; private String sql;,CourseAppl() url
21、 = “jdbc:microsoft:sqlserver:/“;serverName = “localhost“;portNumber = “1433“;databaseName = “test“;userName = “sa“;password = “sa“; private String getConnectionUrl() return url + serverName + “:“ + portNumber + “;databaseName =“ + databaseName + “;“; private java.sql.Connection getConnection() try C
22、lass.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver“);con = DriverManager.getConnection(getConnectionUrl(), userName, password);if (con != null) System.out.println(“连接成功!“); catch (Exception e) e.printStackTrace();System.out.println(“getConnection() 内的错误跟踪:“ + e.getMessage(); return con; ,pub
23、lic void display() try con = getConnection();PreparedStatement pstmt = con.prepareStatement(“UPDATE friends SET salary = ? WHERE name like ?“);pstmt.setInt(1, 10000 );pstmt.setString(2, “李四 “);pstmt.executeUpdate();System.out.println(“记录已更新!“);Statement s = con.createStatement();String sql = “SELECT
24、 * FROM friends “;ResultSet rs = s.executeQuery(sql);while (rs.next() System.out.println(“ “);System.out.print(rs.getInt(1) + “ “);System.out.println(rs.getInt(5); catch (SQLException ce) System.out.println(ce); public static void main(String args) CourseAppl retObj = new CourseAppl();retObj.display
25、(); ,21,PreparedStatement 接口 3-3,它演示在基于条件的 SQL 查询中如何使用 PreparedStatement,其中条件在 IN 参数中给出,演示:示例 6,import java.sql.SQLException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.PreparedStatement; /* 这个类演示在基于条件的 SQL 查询中使用 PreparedStatement*/ class Re
26、trieveRecords private Connection con; private String url; private String serverName, portNumber, databaseName, userName; private String sql; RetrieveRecords() url = “jdbc:microsoft:sqlserver:/“;serverName = “localhost“;portNumber = “1433“;databaseName = “test“;userName = “sa“;password = “sa“; ,priva
27、te String getConnectionUrl() return url + serverName + “:“ + portNumber+ “;databaseName =“ + databaseName + “;“;private java.sql.Connection getConnection() tryClass.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver“);con = DriverManager.getConnection(getConnectionUrl(), userName, password);if (c
28、on != null) System.out.println(“连接成功!“); catch (Exception e) e.printStackTrace();System.out.println(“getConnection() 内的错误跟踪:“+ e.getMessage();return con;,public void display() try con = getConnection();sql = “select * from Friends where Salary ?“;PreparedStatement pstmt = con.prepareStatement(sql, R
29、esultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);pstmt.setInt(1, 5000);ResultSet rs = pstmt.executeQuery();while (rs.next() System.out.print(rs.getString(1) + “t“);System.out.print(rs.getString(2) + “t“);System.out.print(rs.getInt(3) + “t“);System.out.print(rs.getDate(4) + “t“);System.out
30、.print(rs.getInt(5) + “t“);System.out.println(“ “);rs.close();pstmt.close();con.close(); catch (SQLException ce) System.out.println(ce); /* 这是 main 方法*/public static void main(String args) RetrieveRecords retRec = new RetrieveRecords();retRec.display(); ,22,使用结果集 3-1,ResultSet 对象完全依赖于 Statement 对象和
31、Connection 对象 每次执行 SQL 语句时,都会用新的结果重写结果集 当相关的 Statement 关闭时,ResultSet 对象会自动关闭,Next( ),get(),此方法将光标从 当前位置下移一行,从 ResultSet 对象返回数据,23,使用结果集 3-2,它演示对当前行的处理 使用 next() 方法时,记录是按顺序处理的 必须按照数据返回的顺序处理每行中的数据, ResultSet rset = stmt.getResultSet();while(rset.next() String dept_name = rset.getString(1); ,24,使用结果集 3
32、-3,演示对当前列的处理 使用 get() 方法可以直接访问列, Statement stmt = con.createStatement(); Stmt.executeQuery(“Select emp_id, fname from Employee“) ; ResultSet rset = stmt.getResultSet(); while(rset.next() String ename = rset.getString (“fname“);System.out.println ( ename) ; , Statement stmt = con.createStatement(); s
33、tmt.executeQuery(“Select emp_id, fname from Employee“); ResultSet rset = stmt.getResultSet(); while(rset.next() String employeeid = rset.getString (1); ,以下代码显示值 1 被作为参数传递给 getString() 方法,这实际上指列 emp_id 的索引,25,结果集的类型,可滚动,不可滚动,光标仅向前移动,光标可前后移动,也可移动 至与当前位置相对的某一行,如果对数据库做了更改, 则新值是可见的,结果集,TYPE_SCROLL_INSENS
34、ITIVE,TYPE_SCROLL_SENSITIVE,TYPE_FORWARD_ONLY,26,总结,JDBC概念的理解 使用 Class.forName() 方法可以将驱动程序加载到 Java 解释器中 使用 DriverManager 类的 getConnection() 方法和 Connection 对象的 createStatement() 方法可建立连接 最后,使用 executeQuery() 或 executeUpdate() 方法通过 Statement 实例构建并执行 SQL 语句 PreparedStatement 接口允许创建预编译的 SQL 语句,并使得在后续阶段可以指定语句的参数 结果集可以是可滚动的,也可以是不可滚动的,