首页 11。JDBC(132)

11。JDBC(132)

举报
开通vip

11。JDBC(132)nullnull目标JDBC的概念 JDBC的使用4.1 JDBC技术概述4.1 JDBC技术概述4.1.1 什么是 JDBC JDBC是一种用于执行SQL语句的Java API。 由一组用Java编程语言编写的类和接口组成。 由java.sql.*和javax.sql.*两个包中的一些类和接口组成 。 为数据库开发人员提供了一个标准的API,使他们能够用纯Java API来编写数据库应用程序。 将 Java和JDBC结合起来将使程序员只须写一遍程序就可让它可向任何数据库发送SQL语句,可在任何平台上运行 ...

11。JDBC(132)
nullnull目标JDBC的概念 JDBC的使用4.1 JDBC技术概述4.1 JDBC技术概述4.1.1 什么是 JDBC JDBC是一种用于执行SQL语句的Java API。 由一组用Java编程语言编写的类和接口组成。 由java.sql.*和javax.sql.*两个包中的一些类和接口组成 。 为数据库开发人员提供了一个标准的API,使他们能够用纯Java API来编写数据库应用程序。 将 Java和JDBC结合起来将使程序员只须写一遍程序就可让它可向任何数据库发送SQL语句,可在任何平台上运行 。4.1.1 什么是 JDBC4.1.1 什么是 JDBC特性 不限制传递到底层 DBMS 驱动程序的查询类型 JDBC 机制易于理解和使用 提供与 Java 系统的其他部分保持一致的 Java 接口 JDBC 可以在常见 SQL 层 API 的顶层实现4.1.2 JDBC的用途4.1.2 JDBC的用途JDBC 是一个紧凑、简单的软件层 JDBC即是个低级接口又是一个高级接口 ,高级接口使用的是一种更易理解和更为方便的API,这种API在幕后被转换为诸如ODBC这样的低级接口 JDBC API 定义应用程序如何: 打开连接 与数据库通信 执行 SQL 语句 检索查询结果4.1.2 JDBC的用途4.1.2 JDBC的用途如下所示: //建立与数据库的连接 Connection con = DriverManager.getConnection ("jdbc:odbc:wombat", "login", "password"); //发送语句 Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); //下面循环处理结果 while (rs.next()) System.out.println(rs.getString("a") + " " +rs.getString("b") + " " +rs.getString("c"));4.1.3 JDBC与ODBC和其它API的比较4.1.3 JDBC与ODBC和其它API的比较Java 可以使用ODBC,但最好是在JDBC的帮助下以JDBC-ODBC桥的形式使用 ODBC不适合直接在Java中使用,因为它使用C语言接口 从ODBC API按字面翻译到Java API是不可取的 ODBC很难学。它把简单和高级功能混在一起,而且即使对于简单的查询,其选项也极为复杂。相反,JDBC尽量保证简单功能的简便性,而同时在必要时允许使用高级功能 4.1.3 JDBC与ODBC和其它API的比较4.1.3 JDBC与ODBC和其它API的比较完全用Java编写JDBC驱动程序则JDBC代码在所有Java平台上都可以自动安装、移植并保证安全性 JDBC建立在ODBC上而不是从零开始 JDBC保留了ODBC的基本设计特征 两种接口都基于X/Open SQL CLI(调用级接口) 它们之间最大的区别在于:JDBC以Java 风格与优点为基础并进行优化 4.1.4 两层模型和三层模型4.1.4 两层模型和三层模型JDBC 支持两种模型: 二层模型 Java applet/应用程序直接与数据库交互 被称为客户端/服务器配置 如图4-1所示 三层模型 使用中间层 可以在不同语言中实现中间层 如图4-2所示4.1.4 两层模型和三层模型4.1.4 两层模型和三层模型4.1.5 SQL的一致性4.1.5 SQL的一致性虽然大多数的 DBMS对其基本功能都使用了标准形式的SQL,但它们却不完全符合标准SQL语法或语义 JDBC 在类 Java.SQL.Types 类中定义了一组通用 SQL 类型标识符,如下的类型表示不同数据库中的实数: static int DOUBLE static int FLOAT static int NUMERIC static int REAL4.1.5 SQL的一致性4.1.5 SQL的一致性JDBC 处理 SQL 一致性问题方法: JDBC API 允许将任何查询字符串传递到底层 DBMS 驱动程序 提供内置功能,便于将包含转义序列的 SQL 查询转换为数据库可理解的格式 提供 DatabaseMetaData 接口,允许用户检索关于所使用的 DBMS 信息 4.1.5 SQL的一致性4.1.5 SQL的一致性DatabaseMetaData 接口的主要方法如下: int getDatabaseMajorVersion() String getDriverName() int getMaxStatementLength() ResultSet getTypeInfo() String getUserName() boolean isReadOnly() ResultSet getPrimaryKeys(String catalog, String schema, String table) 等4.1.5 SQL的一致性4.1.5 SQL的一致性由于JDBC API将用作开发高级数据库访问工具和API的基础API,因此它还必须注意其所有上层建筑的一致性。 用户可依赖的JDBC功能的标准级别是“符合JDBC标准TM”。 驱动程序开发人员可用JDBC API所带的测试工具包来确定他们的驱动程序是否符合这些标准 4.1.6 JDBC产品组件4.1.6 JDBC产品组件JavaSoft提供三种JDBC产品组件: Java开发工具包(JDK)的组成部份:JDBC驱动程序管理器; JDBC驱动程序测试工具包 JDBC-ODBC桥。 JDBC驱动程序管理器是JDBC体系结构的支柱。其主要作用是把Java应用程序连接到正确的JDBC驱动程序上。 4.1.6 JDBC产品组件4.1.6 JDBC产品组件JDBC 驱动程序测试工具包为使JDBC驱动程序运行您的程序提供一定的可信度。 JDBC-ODBC桥使ODBC驱动程序可被用作JDBC驱动程序。它的实现为JDBC的快速发展提供了一条途径,其长远目标提供一种访问某些不常见的DBMS(如果对这些不常见的DBMS未实现JDBC)的方法。4.1.7 JDBC驱动程序的类型4.1.7 JDBC驱动程序的类型JDBC驱动程序的类型 JDBC-ODBC 桥加 ODBC 驱动程序 本地 API JDBC 网络纯 Java 驱动程序 本地 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 纯 Java 驱动程序 JDBC回顾JDBC回顾1.JDBC-ODBC桥加ODBC驱动程序1.JDBC-ODBC桥加ODBC驱动程序第一类:JDBC-ODBC桥 + ODBC驱动程序2.本地API2.本地API第二类:本地API3.JDBC 网络纯Java驱动程序3.JDBC 网络纯Java驱动程序第三类:JDBC网络纯Java驱动程序4.本地协议纯 Java 驱动程序4.本地协议纯 Java 驱动程序第四类:本地协议纯Java驱动程序第3、4 类驱动程序是从JDBC访问数据库的首选方法 4.2 使用JDBC4.2 使用JDBC要使用JDBC技术主要包括以下步骤: 注册和加载驱动器 与数据库建立连接 发送SQL语句 处理结果4.2.1注册和加载JDBC驱动程序4.2.1注册和加载JDBC驱动程序DriverManager类是JDBC的管理层,作用于用户和驱动程序之间 它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接 注册驱动程序使用DriverManager.registerDrive()方法 用户正常情况下将不用直接调用DriverManager.registerDriver(),而是在加载驱动程序时由驱动程序自动调用。 加载Driver类的方式是通过调用方法Class.forName()4.2.1注册和加载JDBC驱动程序4.2.1注册和加载JDBC驱动程序注册 DriverManager.registerDriver(driver); 加载: 使用JDBC-ODBC桥驱动程序的语句如下: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 使用Oracle8i的JDBC驱动程序的语句如下: Class.forName("oracle.jdbc.driver.OracleDriver"); 使用SQL SERVER的JDBC驱动程序的加载语句如下: Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 使用MySql的JDBC驱动程序的加载语句如下: Class.forName("com.mysql.jdbc.Driver ");4.2.2建立连接4.2.2建立连接1.建立连接的方法 与数据库建立连接的标准方法是调用DriverManager.getConnection()方法。 该方法的原型是: static Connection getConnection(String url, String user, String password) throws SQLException 该方法接受由某个URL字符串指明的数据源、数据源的用户名和口令字 4.2.2建立连接4.2.2建立连接使用JDBC-ODBC桥的连接语句如下: DriverManager.getConnection("jdbc:odbc:emp",”aaa”,”bbb”); 使用SQL SERVER的连接语句如下: String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; String user="sa"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); 使用mysql的连接语句如下: String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd; Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection connection=DriverManager.getConnection(url); 4.2.2建立连接4.2.2建立连接Oracle提供了2种JDBC驱动程序: JDBC OCI驱动程序 Connection con = DriverManager.getConnection("jdbc:oracle:oci8:@db","scott","tiger"); JDBC Thin驱动程序 Connection con = DriverManager.getConnection("jdbc:oracle:thin:@host:1521:db","scott","tiger"); 4.2.2建立连接4.2.2建立连接2.关于URL 一般URL(统一资源定位符)提供在Internet上定位资源所需的信息,如:ftp://javasoft.com/docs/JDK-1_apidocs.zip 3.关于JDBC URL JDBC URL提供了一种标识数据库的方法,可以使相应的驱动程序能识别该数据库并与之建立连接。它由三部分组成,各部分间用冒号分隔 : jdbc:< 子协议 >:< 子名称 >4.2.2建立连接4.2.2建立连接JDBC连接由数据库 URL标识 jdbc:: 子协议名的典型示例是 “odbc”,如: jdbc:odbc:;User=;PW= <子名称>是一种标识数据库的方法。子名称可以依不同的子协议而变化 ,如果数据库是通过Internet 来访问的,则在JDBC URL中应将网络地址作为子名称的一部份包括进去,且必须遵循如下所示的标准URL命名约定://主机名:端口/子协议 注册32位数据源注册32位数据源要使用桥必须注册ODBC数据源4.2.3 发送SQL语句4.2.3 发送SQL语句JDBC对可被发送的SQL语句类型不加任何限制。 这就提供了很大的灵活性,即允许使用特定的数据库语句或甚至于非SQL语句 然而,它要求用户自己负责确保所涉及的数据库可以处理所发送的SQL语句。例如,如果某个应用程序试图向不支持储存程序的DBMS发送储存程序调用,就会失败并将抛出异常。 4.2.3 发送SQL语句4.2.3 发送SQL语句其实存在三种Statement对象: Statement PreparedStatement(从Statement继承而来) 用于执行带或不带IN参数的预编译SQL语句 CallableStatement(从PreparedStatement继承而来) 用于执行对数据库已存储过程的调用 1. 创建Statement对象1. 创建Statement对象Statement 对象将 SQL 语句发送到 DBMS 由Connection的createStatement()方法创建Statement对象: public Statement createStatement() throws SQLException 通常 Statement stmt = conn.createStatement();1. 创建Statement对象1. 创建Statement对象Statement接口中的主要方法有: ResultSet executeQuery (String sql) int executeUpdate (String sql) boolean execute (String sql) boolean getMoreResults () //检测是否有多个结果集 void close () //关闭Statement对象 int getMaxFieldSize () //获得字段最大长度 void setMaxFieldSize (int max) //设置字段最大长度1. 创建Statement对象1. 创建Statement对象Statement接口中的主要方法有(续): int getMaxRows () //获得最大行数 void setMaxRows (int max) //设置最大行数 int getQueryTimeout () //获得查询超时时间限 void setQueryTimeout (int seconds) //设定查询超时时间限 java.sql.SQLWarning getWarnings () //获得与statement对象有关的警告 ResultSet getResultSet () //得到下一个结果集 int getUpdateCount () //得到修改的行数 其中最重要的方法是 executeQuery(), executeUpdate(), and execute().提交查询 提交查询 Statement 对象的方法: executeUpdate() 用来创建和更新表 stmt.executeUpdate(query); executeQuery() 对于SELECT 语句 stmt.executeQuery(query); 提交查询提交查询execute() stmt.execute(); 返回布尔值,用于执行任何 SQL 语句,返回多个结果集的情况 通常: ResultSet rs = stmt.executeQuery(query); 提交查询提交查询DDL 命令包括create、alter 和 drop stat.executeUpdate("create table Customer (CustIdnumber(3),CustNamevarchar2(15),Address varchar2(30))"); DML 命令包括select、insert、update和delete RecordSet recset = stat.executeQuery("select * from customer"); 提交查询提交查询用于产生单个结果集的SELECT语句。 public ResultSet executeQuery(String sql) throws SQLException 用于执行INSERT,UPDATE或DELETE语句以及SQL DDL语句,例如CREATE TABLE和DROP TABLE。该方法返回一个整数,指示受影响的行数(即更新计数)。对于CREATE TABLE或DROP TABLE等不操作行的语句,返回值总为零。 public int executeUpdate(String sql) throws SQLException 2.创建PreparedStatement对象2.创建PreparedStatement对象要多次执行一个SQL语句,使用PreparedStatement SQL 语句在创建时提供参数 在执行 PreparedStatement 时,只传递参数值 通过不同的参数值多次调用 PreparedStatement对象表示预编译SQL语句。2.创建PreparedStatement对象2.创建PreparedStatement对象由Connection的prepareStatement ()方法创建 public PreparedStatement prepareStatement(String sql) throws SQLException 如:PreparedStatement pStmt = conn.preparedStatement( "insert into emp (empno , ename) values(?,?)"); 即:可以处理in型参数 在生成PreparedStatement对象的字符串中用“?”代表一个可以产生变化的参数,2.创建PreparedStatement对象2.创建PreparedStatement对象在创建 PreparedStatement 对象之后,必须为参数赋值 使用setXXX()方法 可以将第parameterIndex个参数赋值为x。 public void setInt(int parameterIndex, int x) throws SQLException 用 executeUpdate(), executeQuery(), execute() 方法执行SQL语句PreparedStatement对象常用的方法PreparedStatement对象常用的方法void setByte (int parameterIndex, byte x) void setBytes (int parameterIndex, byte x[]) void setDate (int parameterIndex, java.sql.Date x) void setDouble (int parameterIndex, double x) void setFloat (int parameterIndex, float x) void setInt (int parameterIndex, int x) void setLong (int parameterIndex, long x) void setShort (int parameterIndex, short x) void setString (int parameterIndex, String x) void setTime (int parameterIndex, java.sql.Time x) PreparedStatement对象常用的方法PreparedStatement对象常用的方法void setTimestamp (int parameterIndex, java.sql.Timestamp x) void setUnicodeStream (int parameterIndex, java.io.InputStream x, int length) void setObject (int parameterIndex, Object x) ResultSet executeQuery () int executeUpdate () boolean execute () 2.创建PreparedStatement对象2.创建PreparedStatement对象说明 参数parameterIndex表示在构造PreparedStatement对象时”?”从左到右出现的位置,从1开始。 参数x表示给”?”设定的值。 究竟用哪一个setXXX()方法,由”?”所表示的参数类型来决定 因为x的类型是java.sql.Types中的类型,而参数的类型是某种数据库中的数据类型,因此应该保证它们的类型能够相对应。一般来说,它们有下面的对应关系如表4-1所示。 2.创建PreparedStatement对象2.创建PreparedStatement对象2.创建PreparedStatement对象2.创建PreparedStatement对象在程序中可以用循环语句生成这一系列的语句,从而方便此类SQL语句的生成。 可以用PreparedStatement对象的 public void addBatch() throws SQLException 方法将其加入到一个批次作业。 最后用PreparedStatement对象的 public int[] executeBatch() throws SQLException 方法一次执行所有加入的批次作业。2.创建PreparedStatement对象2.创建PreparedStatement对象例如: PrepareStatement p=con.prepareStatement(“insert into city values(?)”); For(int i=0;i [, ...]} 3.创建CallableStatement对象3.创建CallableStatement对象它支持in和out型参数,如: CallableStatement cStmt = conn.prepareCall("{call showEmployees(?,?)}"); 注意:在创建CallableStatement对象前应检查所用的数据库是否支持存储过程,使用DataMetaData对象的supportsStoredProcedures(): public boolean supportsStoredProcedures() throws SQLException In或out型参数取决于存储过程3.创建CallableStatement对象3.创建CallableStatement对象OUT参数要使用registerOutParameter()方法进行注册登记 public void registerOutParameter(int parameterIndex, int sqlType) throws SQLException IN参数使用setXXX()方法设置实际值,设置字符串参数为: public void setString(int parameterIndex, String x) throws SQLException 使用CallableStatement对象的execute()方法执行该存储过程。 public boolean execute() throws SQLException OUT参数使用getXXX()方法取得返回值,取得字符串的方法为: public String getString(int parameterIndex) throws SQLException3.创建CallableStatement对象3.创建CallableStatement对象举例: create or replace procedure show(name out varchar2,num in number) as begin select Ename into name from emp where empno=num; end; callableStatement cs=con.prepareCall(“{call show(?,?)}”); Cs.registerOutParameter(1,java.sql.Types.CHAR); Cs.setInt(2,7777); Cs.execute(); String str=cs.getString(1); //存储过程必须用{},它是调用存储过程的转意符3.创建CallableStatement对象3.创建CallableStatement对象主要方法: float getFloat(int parameterIndex) //返回序号为parameterIndex参数的float类型值 String getString(int parameterIndex) //返回序号为parameterIndex参数的String类型值 void registerOutParameter(int parameterIndex, int sqlType) //将序号为parameterIndex的参数注册为JDBC中的sqlType类型 void setDouble(String parameterName, double x) // 设置参数parameterName为double类型值x void setFloat(String parameterName, float x) // 设置参数parameterName为float类型值x 等等4.2.4使用Statement 对象执行语句4.2.4使用Statement 对象执行语句创建了Statement对象(或preparedStatement对象、CallableStatement对象),完成了SQL语句发送后,就要调用Statement对象(或preparedStatement对象、CallableStatement对象)中的方法执行该SQL语句,进而得到执行的结果 Statement接口提供了三种执行SQL语句的方法:executeQuery()、executeUpdate()和execute() 4.2.4使用Statement 对象执行语句4.2.4使用Statement 对象执行语句对这3个execute方法作以下说明 : 3个都适用于任何的SQL语句 ,究竟使用哪一个方法由希望得到的返回值的类型来决定 所有的execute ()方法都将关闭所调用的Statement对象的当前打开结果集(如果存在) PreparedStatement 接口虽然继承了Statement接口中所有方法,但是它有自己的 executeQuery()、executeUpdate()和execute()方法 因为在创建Statement 对象时并不包含SQL语句,所以必须给Statement的execute方法提供SQL语句作为参数 这些execute方法有可能抛出SQLException 4.2.5 ResultSet对象 4.2.5 ResultSet对象 ResultSet对象是executeQuery()方法的返回值,它被称为结果集,它代表符合SQL语句条件的所有行 ResultSet 对象包含 SQL 语句的执行结果 它通过一套get方法提供了对这些行中数据的访问,即使用 getXXX 方法检索数据 getInt() 用于检索整型值 getString() 用于检索字符串值1.ResultSet对象1.ResultSet对象说明: 上述get方法很多,究竟用哪一个getXXX()方法,由列的数据类型来决定。 上面同一种类型的getXXX()方法是成对出现的,一个是根据列号得到值,另一个是根据列名得到值。 结果集游标即可以从第一行移动到最后一行,也可以从最后一行移动到第一行。 在java.sql包中有很多对象都有getWarnings()方法,这里的getWarnings()是与结果集相关的警告 1.ResultSet对象1.ResultSet对象ResultSet中的主要方法: public int getInt(int columnIndex) throws SQLException public int getInt(String columnName) throws SQLException public String getString(int columnIndex) throws SQLException public String getString(String columnName) throws SQLException boolean next () //将游标移动到结果集的下一行 boolean previous() //将游标移动到结果集的上一行 void close () //关闭结果集 boolean wasNull () //检测结果集是否为空 boolean first() //移动游标到ResultSet结果集的第一行 boolean last() 等等1.ResultSet对象1.ResultSet对象代码描述: import java.net.URL; import java.sql.*; import oracle.jdbc.driver.*; Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection("jdbc:oracle:oci8:@oradb", "scott", "tiger");代码描述(续)代码描述(续) Statement stmt = conn.createStatement(); ResultSet r = stmt.executeQuery("SELECT a,b,c FROM Table1"); While(r.next()){ int i = r.getInt("a"); String s = r.getString("b"); float f = r.getFloat("c"); System.out.println("ROW="+i+" "+s+" "+f); } stmt.close(); con.close();2.行和游标2.行和游标ResultSet对象自动维护指向其当前数据行的游标。 每调用一次next()方法,游标向下移动一行。 最初它位于第一行之前,因此第一次调用next(),将把游标置于第一行上,使它成为当前行。 随着每次调用next(),导致游标向下移动一行,按照从上至下的次序获取ResultSet 行。 在ResultSet对象或其对应的Statement对象关闭之前,游标一直保持有效 2.行和游标2.行和游标结果集的游标是有名字的。 如果数据库允许定位更新或定位删除,则需要将光标的名字作为参数提供给更新或删除命令。可通过调用方法getCursorName()获得游标名。 不是所有的DBMS都支持定位更新和删除。可使用 DatabaseMetaData的supportsPositionedDelete()和supportsPositionedUpdate()方法来检查特定连接是否支持这些操作。2.行和游标2.行和游标有时候需要结果集的游标前后移动,这是可使用滚动结果集。 为了获得滚动结果集,必须先用下面方法得到一个Statement对象:Statement st=con.createStatement(int type, int concurrency); 根据type和concurrency的取值,当执行ResultSet r=st.executeQuery()时,会返回不同类型的结果集。2.行和游标2.行和游标type的取值决定滚动方式,它可以取: ResultSet.TYPE_FORWORD_ONLY:表示结果集只能向下滚动 ResultSet.TYPE_SCROLL_INSENSITIVE:表示结果集可以上下滚动,当数据库变化时,结果集不变 ResultSet.TYPE_SCROLL_SENSITIVE:表示结果集可以上下滚动,当数据库变化时,结果集同步改变 2.行和游标2.行和游标concurrency取值表示是否可以用结果集更新数据库,它的取值是: ResultSet.CONCUR_READ_ONLY:表示不能用结果集更新数据库的表 ResultSet.CONCUR_UPDATETABLE:表示能用结果集更新数据库的表 2.行和游标2.行和游标滚动结果集常用的方法有: public boolean previous() public void beforeFirst() public void afterLast() public boolean isAfterLast() public boolean isBeforeFirst() public boolean isFirst() public boolean isLast() public int getRow() public boolean absolute(int rows)3.列3.列方法getXXX() 可按任何次序获取列值,但为了保证可移植性,应该从左至右获取列值,并且一次性地读取列值 列是从左至右编号的,并且从列1开始 getXXX()方法的输入的列名不区分大小写 注意getXXX()方法的参数。如果select语句未指定列名(例如在“select * from table1”中或列是导出的时),则应该使用列号3.列3.列有些情况下,SQL查询返回的结果集中可能有多个列具有相同的名字。如果列名用作getXXX()方法的参数,则getXXX()将返回第一个匹配列名的值。因而,如果多个列具有相同的名字,则需要使用列索引来确保检索了正确的列值。 关于ResultSet中列的信息,可通过调用ResultSet的方法getMetaData()得到。返回的ResultSetMetaData对象将给出其ResultSet对象各列的编号、类型和属性。3.列3.列如果列名已知,但不知其索引,则可用方法findColumn()得到其列号 对于getXXX()方法,JDBC驱动程序试图将基本数据转换成指定Java类型,然后返回适合的Java值 4. 数据类型和转换5 对非常大的值使用流5 对非常大的值使用流ResultSet可以获取任意大的LONGVARBINARY或LONGVARCHAR数据。 方法之一是通过让ResultSet类返回java.io.Input流来完成。从该流中可分块读取数据。 注意:必须立即访问这些流,因为在下一次对ResultSet调用getXXX()时它们将自动关闭 JDBC API具有三个获取流的方法,分别具有不同的返回值: getBinaryStream():返回只提供数据库原字节而不进行任何转换的流。 getAsciiStream():返回提供单字节ASCII字符的流 getUnicodeStream():返回提供双字节Unicode字符的流 6. NULL结果值6. NULL结果值要确定给定结果值是否是JDBC NULL,必须先读取该列,然后使用ResultSet的wasNull()方法检查该次读取是否返回JDBC NULL。 当使用ResultSet的getXXX()方法读取JDBC NULL时,方法wasNull()将返回下列值之一: Java null值:对于返回Java对象的getXXX()方法(例如 getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、getBinaryStream、getObject 等) 零值:对于 getByte、getShort、getInt、getLong、getFloat 和 getDouble false 值:对于 getBoolean7. 可选结果集或多结果集7. 可选结果集或多结果集有些情况下,应用程序在执行语句之前不知道该语句是否返回结果集。此外,有些已存储过程可能返回几个不同的结果集或更新计数。 为了适应这些情况,JDBC提供了一种机制,允许应用程序执行语句,然后处理由结果集和更新计数组成的任意集合 这种机制的原理是首先调用一个完全通用的execute()方法,然后调用另外三个方法:getResultSet()、getUpdateCount()和getMoreResults() 7. 可选结果集或多结果集7. 可选结果集或多结果集下面的代码演示了一种方法用来确认已访问方法execute()所产生的全部结果集和更新计数: stmt.execute(queryStringWithUnknownResults); while (true) { int rowCount = stmt.getUpdateCount(); if (rowCount > 0) { // 它是更新计数 System.out.println("Rows changed = " + count); stmt.getMoreResults(); continue; }7. 可选结果集或多结果集7. 可选结果集或多结果集if (rowCount == 0) { // DDL 命令或 0 个更新 System.out.println(" No rows changed or statement was DDL command"); stmt.getMoreResults(); continue; } // 执行到这里,证明有一个结果集或没有其它结果 ResultSet rs = stmt.getResultSet(); if (rs != null) { . . . // 使用元数据获得关于结果集列的信息 stmt.getMoreResults(); else break; // 没有其它结果 }4.2.6 关闭 Statement对象和Connection对象4.2.6 关闭 Statement对象和Connection对象作为一种好的编程风格,应在不需要Statement对象和Connection对象时显式地关闭它们 关闭Statement对象和Connection对象的语法形式为:public void close() throws SQLException 用户不必关闭ResultSet。当产生它的 Statement 关闭、重新执行或用于从多结果序列中获取下一个结果时,该ResultSet将被Statement自动关闭 4.2.6 关闭 Statement对象和Connection对象4.2.6 关闭 Statement对象和Connection对象下面例子通过JDBC-ODBC桥方式访问SQL Server数据库pubs中的表jobs,里面记录员工号码和描述信息job_desc。 需要说明的是,为了使用JDBC-ODBC桥,需要注册32位数据源。本例的运行结果如图4-7所示。 4.2.6 关闭 Statement对象和Connection对象4.2.6 关闭 Statement对象和Connection对象下例与上例使用相同的数据源,通过使用PrepareStatement对象在表jobs中插入一条记录。 我们通过SQL Server企业管理器打开pubs数据库的jobs表,看到新纪录确实已经插入了,运行结果如图4-8所示 4.2.7 事务4.2.7 事务事务是由具有“原子性”的一个或多个语句,即这些语句要么全部被执行、完成并被提交,要么全部还原。 当调用提交方法commit()或回滚方法rollback()时,当前事务即告结束,另一个事务随即开始。 缺省情况下,新连接将处于自动提交模式 如果禁用自动提交模式,事务将要等到commit()或rollback()方法被显式调用时才结束 ,因此它将包括上一次调用commit()或rollback()方法以来所有执行过的语句 4.2.7 事务4.2.7 事务下面例中,首先在SQL Server的pubs数据库中新建一个student表,其中包括4个字段:学号SNO、姓名SNAME、年龄SAGE、所在系SDEPT。然后以批处理方式插入4条记录,这4条记录的插入放在一个事务中一起提交。若4条记录中有一条插入不成功,就回滚事务,全部放弃4条记录的插入。 关键代码: con.setAutoCommit(false); //取消自动提交 sta.addBatch("insert into student"+"values(1,'张三',18,'计算机')"); sta.addBatch("insert into student"+"values(2,'李四',19,'信息')"); sta.addBatch("insert into student"+"values(3,'王五',18,'计算机')"); sta.addBatch("insert into student"+"values(4,'赵六',20,'信息')"); int [] updateCount=sta.executeBatch(); con.commit(); //此时提交 con.setAutoCommit(true);//恢复自动提交4.2.8 事务隔离级别4.2.8 事务隔离级别如果 DBMS支持事务处理,它必须有某种途径来管理两个事务同时对一个数据库进行操作时可能发生的冲突 用户可指定事务隔离级别(即隔离粒度),以指明DBMS 应该花多大精力来解决潜在冲突 JDBC用户可用以下代码来指示DBMS允许在值被提交前读取该值(“dirty 读取”),其中con是当前连接: con.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED); 事务隔离级别越高,为避免冲突所花的精力也就越多 当创建Connection对象时,其事务隔离级别取决于驱动程序,但通常是所涉及的数据库的缺省值 用户可通过调用Connection对象的setIsolationLevel()方法来更改事务隔离级别 null多种数据库的支持OracleOracleClass.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbcracle:thin:@localhost:1521rcl"; //orcl为你的数据库的SID String user="scott"; String password="tiger"; Connection conn= DriverManager.getConnection(url,user,password); Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); String sql="select * from test"; ResultSet rs=stmt.executeQuery(sql); rs.close(); stmt.close(); conn.close(); SQL ServerSQL ServerClass.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; //pubs为你的数据库的 String user="sa"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); String sql="select * from test"; ResultSet rs=stmt.executeQuery(sql); rs.close(); stmt.close(); conn.close(); DB2DB2Class.forName("com.ibm.db2.jdbc.app.DB2Driver").newInstance(); String url="jdbc:db2://localhost:5000/sample"; //sample为你的数据库名 String user="admin"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); String sql="select * from test"; ResultSet rs=stmt.executeQuery(sql); rs.close(); stmt.close(); conn.close(); MySQLMySQLClass.forName("org.gjt.mm.mysq
本文档为【11。JDBC(132)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_425448
暂无简介~
格式:ppt
大小:414KB
软件:PowerPoint
页数:0
分类:工学
上传时间:2010-10-28
浏览量:15