• 1. 第六章 JDBC操作数据库JDBC数据库访问技术
  • 2. 本章内容JDBC概述 JDBC连接数据库 Statement接口 ResultSet接口 PreparedStatement接口
  • 3. 本章目标掌握JDBC驱动分类和JDBC API 掌握使用JDBC获取数据库的连接 掌握使用JDBC对数据库进行数据操作
  • 4. 1.JDBC概述1.1 JDBC简介 JDBC(Java Database Connectivity)即数据库连接,它提供了用于执行 SQL语句标准的Java API,可以方便实现多种关系数据库的统一操作; JDBC由一组用Java语言编写的类与接口组成 使用JDBC实现对换多种关系数据库的统一操作,需要使用JDBC驱动JDBC组成元素JDBC APIDriverManagerJDBC驱动
  • 5. JDBC简介 JDBC工作原理
  • 6. JDBC简介 JDBC API 提供Java应用程序与数据库操作的接口JDBC APIConnection接口Statement接口ResultSet接口
  • 7. JDBC简介 DriverManager 管理不同的JDBC驱动 JDBC驱动 由不同数据库厂商提供,负责连接不同的数据库,是JDBC API接口的实现
  • 8. 1.2 JDBC API类及接口功能描述java.sql.DriverManager用于管理JDBC驱动程序java.sql.Connection用于建立与特定数据库的连接,一个连接就是一个会话,建立连接后便可以执行SQL语句java.sql.StatementStatement对象用于执行SQL语句java.sql.PreparedStatement创建可以编译的SQL语句对象,是Statement的子接口java.sql.ResultSet用于创建检索SQL语句的结果集java.sql.CallableStatement用于执行SQL存储过程java.sql.Types用于表示SQL类型的常量java.sql.SQLException表示数据库访问过程中产生的错误描述信息
  • 9. JDBC API JDBC API主要提供三个操作建立数据库连接发送SQL语句处理结果
  • 10. 1.3 JDBC驱动分类JDBC驱动纯Java驱动JDBC网络驱动JDBC-ODBC桥本地协议纯驱动
  • 11. JDBC驱动分类 JDBC-ODBC桥 利用ODBC进行数据库操作 桥驱动程序适合于已经在ODBC技术上投资的情形,例如已投资Windows应用服务器时
  • 12. JDBC驱动分类 纯Java驱动 纯Java驱动直接使用各数据库厂商提供的JDBC驱动程序,程序移埴 性差,性能较高
  • 13. JDBC驱动分类 JDBC网络驱动 由网络中间件将JDBC驱动转换为DBMS协议以服务器为基础、不再需要客户端的本机代码,JDBC网络驱动是一种较为灵活的驱动
  • 14. JDBC驱动分类 本地协议纯JDBC驱动 将JDBC调用直接转换成DBMS所使用的网络协议 “瘦(thin)”驱动程序,实现客户机和应用服务器直接调用DBMS服务器
  • 15. 2.JDCB操作数据库步骤将驱动类载入虚拟机加载驱动,建立连接创建操作对象,发送 SQL语句处理结果Class.forName()DriverManager.getConnection()con.createStatement()sta.executeQuery(sql)rst.next()
  • 16. 3.JDBC连接数据库 本书数据库使用SQL Server 2008,Java程序使用JDBC连接SQL Server 2008数据库需导入 sqljdbc4.jar 在实际应用中,操作不同的数据库须配置不同的驱动程序3.1 配置数据库驱动程序
  • 17. 3.2 加载数据库驱动程序 驱动程序配置完毕后,加载SQL Server 2008的数据库驱动程序路径为: com.microsoft.sqlserver.jdbc.SQLServerDriverimport java.sql.*; public class ConnectionDemo { static String driver=“com.microsoft.sqlserver.jdbc.SQLServerDriver“; public static void main(String[] args) { try { Class.forName(driver);  }catch(Exception e){ e.printStackTrace(); } } }加载驱动类
  • 18. 3.3 连接及关闭数据库 数据库驱动加载成功后,即可连接数据库。连接数据库使用 DriverManager类,其主要方法如下:方法功能描述public static Connnection getConnection(String url,String user,String password) throws SQLException 根据数据库地址,用户名及密码建立连接
  • 19. 连接及关闭数据库 不同数据库有不同的地址,连接SQL Server 2008的地址是: jdbc:sqlserver://IP地址:端口号;DataBaseName=数据库名称public class ConnectionDemo { static String url = "jdbc:sqlserver://localhost:1549;DataBaseName=Demo"; public static void main(String[] args) { Connection con = null; try{ Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver"); con = DriverManager.getConnection(url,"sa","sa"); }catch(Exception e) { e.printStackTrace(); }finall{ con.close(); } } } 数据库连接资源的限,使用完连接后注意关闭连接
  • 20. 连接及关闭数据库 连接数据库即获取Connection对象,是操作数据库的前提 获取Connection对象后使用Statement接口进行数据库操作 Connection常用方法返回类型方法名称描述StatementcreateStatement()创建一个Statement对象PreparedStatementprepareStatement(String sql)创建PreparedStatement对象CallableStatementprepareCall(String sql)用于执行存储过程voidsetAutoCommit(boolean flag)设置数据库是否自动提交voidrollback()数据库操作回滚voidcommit()提交事务voidclose()关闭数据库连接booleanisClosed()判断连接是否已关闭
  • 21. 4.Statement接口 Statement主要用于执行SQL语句。其常用方法如下:返回类型方法名称描述intexecuteUpdate(String sql)执行数据库更新SQL语句: insert,update,delete,返回更新的记录数ResultSetexecuteQuery(String sql)执行数据库查询操作,返回结果集对象booleanexecute(String sql)执行sql语句,返回false表示执行成功, true表示执行失败voidclose()关闭Statement操作
  • 22. 4.1 执行数据库操作public static void main(String[] args) { Connection con = null; Statement sta = null; try{ Class.forName(driver); con = DriverManager.getConnection(url,"sa","sa"); sta = con.createStatement(); sta.executeUpdate("insert into book values('java','tom',50)"); sta.close(); con.close(); }catch(Exception e) { e.printStackTrace(); } } 使用Statement执行完SQL语句后,注意关闭Statement
  • 23. 执行数据库操作Connection con = null; Statement sta = null; try{ Class.forName(driver); con = DriverManager.getConnection(url,"sa“,"sa"); sta = con.createStatement() String bookName="java oop”; String author = "mike“; String price = "90“; String sql = "update book set bookName='"+bookName+"',author='"+author+"', price='"+price+"' where bookID="+6; sta.executeUpdate(sql); sta.close(); con.close(); }catch(Exception e) { e.printStackTrace(); }
  • 24. 执行数据库操作Connection con = null; Statement sta = null; try{ Class.forName(driver); con = DriverManager.getConnection(url,"sa“,"sa"); sta = con.createStatement() String bookName="java oop”; String author = "mike“; String price = "90“; String sql = "delete from book where bookID="+6; sta.executeUpdate(sql); sta.close(); con.close(); }catch(Exception e) { e.printStackTrace(); }
  • 25. 执行数据库操作 可使用Statement的executeUpdate()方法执行SQL语句,而 executeUpdate()方法只能执行insert,update,delete 执行select需要使用executeQuery()方法,该方法返回ResultSet
  • 26. 5.ResultSet接口5.1 ResultSet简介 在JDBC中数据库的所有查询记录将使用ResultSet接收并显示内容 ResultSet常用的方法如下:返回类型方法名称描述booleannext()将指针移到下一行intgetInt(int columnIndex)以整数形式按列的编号取得 指定列的内容intgetInt(String columnName)以整数形式取得指定列的内 容StringgetString(int columnIndex)以字符串形式按列的编号取 得指定列的内容StringgetString(String columnName)以字符串形式取得指定列的 内容
  • 27. 5.2 ResultSet应用Connection con = null; Statement sta = null; ResultSet rst = null; Class.forName(driver) con = DriverManager.getConnection(url,"sa","sa"); sta = con.createStatement(); rst = sta.executeQuery("select * from book"); while(rst.next()) { System.out.print("编号:"+ rst.getInt(1)); System.out.print("名称:"+ rst.getString(2)); System.out.print("作者:"+rst.getString("author")); System.out.println(“单价:”+rst.getInt(4); rst.close(); sta.close(); con.close(); } 查询结果第一列的信息
  • 28. 6. PreparedStatement接口6.1 PreparedStatement简介 PreparedStatement接口继承自Statement。它执行SQL语句时具有一个或 多个输入参数,且为每个输入参数保留一个问号(?)作为占位符PreparedStatement pst = con.prepareStatement(“update book set bookName=?,author=? Where bookID=?”);   pst.setString(1,”C#”);   pst.setString(2,"Jack"); pst.setInt(3, 5);为占位符赋值 PreparedStatement执行带参数的SQL语句时,应为每个占位符赋值
  • 29. 6.2 PreparedStatement应用 pst = con.prepareStatement("insert into book values(?,?,?)"); pst.setString(1, "XML"); pst.setString(2, "john"); pst.setInt(3, 120); pst.execute(); pst.close(); con.close(); 添加数据
  • 30. PreparedStatement应用 con = DriverManager.getConnection(url,"sa","sa"); pst = con.prepareStatement("delete from book where bookID=?"); pst.setInt(1, 10); pst.execute(); pst.close(); con.close(); 删除数据
  • 31. PreparedStatement应用 con = DriverManager.getConnection(url,"sa","sa"); pst = con.prepareStatement("update book set bookName=?,price=? where bookID=?"); pst.setString(1, "jsp"); pst.setInt(2, 90); pst.setInt(3, 5); pst.execute(); pst.close(); con.close(); 更新数据
  • 32. PreparedStatement应用con = DriverManager.getConnection(url,"sa","sa"); pst = con.prepareStatement("select * from book where bookID=?"); pst.setInt(1, 2); ResultSet rst = pst.executeQuery(); if(rst.next()) { System.out.println(“此编号对应的书籍名称 是:"+rst.getString("bookName")); } pst.close(); con.close(); 查询数据
  • 33. PreparedStatement应用public static Connection getCon(){ try { Class.forName(driver); con = DriverManager.getConnection(url,user,pwd); }catch(Exception e) { e.printStackTrace(); } return con; }public static void closeCon(Connection con){ try { if(con!=null) con.close(); }catch(Exception e) { e.printStackTrace(); } }public static void closeStatement(PreparedStatement pst){ try { if(pst!=null){ pst.close(); pst = null; } }catch(Exception e) { e.printStackTrace(); } } public static void closeResultSet(ResultSet rst){ try { if(rst!=null){ rst.close(); rst = null; } }catch(Exception e) { e.printStackTrace(); } } DBManager数据管理类 使用JDBC对数据库进行操作,都需要建立连接、关闭对象和连接。实际开发 中为提高效率,通常情况下应建立一个类用于管理连接和对象
  • 34. Statement与PreparedStatement序号StatementPreparedStatement1Statement不是预先编译,每次执行sql时,会对sql语句进行语法语义编译PreparedStatement是预先编译,首次执行sql语句后,后面执行时不会再对sql语句进行编译 2执行的SQL语句中不可以带参数 执行的SQL语句中是可以带参数 3不安全,系统开销较大PreparedStatement使用更为灵活,效率更高
  • 35. 本章总结JDBC提供了用于执行SQL语句标准的Java API,它由一组用Java语言编写的类与接口组成 JDBC驱动主要分为JDBC-ODBC桥驱动和纯Java驱动两类 JDBC操作数库的步骤是:注册驱动、建立连接、发送SQL语句、处理结果 DriverManager类负责建立数据库连接;Statement,PreparedStatement负责操作数据库;ResultSet负责接收并显示数据库返回的结果集
  • 36. (本页无文本内容)