第12讲数据库编程——JDBC浙江大学宁波理工学院计算机系肖辉xiaohui@nit.zju.edu.cn本章目标了解JDBC的概念及必要性了解JDBC驱动程序类型理解JDBC程序的结构运用JDBC进行数据库编程数据库访问技术简介客户机/服务器应用程序数据库编程ODBCJDBC两个常用的API数据库执行SQL语句检索查询结果ODBC数据库客户机/服务器GUI应用程序ODBC(开放式数据库连接)(Microsoft提供)插入删除修改应用程序编程接口查询JDBCJDBC(Java数据库连接)(sun公司提供)Java应用程序编程接口Java应用程序数据库插入修改删除查询JDBC驱动程序的类型JDBC驱动程序的类型JDBC-ODBC桥驱动程序及ODBC驱动程序本地API部分Java驱动程序JDBC-Net纯Java驱动程序本地协议纯Java驱动程序Type1:JDBC-ODBC桥JDBC-ODBC桥Java应用程序JDBCAPIODBCAPIODBC层DBServer优点:可以访问所有ODBC数据源缺点:效率低Type2:JavatoNativeAPIJava应用程序JDBCAPINativeAPIDBServer利用开发商提供的本地库来直接与数据库通信效率比Type1高,部分JavaType3:JavatoNetAPI利用Java中间件访问数据库,纯JavaJava应用程序JDBCAPIJavaMiddlewareDBServerJDBCAPIType4:JavatoNativeDBServerJDBC驱动Java应用程序JDBCAPI利用JDBC本地协议访问数据库,纯Java具有Internet装配能力JDBC体系结构2-1SqlServerOracleJDBCAPIJDBCDriverManagerJDBC驱动JDBC驱动Java应用程序JDBC体系结构2-2应用层DriverStatementResultSetConnection各接口驱动层java.sql、javax.sql包接口名说明DriverManager此类用于加载和卸载各种驱动程序并建立与数据库的连接Connection此接口表示与数据的连接PreparedStatement此接口用于执行预编译的SQL语句ResultSet此接口表示了查询出来的数据库数据结果集Statement此接口用于执行SQL语句并将数据检索到ResultSet中ConnectionDriverManagerStatementResultSet1234JDBCAPIJDBC程序访问数据库的步骤2-1开始导入java.sql包加载并注册驱动程序创建一个Connection对象创建一个Statement对象执行语句关闭ResultSet对象关闭Statement对象关闭连接结束使用ResultSet对象JDBC程序的工作模板try{Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);}catch(ClassNotFoundExceptione){System.out.println(无法找到驱动类);}try{StringURL=jdbc:sqlserver://localhost:1433;DatabaseName=TESTDB;Connectioncon=DriverManager.getConnection(URL,数据库用户名,密码);Statementstmt=con.createStatement();ResultSetrs=stmt.executeQuery(SELECTa,b,cFROMTable1);while(rs.next()){intx=rs.getInt(a);Strings=rs.getString(b);floatf=rs.getFloat(c);}rs.close();stmt.close();con.close();}catch(SQLExceptione){e.printStackTrace();}URL用来标识数据库发送Sql语句处理结果注册JDBC驱动获得数据库连接必须处理的异常释放资源必须处理的异常各类数据库的JDBC连接字符串(1)SQLserver7、2000driver=com.microsoft.jdbc.sqlserver.SQLServerDviver“url=jdbc:microsoft:sqlserver://localhost:1433;DatebaseName=数据库名称“url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Blog;user=sa;password=123各类数据库的JDBC连接字符串(2)SQLserver2005driver=com.microsoft.sqlserver.jdbc.SQLServerDriver“;url=jdbc:sqlserver://localhost:1433;DatabaseName=数据库名称“url=jdbc:sqlserver://localhost:1433;DatabaseName=Blog;user=sa;password=123各类数据库的JDBC连接字符串(3)MySQL5.0driver=“com.mysql.jdbc.Driver”url=jdbc:mysql://localhost:3306/数据库名称“url=“jdbc:mysql://localhost:3306/数据库名称?user=root&password=123;各类数据库的JDBC连接字符串(4)Oracle8/8i/9i数据库(thin模式)Oracle10gdriver=oracle.jdbc.driver.OracleDriver;url=jdbc:oracle:thin:@localhost:1521:数据库实例;JDBC查询2-1SQL查询字符串executeQuery()方法作为参数传递ResultSet返回查询数据SELECTname,email,phoneFROMcolleagues;使用SQL语句,查询可编写为:Stringstr=SELECTemp_id,lname,fnameFROMcolleagues;Statementstmt=con.createStatement();ResultSetrset=stmt.executeQuery(str);使用JDBC编写此查询,则代码为:Statement接口JDBC查询2-2它演示SQL中sum()方法的用法演示:示例2/***Jdbctest2*/importjava.sql.SQLException;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.Statement;importjava.sql.ResultSet;/**这个类演示SQL中sum()方法的用法*@version1.0,2005年8月26日*@authorBen*/classJdbctest2{/**构造方法*/protectedJdbctest2(){}/**这是main方法*/publicstaticvoidmain(String[]args){try{Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);}catch(ClassNotFoundExceptionce){System.out.println(ce);}try{Stringurl=jdbc:odbc:test;Connectioncon=DriverManager.getConnection(url);Statements=con.createStatement();ResultSetrs=s.executeQuery(selecthiredate,sum(salary)fromfriendsgroupbyhiredate);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(SQLExceptionce){System.out.println(ce);}}}JDBC插入数据实现演示:示例3它演示SQL中INSERT语句的用法/***Jdbctest3*/importjava.sql.SQLException;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.Statement;importjava.sql.ResultSet;/**这个类演示INSERT语句的用法.*@version1.0,2005年8月26日*@authorBen*/classJdbctest3{/**构造方法*/protectedJdbctest3(){}/**这是main方法*/publicstaticvoidmain(String[]args){try{Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);}catch(ClassNotFoundExceptionce){System.out.println(ce);}try{Stringurl=jdbc:odbc:test;Stringstr=INSERTINTO“+friends(name,address,salary)“+VALUES(‘朱八‘,’深圳‘,25690);Connectioncon=DriverManager.getConnection(url);Statements=con.createStatement();introwcount=s.executeUpdate(str);Stringstr1=selectname,sum(salary)“+fromfriends+groupbyname;ResultSetrs=s.executeQuery(str1);while(rs.next()){System.out.print(rs.getString(1)+\t);System.out.print(rs.getInt(2)+\t);System.out.println();}rs.close();s.close();con.close();}catch(SQLExceptionce){System.out.println(ce);}}}JDBC删除和修改实现它演示SQL中各种命令的用法演示:示例4/***Jdbc2*/importjava.sql.SQLException;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.Statement;/**这这个类演示SQL中命令的用法.*@version1.0,2005年8月26日*@authorBen*/classJdbc2{/**构造方法.*/protectedJdbc2(){}publicstaticvoidmain(String[]args){Connectioncon;Statementstmt;Stringurl;Stringsql;try{Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);}catch(ClassNotFoundExceptionce){System.out.println(ce);}try{url=jdbc:odbc:test;con=DriverManager.getConnectio