JDBC编程课件PPT 83页

  • 430.00 KB
  • 2022-04-29 14:28:59 发布

JDBC编程课件PPT

  • 83页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'第18章JDBC编程18.1数据库简介18.2JDBC基本概念18.3JDBC编程18.4JDBC-ODBC编程18.5JDBC编程进阶 18.1数据库简介关系型数据库关系型数据库是当前数据库的主流技术,常用的数据库有Oracle,SQLServer,DB2,SyBase等,其能保存数据本身和数据之间的关系,并提供强大的管理和查询功能。 18.1数据库简介SQL语言SQL(StructuredQueryLanguage)是使用关系模型的数据库语言,用于和各种数据库的连接,提供通用的数据管理和查询语言。其常用的指令有:select,insert,delete,update,create,drop 18.1数据库简介ODBCODBC(OpenDataBaseConnectivity)的含义是开放数据库连接,是微软公司开发的一套数据库系统应用程序接口规范,它支持应用程序以标准的ODBC函数和SQL语句操作各种不同的数据库。 应用程序驱动程序管理器Oracle驱动程序驱动程序驱动程序SQLServer其他数据库ODBC工作原理 18.2JDBC基本概念JDBC概述由于ODBC模型的成功,JDBC(JavaDataBaseConnectivity)也遵循了这个模型。应用程序首先和JDBC驱动程序管理器通信,由管理器来选择驱动程序访问数据库。 Java应用程序JDBC驱动程序管理器JDBC/ODBC桥供应商提供的JDBC驱动程序ODBC驱动程序数据库数据库JDBC工作原理 类型一:将JDBC翻译为ODBC,然后使用ODBC驱动程序和DB通信。注意:1、必须先安装ODBC驱动程序和配置ODBC数据源。2、仅当特定的数据库系统没有相应的JDBC驱动程序时使用。ApplicationSpaceJavaApplicationJDBC–ODBCBridgeDatabaseSQLCommandResultSetODBCDriverProprietaryProtocol 类型二:由部分Java程序和部分本地代码组成,用于和数据库的API进行通信。(JDBC中的命令被转换为本地库中的方法)注意:需要先安装和特定数据库操作的方法。ApplicationSpaceJavaApplicationType2JDBCDriverDatabaseSQLCommandResultSetNativeDatabaseLibraryProprietaryProtocol 类型三:纯Java程序,它使用一种与具体数据库无关的协议将数据库请求发送给一个中间件服务器,然后由它把该请求翻译为特定的数据库协议,并发送给数据库系统,从数据库系统获得的结果先发送给中间件服务器,并进而返回给应用程序。ApplicationSpaceJavaApplicationType3JDBCDriverDatabaseSQLCommandResultSetMiddlewareSpaceProprietaryProtocolJDBCDriver 类型四:纯Java的驱动程序,直接与特定的数据库系统通信。直接将JDBC命令转换为数据库系统的本地协议。没有中间的转换,提高了数据库的访问性能。ApplicationSpaceJavaApplicationType4JDBCDriverDatabaseSQLCommand UsingProprietary ProtocolResultSet UsingProprietary Protocol 18.2JDBC基本概念JDBC基本概念DriverManager:负责选取数据库驱动程序和建立新的数据库连接。Driver(由驱动程序开发商提供):将应用程序的API请求转换为特定的数据库请求。 18.2JDBC基本概念Connection:将应用程序连接到特定的数据库Statement(PreparedStatement):在一个给定的连接中,用于执行一个静态(动态)的数据库SQL语句。ResultSet(可以没有,如在执行更新操作后):SQL语句执行完后,返回的数据结果集(包括行、列) DriverManagerConnectionStatementResultSetDriverDatabaseCreatesCreatesCreatesSQLResult(tuples)EstablishLinktoDBJDBC的工作流程 18.3JDBC编程JDBC编程的基本步骤加载驱动程序:Class.forName(“driverName”);建立数据库连接:con=DriverManager.getConnection(“jdbc:xxx:datasource”,“用户名”,“密码”); 18.3JDBC编程提交查询:stmt=con.createStatement();rs=stmt.executeQuery(“Select*frommyTable”);处理结果集:while(rs.next()){name=rs.getString(“name”);“String”为数据类型} 【例题18-1】查询演示publicclassDBSelectDemo{publicstaticvoidmain(String[]args){Connectionconn=null;Statementstmt;ResultSetrs;try{Stringsql="select*fromarchive";18.3JDBC编程 //加载驱动程序Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver");//建立连接conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;"+"DatabaseName=studentarchive","sa","");//建立声明stmt=conn.createStatement();//执行SQL,返回数据集rs=stmt.executeQuery(sql); while(rs.next()){System.out.println("学号:"+rs.getString("number")+"姓名:"+rs.getString("name"));}rs.close();stmt.close();conn.close();}catch(Exceptione){System.out.println(e);}}} 程序运行结果: 【例题18-2】插入、更新和删除演示publicclassDBInsertUpdateDeleteDemo{publicstaticvoidmain(String[]args){Connectionconn=null;Statementstmt;ResultSetrs;try{Stringsql="select*fromdemo";18.3JDBC编程 //加载驱动程序Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//建立连接conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;"+"DatabaseName=studentarchive","sa","");//建立声明stmt=conn.createStatement();stmt.executeUpdate(“deletefromdemo"); stmt.executeUpdate("insertintodemovalues("101","张三",18)");stmt.executeUpdate("insertintodemovalues("102","李四",22)");stmt.executeUpdate("insertintodemovalues("103","王五",34)");//执行SQL,返回数据集rs=stmt.executeQuery(sql);display(rs);rs.close();stmt.executeUpdate("updatedemosetage=age+10");stmt.executeUpdate("deletefromdemowherenumber="102"");System.out.println("更新、删除后:"); rs=stmt.executeQuery(sql);display(rs);rs.close();stmt.close();conn.close();}catch(Exceptione){System.out.println(e);}} publicstaticvoiddisplay(ResultSetrs){try{while(rs.next()){System.out.println("学号:"+rs.getString("number")+"姓名:"+rs.getString("name")+"年龄:"+rs.getString(3));}}catch(SQLExceptione){e.printStackTrace();}}} 程序运行结果: 18.3JDBC编程获取数据库元数据元数据(Meta-Data)也称为“关于数据的数据”,在关系型数据库中,元数据描述了所存储数据的结构及其他信息。利用JDBC也可以获取各种元数据,如表的数量和名称、表的结构和约束等。 【例题18-3】元数据演示publicclassDBMetaDataDemo{publicstaticvoidmain(String[]args){Connectionconn=null;Statementstmt;ResultSetrs;try{Stringsql="select*fromarchive";18.3JDBC编程 //加载驱动程序Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//建立连接conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;"+"DatabaseName=studentarchive","sa","");DatabaseMetaDatadmd=conn.getMetaData();System.out.println("数据库名称:"+dmd.getDatabaseProductName());System.out.println("数据库版本:"+dmd.getDatabaseProductVersion());System.out.println("驱动程序:"+dmd.getDriverName()+"n"); //建立声明stmt=conn.createStatement();//执行SQL,返回数据集rs=stmt.executeQuery(sql);ResultSetMetaDatarsmd=rs.getMetaData();intcount=rsmd.getColumnCount();System.out.println("列序号t列名称tt数据类型");for(inti=1;i<=count;i++){System.out.println(i+"tt"+rsmd.getColumnName(i)+"ttt"+rsmd.getColumnTypeName(i));} rs.close();stmt.close();conn.close();}catch(Exceptione){System.out.println(e);}}} 程序运行结果: 18.4JDBC-ODBC编程前3节中的例题都是采用驱动程序来访问数据库的,还有一种JDBC-ODBC桥驱动方式也比较常见。其工作原理是:JDBC驱动程序管理器不直接操纵数据库驱动程序,而是调用JDBC-ODBC桥驱动程序操纵ODBC驱动程序,进而连接各种数据库,此方式可以有效利用已有的ODBC数据源。 18.4JDBC-ODBC编程JDBC-ODBC编程步骤:创建ODBC数据源:选择【控制面板】>【管理工具】>【数据源(ODBC)】>【用户DSN】>【添加】>选择驱动程序>命名数据源>【完成】连接并操作ODBC数据源:与JDBC大致相同驱动程序改成“sun.jdbc.odbc.JdbcOdbcDriver”连接字符串改成:“jdbc:odbc:ODBC数据源名称” 【例题18-4】JDBC-ODBC数据源演示publicclassJDBCODBCDemo{publicstaticvoidmain(String[]args){Connectionconn=null;Statementstmt;ResultSetrs;try{Stringsql="select*frommytable";18.4JDBC-ODBC编程 //加载驱动程序Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//建立连接conn=DriverManager.getConnection("jdbc:odbc:xjjaccess");//建立声明stmt=conn.createStatement();//执行SQL,返回数据集rs=stmt.executeQuery(sql);while(rs.next()){System.out.println("学号:"+rs.getString("number")+"姓名:"+rs.getString("name")); }rs.close();stmt.close();conn.close();}catch(Exceptione){System.out.println(e);}}} 程序运行结果: 18.5JDBC编程进阶使用属性文件配置运行环境信息为提高程序的可移植性,或者出于安全性考虑,也可以不在程序中直接给出数据库连接信息,而是将之保存到专门的属性文件中,然后在程序中将数据库连接信息读出并使用。 【例题18-5】属性文件演示属性文件#sql2000informationdriver_name=com.microsoft.jdbc.sqlserver.SQLServerDriverdb_url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=studentarchiveusername=sapassword=18.5JDBC编程进阶 【例题18-5】属性文件演示publicclassPropertiesDemo{publicstaticvoidmain(String[]args){Connectionconn=null;Statementstmt;ResultSetrs;try{Stringsql="select*fromarchive";18.5JDBC编程进阶 Propertiesps=newProperties();FileInputStreamfis=newFileInputStream("sql2000db.properties");ps.load(fis);fis.close();Stringdriver_name=ps.getProperty("driver_name");Stringdb_url=ps.getProperty("db_url");Stringusername=ps.getProperty("username");Stringpassword=ps.getProperty("password"); //加载驱动程序Class.forName(driver_name);//建立连接conn=DriverManager.getConnection(db_url,username,password);//建立声明stmt=conn.createStatement();//执行SQL,返回数据集rs=stmt.executeQuery(sql);while(rs.next()){System.out.println("学号:"+rs.getString("number")+"姓名:"+rs.getString("name")); }rs.close();stmt.close();conn.close();}catch(Exceptione){System.out.println(e);}}} 程序运行结果: 18.5JDBC编程进阶可滚动和可更新结果集在JDBC1.0中,结果集(ResultSet)只能用next()方法向前单向遍历,且必须是“只读的”。无法通过修改结果集中记录来更新数据库中的数据。在后续的JDBC2.0和JDBC3.0中,新增了可滚动和可更新结果集。 18.5JDBC编程进阶若想从查询中使用可滚动和可更新结果集,需要使用声明对象如下的构造方法。StatementcreateStatement(inttype,intconcurrency)type取值有三种:不可滚动(FORWARD_ONLY)滚动不敏感(SCROLL_INSENSITIVE)滚动敏感(SCROLL_SENSITIVE) 18.5JDBC编程进阶concurrency取值有两种:只读(READ_ONLY)可更新的(UPDATABLE) 18.5JDBC编程进阶对于可滚动结果集,可以使用如下方法进行各种遍历。next();previous();first();last();beforeFirst();afterLast();relative(introws);absolute(introws);getRow(); 【例题18-6】可滚动结果集演示publicclassScrollResultDemo{publicstaticvoidmain(String[]args){Connectionconn=null;Statementstmt;ResultSetrs;try{Stringsql="select*fromdemo";18.5JDBC编程进阶 //加载驱动程序Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//建立连接conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;"+"DatabaseName=studentarchive","sa","");//建立声明stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); stmt.executeUpdate("deletefromdemo");stmt.executeUpdate("insertintodemovalues("101","张三",18)");stmt.executeUpdate("insertintodemovalues("102","李四",22)");stmt.executeUpdate("insertintodemovalues("103","王五",34)");//执行SQL,返回数据集rs=stmt.executeQuery(sql);while(rs.next()){display(rs);}stmt.close();conn.close(); }catch(Exceptione){System.out.println(e);}}publicstaticvoiddisplay(ResultSetrs){try{System.out.println("学号:"+rs.getString("number")+"姓名:"+rs.getString("name")+"年龄:"+rs.getString(3));}catch(SQLExceptione){e.printStackTrace();}}} 程序运行结果: 18.5JDBC编程进阶对于可更新结果集,可以使用如下方法进行更新、插入和删除。updateXXX(StringcolumnName,XXXx);updateRow();insertRow();deleteRow();cancelRow(); 【例题18-7】可更新结果集演示publicclassUpdateResultSetDemo{publicstaticvoidmain(String[]args){Connectionconn=null;Statementstmt;ResultSetrs;try{Stringsql="select*fromdemo";18.5JDBC编程进阶 //加载驱动程序Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//建立连接conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;"+"DatabaseName=studentarchive","sa","");//建立声明stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);stmt.executeUpdate("deletefromdemo"); stmt.executeUpdate("insertintodemovalues("101","张三",18)");stmt.executeUpdate("insertintodemovalues("102","李四",22)");stmt.executeUpdate("insertintodemovalues("103","王五",34)");//执行SQL,返回数据集rs=stmt.executeQuery(sql);while(rs.next()){display(rs);Stringstr=rs.getString("name").trim();if(str.equals("李四")){rs.updateInt("age",66);rs.updateRow(); }}for(inti=0;i<48;i++){System.out.print("-");}System.out.println("");rs=stmt.executeQuery(sql);while(rs.next()){display(rs);}rs.close();stmt.close();conn.close(); }catch(Exceptione){System.out.println(e);}}publicstaticvoiddisplay(ResultSetrs){try{System.out.println("学号:"+rs.getString("number")+"姓名:"+rs.getString("name")+"年龄:"+rs.getString(3));}catch(SQLExceptione){e.printStackTrace();}}} 程序运行结果: 18.5JDBC编程进阶预处理语句PreparedStatement对象称为预处理声明对象,由于PreparedStatement接口继承了Statement接口,所以Statement接口中的方法均可使用。由于其已经预编译过,所以其执行速度要快于Statement对象。 18.5JDBC编程进阶PreparedStatement对象可以接受带有参数的SQL语句,这些参数的位置先由占位符?表示,然后使用setXXX(intparameterIndex,XXXx)方法设置参数的值,最后再调用executeUpdate()或者executeQuery()方法。 【例题18-8】预处理声明对象演示publicclassPreparedStatementDemo{publicstaticvoidmain(String[]args){Connectionconn=null;PreparedStatementpstmt;ResultSetrs;try{//加载驱动程序18.5JDBC编程进阶 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//建立连接conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;"+"DatabaseName=studentarchive","sa","");Stringsql="deletefromdemo";//建立声明pstmt=conn.prepareStatement(sql);pstmt.executeUpdate();sql="insertintodemovalues(?,?,?)";pstmt=conn.prepareStatement(sql); pstmt.setString(1,"101");pstmt.setString(2,"张三");pstmt.setInt(3,18);pstmt.executeUpdate();sql="select*fromdemo";pstmt=conn.prepareStatement(sql);rs=pstmt.executeQuery();while(rs.next()){display(rs);}rs.close();pstmt.close();conn.close(); }catch(Exceptione){System.out.println(e);}}publicstaticvoiddisplay(ResultSetrs){try{System.out.println("学号:"+rs.getString("number")+"姓名:"+rs.getString("name")+"年龄:"+rs.getString(3));}catch(SQLExceptione){e.printStackTrace();}}} 程序运行结果: 18.5JDBC编程进阶调用存储过程CallableStatement对象用于调用存储过程,该接口继承了PreparedStatement接口。存储过程是由SQL语句和流程控制语句书写的过程程序,经过编译和优化后存储在数据库服务器中,充分利用存储过程可以提高系统的运行性能和可维护性。 【例题18-9】调用存储过程演示存储过程:CREATEPROCEDUREmyPro(@xchar(10),@ychar(10),@zint)ASbegininsertintodemovalues(@x,@y,@z);updatedemosetage=@z+50;endGO18.5JDBC编程进阶 【例题18-9】调用存储过程演示publicclassProcedureDemo{publicstaticvoidmain(String[]args){Connectionconn=null;PreparedStatementpstmt;CallableStatementcstmt;ResultSetrs;try{//加载驱动程序18.5JDBC编程进阶 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//建立连接conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;"+"DatabaseName=studentarchive","sa","");Stringsql="deletefromdemo";//建立声明pstmt=conn.prepareStatement(sql);pstmt.executeUpdate();sql="{callmyPro(?,?,?)}";cstmt=conn.prepareCall(sql); cstmt.setString(1,"101");cstmt.setString(2,"张三");cstmt.setInt(3,18);cstmt.execute();sql="select*fromdemo";pstmt=conn.prepareStatement(sql);rs=pstmt.executeQuery();while(rs.next()){display(rs);}rs.close();pstmt.close();conn.close(); }catch(Exceptione){System.out.println(e);}}publicstaticvoiddisplay(ResultSetrs){try{System.out.println("学号:"+rs.getString("number")+"姓名:"+rs.getString("name")+"年龄:"+rs.getString(3));}catch(SQLExceptione){e.printStackTrace();}}} 程序运行结果: 18.5JDBC编程进阶事务处理数据库事务是指作为单个逻辑工作单元执行的一系列操作。若操作的任何一个环节出现问题,对此次操作的所有更新操作都应全部撤销,必须恢复到操作前的状态。比如银行的转账操作,其两步操作:更新源账户信息和更新目标账户信息必须全部完成,否则则应恢复到交易前的状态。 18.5JDBC编程进阶和数据库事务管理模式相对应,JDBC中数据库连接(Connection对象)也可分为自动提交和非自动提交两种模式:自动提交时,对数据库的更新操作将立即提交并永久生效、不可撤销;非自动提交时,关闭连接之前,需要显示提交或回滚事务,否则,未提交的数据就会丢失。 【例题18-10】事务处理演示publicclassCommitDemo{publicstaticvoidmain(String[]args){Connectionconn=null;Statementstmt;ResultSetrs;try{Stringsql="select*fromdemo";18.5JDBC编程进阶 //加载驱动程序Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//建立连接conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;"+"DatabaseName=studentarchive","sa","");conn.setAutoCommit(false);//建立声明stmt=conn.createStatement();stmt.executeUpdate("deletefromdemo"); stmt.executeUpdate("insertintodemovalues("101","张三",18)");stmt.executeUpdate("insertintodemovalues("102","李四",22)");stmt.executeUpdate("insertintodemovalues("xyz","xyz","xyz")");stmt.executeUpdate("insertintodemovalues("103","王五",34)");conn.commit();conn.setAutoCommit(true);//执行SQL,返回数据集rs=stmt.executeQuery(sql);while(rs.next()){display(rs);} stmt.close();conn.close();}catch(Exceptione){try{conn.rollback();System.out.println("发生异常,事务已回滚");}catch(SQLExceptione1){e1.printStackTrace();}System.out.println(e);}} publicstaticvoiddisplay(ResultSetrs){try{System.out.println("学号:"+rs.getString("number")+"姓名:"+rs.getString("name")+"年龄:"+rs.getString(3));}catch(SQLExceptione){e.printStackTrace();}}} 程序运行结果:'