• 1. 1JDBC技术
  • 2. 2JSP应用项目结构数据库的开发: 数据库的原理和设计 数据库的创建及维护 SQL语言以及存储过程等 使用JDBC实现对数据库的操作 数据库WAN浏览器HTTPWeb 容器JDBC
  • 3. 3主要内容JDBC简介 JDBC驱动程序类型 JDBC基本编程
  • 4. 4JDBC简介JDBC(Java Database Connectivity)是一组用来按照统一方式访问数据库的API。 它向程序员提供了独立于数据库的统一接口,可以使开发人员不必考虑所用的特定数据库便可编写应用程序,实现了Java与数据库的互连。 它能够: 提供对数据库的跨平台存取 无需知道数据库具体的位置 无需要知道数据库实现的具体细节
  • 5. 5JDBCJava应用1OracleMySQL SQL Server Java应用n
  • 6. 6JDBC驱动程序类型RDBMSJDBC体系结构JDBC APIJDBC-ODBC桥(Type 1)JDBC-Native (Type 2)JDBC-NET (Type 3)纯Java JDBC驱动(Type 4)ODBC 驱动Native API (C/C++)Net Server (JNDI)
  • 7. 7TYPE 1TYPE 1驱动程序: 是JDBC-ODBC桥连接方式 通常运行在Windows系统上 需要在客户机上安装数据库对应的ODBC驱动程序
  • 8. 8TYPE 2TYPE 2驱动程序: 需要在客户机上安装所用数据对应的本地驱动(这些驱动通常是C或C++语言所编写的)。 该驱动将JDBC对数据库的调用转换成数据库本地的API调用
  • 9. 9TYPE 3
  • 10. 10TYPE 3网络服务可以采用多种技术来提高系统性能,这些服务包括: 负载均衡 缓存技术 连接池技术 容错机制DBMS
  • 11. 11TYPE 4TYPE 4是一种纯Java的驱动实现,他不需要任何客户端配置。 这也是最为常见的数据库连接方式。
  • 12. 12数据库操作典型步骤第一步:加载正确的数据库驱动程序 第二步,定义所要连接数据库的地址 第三步,建立与数据库的连接 第四步,创建语句对象 第五步,声明SQL语句,并将该语句通过Statement对象提交给服务器进行执行 第六步:对查询结果进行分析 第七步,关闭打开的资源
  • 13. 13`
  • 14. 14DriverManagerDriverManager类 DriverManager(驱动程序管理器)类负责管理JDBC驱动程序。在使用JDBC驱动程序之前,必须先将驱动程序加载并向DriverManager注册后才可使用,在程序中可以通过调用Class.forName()方法来完成。 常用方法如下: Public static synchronized Connection getConnection(String url,String user,String password) throws SQLException 获得url对应数据库的一个连接 static void registerDriver(Driver driver)           向 DriverManager 注册给定驱动程序。
  • 15. 15ConnectionConnection接口 Connection对象是通过DriverManager.getConnection()方法获得,代表与数据库的连接,也就是在已经加载的驱动程序和数据库之间建立连接。Connection接口是JSP编程中使用最频繁的接口之一,读者一定要掌握它的使用。 常用方法如下: Statement createStatement() throws SQLException 创建一个Statement对象 PreparedStatement prepareStatement(String sql) throws SQLException 创建一个Preparestatement对象,并能把SQL语句提交到数据库进行预编译 void setAutoCommit(Boolean autocommit) throws SQLException 设置事务提交的模式 void commit() throws SQLException 提交对数据库的更改,使更改生效 void rollback() throws SQLException 放弃当前事务开始以来对数据库所作的修改
  • 16. 16StatementStatement接口 Statement用来执行静态SQL语句。例如,执行insert、update、delete语句,可以调用executeUpdate(String sql)方法,执行select语句可以调用executeQuery(String sql)方法,该方法返回ResultSet对象。 常用方法如下: ResultSet executeQuery(String sql) throws SQLException 执行一个查询语句并返回结果集 int executeUpdate(String sql) throws SQLException 执行更新操作,返回更新的行数 Boolean execute(String sql) throws SQLException 执行更新或查询语句,返回是否有结果集
  • 17. 17PreparedStatementPreparedStatement接口 PreparedStatement接口继承Statement接口,作为提高性能的一条措施,PreparedStatement提供了可以与查询信息一起预编译的一种语句类型。 常用方法  boolean execute()           在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。  ResultSet executeQuery()           在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。  Int executeUpdate()           在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。 Void setXXX(int parameterIndex,XXX x) 将参数设定为指定类型
  • 18. 18CallableStatementCallableStatement是JDBC用来调用数据库中存储过程的机制 具体的使用和PreparedStatement相似 需要注意的是:要调用的存储过程必须在数据库中存在,否则将抛出异常
  • 19. 19ResultSetResultSet接口 在Statement执行SQL查询语句时,会返回ResultSet查询结果记录集。ResultSet接口提供了逐行访问这些记录的方法。 常用方法如下: Boolean next() throws SQLException 把当前指针定位到下一行。注意,最初,ResultSet的指针位于第一行之前。 void close() throws SQLException 释放ResultSet对象资源 ResultSet提供了getXXX()方法,用于获取当前行中某列的值,其中“XXX”与列的数据类型有关,例如,如要获取的列是String类型,则使用getString()方法获取该列的值。getXXX()方法如下所示: getString() getInt() getFloat() getDouble() getDate() getBoolean()
  • 20. 20Oracle驱动OracleMYSQLAcessMYSQL驱动JDBC-ODBC桥DriverManagerConnectionPreparedStatementStatementCallableStatementResultSetResultSetResultSet应用层
  • 21. 21import java.sql.* Try{ Class.forName("com.mysql.jdbc.Driver"); String url = “jdbc:mysql://localhost:3306/dbname”; Connection con=DriverManager.getConnection(url, “root”, “root”); Statement statement =connection.createStatement(); String query = "select * from tablename"; ResultSet resultSet= statement.executeQuery(query); while(resultSet.next()){ String name =resultSet.getString(1); String phone =resultSet.getString(2); System.out.println(name+","+phone); } resultSet.close(); statement.close(); con.close(); }catch(SQLException e){…}第一步第二步第三步第四步第五步第六步第七步
  • 22. 22连接数据库的典型步骤第一步:加载正确的数据库驱动程序 为什么要加载 如何加载 Class.forName("com.mysql.jdbc.Driver"); DriverManager.registerDriver( new com.mysql.jdbc.Driver()); 经过以上其中之一语句的声明后,驱动程序就会自动地加载。 注意:如果classpath路径中没有找到所需的驱动程序则会抛出 ClassNotFoundException异常。Oracle驱动OracleMYSQLAcessMYSQL驱动JDBC-ODBC桥DriverManager
  • 23. 23第二步,定义所要连接数据库的地址 String ODBCURL= " jdbc:odbc:dbName "; String oracleURL= "jdbc:oracle:thin:@host:port:dbName"; String mysqlURL= “jdbc:mysql://host:port/dbName”; String sqlURL=“jdbc:microsoft:sqlserver://host:1433;DatabaseName=dbName”; 通过此步骤,定义要连接的数据库资源 不同数据库连接的地址不同,这点需要特别注意,对一些常见的数据库连接地址,要求大家能够掌握。 URL由3部分组成,各个部分用冒号间隔,格式如下:jdbc:<子协议>:<子名称> JDBC URL的3部分可分解如下: jdbc:JDBC中的协议就是jdbc。 <子协议>:数据库驱动程序名或数据库连接机制的名称。子协议的典型示例为oracle,它用于连接oracle数据库。 <子名称>:一种标记数据库的方法。子名称根据子协议的不同而不同,使用子名称的目的是为定位数据库 例如 jdbc:oracle:thin:@[ip]:[port]:[sid]
  • 24. 24第三步,建立与数据库的连接 String username = “root"; String password = “root"; Connection connection =DriverManager.getConnection(mysqlURL, username,password); 通过此步获得与数据库服务器的连接 另外,数据库连接还可以使用连接属性信息,如下: Properties dbprops= new Properties(); dbprops.put("user", “sa"); dbprops.put("password", “"); dbprops.put("server", "DEMO"); dbprops.put(“db", "myDB"); try{ Class.forName("weblogic.jdbc.mssqlserver4.Driver"); Connectionconn= DriverManager.getConnection("jdbc:weblogic:mssqlserver4", dbprops); }catch(Exception e){...}
  • 25. 25第四步,创建语句对象 Statement statement = connection.createStatement(); 第五步,声明SQL语句,并将该语句通过Statement对象提交给服务器进行执行。 Stringsql= “SELECT * FROM NTACT_TABLE”; ResultSet resultSet=statement.executeQuery(sql); 该语句将sql命令提交给数据库服务器进行执行,并将执行结果存储在ResultSet对象中进行执行。
  • 26. 26Statement接口主要有如下三个方法: 1. ResultSet executeQuery(String sql) 用于执行查询语句,返回 ResultSet结果集(一个二维表) 2. int executeUpdate(String sql) 用于执行添加、删除或修改操作,返回被更新记录的条数 3. boolean execute(String sql) 执行参数部分的SQL语句; 当SQL语句的执行结果是一个ResultSet结果集时,本方法返回true;并可以通过StatementgetResultSet()方法得到返回的结果集 当SQL语句执行后没有返回的结果集时,该方法返回false
  • 27. 27第六步:对查询结果进行分析 while(resultSet.next()){ String name =resultSet.getString(1); String phone =resultSet.getString(2); System.out.println(name+","+phone); } 针对不同的类型调用不同的getXxx方法(getString(col), getDate(col), …) 通过指定列名或相对顺序的方式调用getXxx()方法对应列的内容获取出来(getString(String)) 对结果集中的内容进行修改(updateString(col,val), …) 可以通过(first(), last(), previous(), next(), absolute(int), …) 方法浏览可滚动结果集中的内容 支持多个结果集
  • 28. 28Java数据类型和SQL数据类型之间的映射关系SQL类型Java 数据类型JDBC 访问方法SQL类型Java数据类型JDBC 访问方法bitbooleangetBoolean()DECIMALjava.math.BigDecimalgetBigDecimal()TINYINTbytegetByte()NUMBERICjava.math.BigDecimalgetBigDecimal()SMALLINTshortgetShort()Charjava.lang.StringgetString()INTEGERintgetInt()VARCHARjava.lang.StringgetString()BIGINTlonggetLong()LONGVARCHARjava.lang.StringgetString()REALfloatgetFloat()DATEjava.sql.dategetDate()FLOATdoublegetDouble()TIMEjava.sql.timegetTime()DOUBLEdoublegetDouble()TIMESTAMPjava.sql.TIMESTAMPgetTimestamp()BINARYbyte[]getBytes()BLOBjava.sql.BlobgetBlob()VARBINARYbyte[]getBytes()CLOBjava.sql.ClobgetClob()LONGBINARYbyte[]getBytes()ARRAYjava.sql.ArraygetArray()REFjava.sql.RefgetRef()STRUCTjava.sql.StructgetS
  • 29. 29第七步,关闭打开的资源 resultSet.close(); statement.close(); connection.close(); 将打开的资源关闭。 注意:资源关闭的顺序和打开的顺序恰恰相反。
  • 30. 30<%@page contentType="text/html; charset=GBK" %> <%@page import="java.sql.*" %> <% Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection ("jdbc:mysql://localhost:3306/book","root",“123"); Statement stmt = con.createStatement(); stmt.executeUpdate("create table table1(id int, name varchar(30))"); stmt.executeUpdate("insert into table1 values(10, 'java')"); stmt.executeUpdate("insert into table1 values(20, 'JSP')"); out.print("table1 has been created!"); stmt.close(); con.close(); %>MySQL数据库编程实例
  • 31. 31PreparedStatementPreparedStatement 就是带有占位符的SQL 语句 数据库对他们事先进行编译,因此,客户端需要做的只是传送占位符位置所需要的数据。 而普通Statement的SQL语句,只有在程序运行时才对他们进行编译 因此PreparedStatement运行的速度更快。
  • 32. 32PreparedStatement示例1: PreparedStatement stmt = connection.prepareStatement( "insert into test values(‘?,?')"); stmt.setString(1,”first value”); stmt.setString(2,”second value”); stmt.executeUpdate(); stmt.setString(2,”new record, with different second value”); stmt.executeUpdate();
  • 33. 33PreparedStatement示例2: Connection connection =DriverManager.getConnection(url, user, password); PreparedStatement statement =connection.prepareStatement("UPDATE employees " +"SET salary = ? " +"WHERE id = ?"); int[]newSalaries=getSalaries(); int[]employeeIDs=getIDs(); for(inti=0; i
  • 34. Thank youNeusoft Group Ltd.谢谢