Java-JDBC学习教程-由浅入深

上传人:xgs****56 文档编号:10795933 上传时间:2020-04-14 格式:DOC 页数:98 大小:1.55MB
返回 下载 相关 举报
Java-JDBC学习教程-由浅入深_第1页
第1页 / 共98页
Java-JDBC学习教程-由浅入深_第2页
第2页 / 共98页
Java-JDBC学习教程-由浅入深_第3页
第3页 / 共98页
点击查看更多>>
资源描述
目录第一节整理目的3第二节jdbc的概念32.1概念32.2 Jdbc与应用程序的关系32.3 数据库的连接步骤42.4 Quick Start4第三节如何与数据库建立连接63.1 注册驱动63.2 建立数据库的连接83.3 规范Quick Start中的例子10第四节Statement 接口的使用详解124.1 Statement 的常用方法124.2 CRUD操作164.3 Statement有那些缺点19第五节ResultSet接口的使用详解20第六节JDBC 中数据类型详解306.1 基本数据类型306.2 日期类型346.3 CLOB类型366.4 BLOB类型396.5 其他数据类型41第七节DAO设计模式详解417.1 实际项目中如何使用JDBC417.2 DAO设计模式简介427.3 DAO设计模式的实现427.4 DAO设计模式与工厂模式的整合497.5 DAO设计模式测试52第八节JDBC对事务的支持528.1 模拟转账538.2 jdbc默认事务548.3 事务提交与回滚548.4 设置保存点558.5 JTA事务的介绍568.6 数据库的隔离级别介绍568.6.1 未提交读578.6.2 提交读588.6.3 重复读598.6.4 序列化读608.7 小结62第九节PreparedStatement接口的使用62第十节CallableStatement接口的使用629.1 无参无返回值存储过程调用639.2 有参无返回值存储过程调用639.3 有参有返回值存储过程调用649.4 JDBC其他API65第十一节元数据信息6611.1 数据库元数据信息6611.2 参数元数据信息67第十二节批处理的使用6712.1 普通方式插入一千条数据6812.2 批处理方式插入一千条数据69第十三节JDBC其他API7013.1 可滚动结果集7013.2 分页技术7213.3 可更新结果集73第十四节编写一个简单的数据库连接池7414.1 为什么要使用数据库连接池7414.2 数据库连接池雏形7414.2 数据库连接池优化7714.2.1 对线程池加锁7714.2.2 连接不够用时抛出异常7714.3 数据库连接池之代理模式7814.3.1 静态代理7814.3.2 动态代理8414.4 DBCP数据库连接池的使用87第十五节jdbc轻量级封装8815.1 将结果集封装为Map8815.1.1 ResultSetMetaData演示8815.1.2解决多行记录的问题8915.1.3 Map结果集的封装9015.2 将结果集封装为对象9115.2.1 user表POJO的编写9115.2.2 Bean结果集的封装9215.3 将结果集封装为List9415.4 策略模式的应用9615.4.1 Map结果集策略模式应用9615.4.2 Bean结果集策略模式应用9715.4.3 List结果集策略模式应用9815.4.4 单元测试9915.5 模板模式的应用100第十六节近期推出101第一节 整理目的当今orm等全自动针对对象持久化的框架越来越多并且也越来越成熟(ibatis,hibernate,ejb的jpa),但是无奈新东家需要使用jdbc(原始手工作坊)的模式和数据库打交道,用了几年的ibatis,再次使用jdbc发现有些细节和底层的东西自己并不是十分清楚,所以就啰理啰嗦的整理出一份学习笔记,第一作为自己对jdbc重新的复习,第二如果有可能希望给初学jdbc的朋友带来一定的便利,这样也不枉我点点滴滴的记录。随着对jdbc整理和学习的逐渐深入,发现原先使用orm框架时忽略了那么多的细节,这样在出现问题或者学习orm更加深入知识时则会显得力不从心,在本文档将jdbc如何入门阐述清楚之后,增加了如下的内容: 数据库连接池,以及常用连接池的使用(dbcp,c3p0等) 编写一套基于jdbc轻量级的api,方便使用; 如何将查询结果封装为对象; 如何将查询结果封装为Map; 如何将查询结果封装为List; 如何在JDBC的使用中加入策略,模板等模式; 在后面的JDBC高级部分将会讲解到Dbutils源码,Spring对JDBC的强大封装第二节 jdbc的概念2.1概念我最不喜欢替别人整理某个名词的概念了,只要是概念性的东西基本上在任何地方都可以查得到,所以我就通俗的写一些自己对jdbc的理解,所谓jdbc就是java与数据库之间进行通讯的api,也就是一个标准,所以如果一个java应用程序想要和数据库打交道基本上都离不开jdbc,众所周知,一些优秀的orm框架的底层也是采用jdbc进行封装的。2.2 Jdbc与应用程序的关系JdbcAPI所处的位置和它与应用程序之间的关系,下面的一张图再也明显不过了,其中绿色的部分代表jdbcAPI,它提供了很多接口,并且本身也实现了很多方法,可以看到蓝色的部分就是各个数据库厂商自己对jdbcAPI的一些实现,这就是我们常见的数据库连接驱动,这是使用jdbc程序进行开发必不可少的东西。2.3 数据库的连接步骤1. 注册驱动 (Driver)2. 建立连接(创建Connection)3. 创建执行sql语句(通常是创建Statement或者其子类)4. 执行语句5. 处理执行结果(在非查询语句中,该步骤是可以省略的)6. 释放相关资源在后文中,将会对上述几个步骤一一进行讲解,希望读者能够仔细阅读;2.4 Quick Start好了,了解了一下jdbc的基本概念,相比对jdbc已经有了一个感性的认识,现在我们为了直观期间,直接来上一段代码了解一下jdbc最简单的程序如何进行开发的。在该小节中,我们以一个简单的增删改查为例进行说明,然后会将该章节中涉及的各个常用以及关键的API进行详细的讲解;首先我们创建一个数据表,在test数据库下,见表语句为 create table user(id integer primary key, name varchar(30) , birthday date, money float);插入两条语句l insert into user values(2,zhangsan,2010-01-01,15000);l insert into user values(1,wangwenjun,1984-06-09,8500.00);好了,数据准备好了,我们通过一个完整的例子讲上述中数据库的连接步骤进行一个演示,在本例子中,初学者可能有些地方会觉得陌生,看不明白,不用着急,在后文中会对涉及的知识点逐个进行讲解Testpublic void wholeExample()try /1.注册驱动Class.forName(com.mysql.jdbc.Driver);/2.获取数据库连接Connection conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/test, root,r66t);/3.创建执行句柄Statement stmt = conn.createStatement();/4.执行sql语句ResultSet rs = stmt.executeQuery(select * from user);/5.处理执行结果while(rs.next()System.out.println(id:+rs.getInt(1)+tname:+rs.getString(2)+tbirthday:+rs.getDate(3)+tmoney:+rs.getFloat(4);/6.释放资源rs.close();stmt.close();conn.close(); catch (SQLException e) e.printStackTrace(); catch (ClassNotFoundException e) e.printStackTrace();执行结果如下id:1name:wangwenjunbirthday:1984-06-09money:8500.0id:2name:zhangsanbirthday:2010-01-01money:15000.0第三节 如何与数据库建立连接3.1 注册驱动l 第一种注册方式通常来说,注册驱动的方式有三种,下面我们将一一进行介绍,首先来看看直接调用DriverManager的registerDriver方法进行加载驱动,在本文中所有的程序均是在mysql数据库上进行演示的。示例代码如下Testpublic void registDriver1()try DriverManager.registerDriver(new com.mysql.jdbc.Driver();Connection conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/test, root,r66t);Assert.assertEquals(false, conn.isClosed(); catch (SQLException e) e.printStackTrace();执行结果为可以看到,当前我们的程序与数据库的连接是正常的。l 第二种注册方式Testpublic void registDriver2()try System.setProperty(jdbc.drivers, com.mysql.jdbc.Driver);Connection conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/test, root,r66t);Assert.assertEquals(false, conn.isClosed(); catch (SQLException e) e.printStackTrace();执行结果为可以看到,当前我们的程序与数据库的连接是正常的。l 第三种注册方式Testpublic void registDriver3()try Class.forName(com.mysql.jdbc.Driver);Connection conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/test, root,r66t);Assert.assertEquals(false, conn.isClosed(); catch (SQLException e) e.printStackTrace(); catch (ClassNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace();执行结果为可以看到,当前我们的程序与数据库的连接是正常的。一般来说注册驱动的方式大致上有上述三个,但是最常用的是最后一个,通过我们的代码演示可以看出,数据库都是完全可以被访问成功的。3.2 建立数据库的连接其实在上文中的代码演示中,我们都会看到如何获取一个数据库连接,就是通过DriverManager.getConnection()方法获取数据库的链接,该方法大致有三个重载的方法,都是可以进行数据库连接的获取的,下面我们将会一一进行演示Static ConnectiongetConnection(Stringurl) 试图建立到给定数据库 URL 的连接。static ConnectiongetConnection(Stringurl, Propertiesinfo) 试图建立到给定数据库 URL 的连接。static ConnectiongetConnection(Stringurl,String user, Stringpassword) 试图建立到给定数据库 URL 的连接。l getConnection(Stringurl)该实例中,登录数据库的所有信息都编写在url中,实例代码如下Testpublic void getConn1()try Class.forName(com.mysql.jdbc.Driver);Connection conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/test?user=root&password=r66t);Assert.assertEquals(false, conn.isClosed(); catch (SQLException e) e.printStackTrace(); catch (ClassNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace();l getConnection(Stringurl, Propertiesinfo)该方法则是将用户名和密码的信息存放在一个Properties键值对中,示例代码如下Testpublic void getConn2()try Class.forName(com.mysql.jdbc.Driver);Properties props = new Properties();props.put(user, root);props.put(password, r66t);Connection conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/test,props);Assert.assertEquals(false, conn.isClosed(); catch (SQLException e) e.printStackTrace(); catch (ClassNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace();l getConnection(Stringurl,String user, Stringpassword)该方法则是我们在上文中演示了很多次的方式,也是最常用的一种方式,在这里再次进行一下赘述Testpublic void getConn3()try Class.forName(com.mysql.jdbc.Driver);Connection conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/test, root,r66t);Assert.assertEquals(false, conn.isClosed(); catch (SQLException e) e.printStackTrace(); catch (ClassNotFoundException e) / TODO Auto-generated catch blocke.printStackTrace();3.3 规范Quick Start中的例子其中,我们在Quick Start中写了一个较为完整的代码示例,但是在该代码中存在很多的问题,我们通过本节的介绍,一一进行规范和优化,并且说明一下优化的好处是什么使用数据库时,涉及数据库的资源都是非常奇缺的,我们在使用的过程中务必保证我们将使用过的资源释放,供别人再次使用或者自己下次再次使用,还有,创建数据库连接时可能存在各种各样的问题导致数据库连接获取失败,这个时候你的应用应该有义务告知上一层使用者到底出现了什么问题,这样就需要一个异常传递的过程(异常是一个比较复杂的机制,笔者在另一篇文章中有详细的讲解,希望读者能够关注)Testpublic void regularWhole() throws Exception/抛出异常Connection conn = null;Statement stmt = null;ResultSet rs = null;try /1.注册驱动Class.forName(com.mysql.jdbc.Driver);/2.获取数据库连接conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/test, root,r66t);/3.创建执行句柄stmt = conn.createStatement();/4.执行sql语句rs = stmt.executeQuery(select * from user);/5.处理执行结果while(rs.next()System.out.println(id:+rs.getInt(1)+tname:+rs.getString(2)+tbirthday:+rs.getDate(3)+tmoney:+rs.getFloat(4); finallytry /6.释放资源if(null!=rs)rs.close();if(null!=stmt)stmt.close();if(null!=conn)conn.close(); finallyif(null!=rs)rs.close();if(null!=stmt)stmt.close();if(null!=conn)conn.close();在该实例中,可以看出确保了资源的完全释放,也将异常抛出告知上一层使用者,那块出现了问题,但是可以看到代码明显写的很罗嗦,而且有很多地方还是值得考究的其中,注册驱动,数据库的驱动注册,只需要一次即可,重复注册是没有任何意义的,并且资源的释放,在每次使用的时候都进行资源的释放(写资源释放的代码)显得非常罗嗦,所以我们进行再一次的一个优化,代码如下package com.wangwenjun.jdbc;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public final class ConnCreate static try Class.forName(com.mysql.jdbc.Driver); catch (ClassNotFoundException e) e.printStackTrace();public static Connection getConnection(String url, String user, String pwd) Connection conn = null;try conn = DriverManager.getConnection(url, user, pwd); catch (SQLException e) e.printStackTrace();return conn;public static void close(Connection conn, Statement stmt, ResultSet rs)throws SQLException if (null != rs) rs.close();if (null != stmt) stmt.close();if (null != conn) conn.close();可以看出,驱动只会被注册一次,并且对资源释放的代码进行了抽取,在以后的使用过程中则会简单许多,当然上述的代码如果还需要追究问题,肯定还是存在的,在接下来的章节中我们也会进行深入的说明。第四节 Statement 接口的使用详解Statement 是应用与数据库打交道最关键的一个接口,该接口包括了我们常用的CRUD操作,还可以设置抓取策略,比如设置数据库的游标是多少,可以根据数据量进行调优,也可以进行批量处理等,总之,该接口是非常关键的一个接口,包括后文中的预处理命令接口以及执行存储过程的接口。4.1 Statement 的常用方法下面的列表是从jdk API文档上粘贴出来的,当然很多方法我们并不是都能碰到,但是了解一下还是会有好处的方法摘要voidaddBatch(Stringsql) 将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中。voidcancel() 如果 DBMS 和驱动程序都支持中止 SQL 语句,则取消此 Statement 对象。voidclearBatch() 清空此 Statement 对象的当前 SQL 命令列表。voidclearWarnings() 清除在此 Statement 对象上报告的所有警告。voidclose() 立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。booleanexecute(Stringsql) 执行给定的 SQL 语句,该语句可能返回多个结果。booleanexecute(Stringsql, intautoGeneratedKeys) 执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序所有自动生成的键都应该可用于检索。booleanexecute(Stringsql, intcolumnIndexes) 执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序在给定数组中指示的自动生成的键应该可用于检索。booleanexecute(Stringsql, StringcolumnNames) 执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序在给定数组中指示的自动生成的键应该可用于检索。intexecuteBatch() 将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。ResultSetexecuteQuery(Stringsql) 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。intexecuteUpdate(Stringsql) 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。intexecuteUpdate(Stringsql, intautoGeneratedKeys) 执行给定的 SQL 语句,并用给定标志通知驱动程序由此 Statement 生成的自动生成键是否可用于检索。intexecuteUpdate(Stringsql, intcolumnIndexes) 执行给定的 SQL 语句,并通知驱动程序在给定数组中指示的自动生成的键应该可用于检索。intexecuteUpdate(Stringsql, StringcolumnNames) 执行给定的 SQL 语句,并通知驱动程序在给定数组中指示的自动生成的键应该可用于检索。ConnectiongetConnection() 检索生成此 Statement 对象的 Connection 对象。intgetFetchDirection() 检索从数据库表获取行的方向,该方向是根据此 Statement 对象生成的结果集合的默认值。intgetFetchSize() 检索结果集合的行数,该数是根据此 Statement 对象生成的 ResultSet 对象的默认获取大小。ResultSetgetGeneratedKeys() 检索由于执行此 Statement 对象而创建的所有自动生成的键。intgetMaxFieldSize() 检索可以为此 Statement 对象所生成 ResultSet 对象中的字符和二进制列值返回的最大字节数。intgetMaxRows() 检索由此 Statement 对象生成的 ResultSet 对象可以包含的最大行数。booleangetMoreResults() 移动到此 Statement 对象的下一个结果,如果其为 ResultSet 对象,则返回 true,并隐式关闭利用方法 getResultSet 获取的所有当前 ResultSet 对象。booleangetMoreResults(intcurrent) 将此 Statement 对象移动到下一个结果,根据给定标志指定的指令处理所有当前 ResultSet 对象;如果下一个结果为 ResultSet 对象,则返回 true。intgetQueryTimeout() 检索驱动程序等待 Statement 对象执行的秒数。ResultSetgetResultSet() 以 ResultSet 对象的形式检索当前结果。intgetResultSetConcurrency() 检索此 Statement 对象生成的 ResultSet 对象的结果集合并发性。intgetResultSetHoldability() 检索此 Statement 对象生成的 ResultSet 对象的结果集合可保存性。intgetResultSetType() 检索此 Statement 对象生成的 ResultSet 对象的结果集合类型。intgetUpdateCount() 以更新计数的形式检索当前结果;如果结果为 ResultSet 对象或没有更多结果,则返回 -1。SQLWarninggetWarnings() 检索此 Statement 对象上的调用报告的第一个警告。voidsetCursorName(Stringname) 将 SQL 指针名称设置为给定的 String,后续 Statement 对象的 execute 方法将使用此字符串。voidsetEscapeProcessing(booleanenable) 将转义处理设置为开或关。voidsetFetchDirection(intdirection) 向驱动程序提供关于方向的提示,在使用此 Statement 对象创建的 ResultSet 对象中将按该方向处理行。voidsetFetchSize(introws) 为 JDBC 驱动程序提供关于需要更多行时应该从数据库获取的行数的提示。voidsetMaxFieldSize(intmax) 设置将字符或二进制值存储到给定字节数中 ResultSet 列中的最大字节数限制。voidsetMaxRows(intmax) 将任何 ResultSet 对象都可以包含的最大行数限制设置为给定数。voidsetQueryTimeout(intseconds) 将驱动程序等待 Statement 对象执行的秒数设置为给定秒数。其中API 上特别注明了一句话,是非常关键的,我们在使用的时候一定要注意,否则会出现很严重的问题在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。如果存在某个语句的打开的当前 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭它。其实从Statement的原理来说,底层他还是从过游标的方式操作数据,尤其是进行查询的时候,并且还是显式游标,如果对其不能进行及时的资源释放,当运行到一定时间,数据库则会抛出异常给应用(打开的游标超过了最大值)4.2 CRUD操作我们还是通过上述创建的user表进行一下增删改查的操作,来看看通过Statement怎样进行数据的操作。l 新增数据现在想到数据库中新增一条数据,编号为3,名称为lisi,生日为2010-05-05,money为13000.00,代码示例如下Testpublic void insert() throws SQLExceptionConnection conn = null;Statement stmt = null;ResultSet rs = null;try / 1.注册驱动/Class.forName(com.mysql.jdbc.Driver);/ 2.获取数据库连接conn = ConnCreate.getConnection(jdbc:mysql:/localhost:3306/test, root, r66t);/ 3.创建执行句柄stmt = conn.createStatement();/ 4.执行sql语句String sql=insert into user(id,name,birthday,money) values(3,lisi,2010-05-05,13000.00);stmt.executeUpdate(sql); finally ConnCreate.close(conn,stmt,rs);执行结果对比为(下图为,sql执行前后的查询展示)l 修改数据物价上涨,待遇一直不涨,所以我们将lisi的money给再加上5000元,当然这只是一个演示,意思就是说更新一下数据表中的数据,如果真的可以这么做,大家可以随时Q我,给增加工资,呵呵,好了,直接上演示代码Testpublic void update() throws SQLExceptionConnection conn = null;Statement stmt = null;ResultSet rs = null;try / 1.注册驱动/Class.forName(com.mysql.jdbc.Driver);/ 2.获取数据库连接conn = ConnCreate.getConnection(jdbc:mysql:/localhost:3306/test, root, r66t);/ 3.创建执行句柄stmt = conn.createStatement();/ 4.执行sql语句String sql=update user set money=money+5000 where id=3;stmt.executeUpdate(sql); finally ConnCreate.close(conn,stmt,rs);执行结果为可以看出,lisi的money字段被更新了l 删除数据刚才将lisi的money给上调了,结果被领导发现了,现在要求将lisi给开除了,所以我们只好进行删除操作了(所以说敏感数据不能随便修改哒),示例代码如下Testpublic void delete() throws SQLExceptionConnection conn = null;Statement stmt = null;ResultSet rs = null;try / 1.注册驱动/Class.forName(com.mysql.jdbc.Driver);/ 2.获取数据库连接conn = ConnCreate.getConnection(jdbc:mysql:/localhost:3306/test, root, r66t);/ 3.创建执行句柄stmt = conn.createStatement();/ 4.执行sql语句String sql=delete from user where id=3;stmt.executeUpdate(sql); finally ConnCreate.close(conn,stmt,rs);执行结果如下图所示从上图可以看出,lisi已经被删除掉了。l 查询数据前面的章节中,关于查询的示例实在太多了,此处省略。4.3 Statement有那些缺点应用执行sql其实大体上可以分为两步,第一步是将sql交给数据库应用检查编译,然后再由数据库将执行结果返回给应用。好了我们看一个实例,来感受一下Statement会有哪些缺点Testpublic void conditionQuery() throws SQLExceptionConnection conn = null;Statement stmt = null;ResultSet rs = null;try / 1.注册驱动/Class.forName(com.mysql.jdbc.Driver);/ 2.获取数据库连接conn = ConnCreate.getConnection(jdbc:mysql:/localhost:3306/test, root, r66t);/ 3.创建执行句柄stmt = conn.createStatement();/ 4.执行sql语句String sql=select * from user where name=wangwenjun or 1 or ;System.out.println(sql);rs = stmt.executeQuery(sql);/ 5.处理执行结果while (rs.next() System.out.println(id: + rs.getInt(1) + tname:+ rs.getString(2) + tbirthday: + rs.getDate(3)+ tmoney: + rs.getFloat(4); finally ConnCreate.close(conn,stmt,rs);请看一下我们的代码,其中name的值很诡异,假设,这个值是由前台用户传递进来的,我们就不能保证他到底是什么,当然我们也可以通过编写过滤器来进行规避,但是我们怎么样通过jdbc来规避上述的问题呢,首先看看运行结果吧select * from user where name=wangwenjun or 1 or id:1name:wangwenjunbirthday:1984-06-09money:8500.0id:2name:zhangsanbirthday:2010-01-01money:15000.0id:3name:lisibirthday:2010-05-05money:18000.0可以看到将所有的语句都查询出来了。简单总结一下Statement的缺点哈(纯属个人观点,可能有些不太全面)l 执行时发送sql,影响效率.l 同样的sql,每次都要发送,不能进行有效的缓存,是一种资源的浪费.l 示例代码中演示可以看出,为了防止恶意数据我们还需要编写附加的程序(过滤器)带来不必要的开支.l 拼接sql字符串很容易出现错误.为了解决上述的问题,我们引入一个新的接口PreparedStatement,该接口是Statement的子接口,他们的主要区别是,在执行sql之前首先准备好sql语句,将其中的条件通过?进行占位,还有一个好处就是,同样的sql会被PreparedStatement有效的缓存,也就是说,数据库会减少校验的过程,减少消耗,这就是我们常说的预处理命令方式,在后文中也会涉及到。第五节 ResultSet接口的使用详解从字面意思上来了解,该接口是一个数据集合,是从数据库中获取的数据会存放在该集合当中,该集合提供了很多种数据获取的方法,详细信息,请看下表展示方法摘要booleanabsolute(introw) 将指针移动到此 ResultSet 对象的给定行编号。voidafterLast() 将指针移动到此 ResultSet 对象的末尾,正好位于最后一行之后。voidbeforeFirst() 将指针移动到此 ResultSet 对象的开头,正好位于第一行之前。voidcancelRowUpdates() 取消对 ResultSet 对象中的当前行所作的更新。voidclearWarnings() 清除在此 ResultSet 对象上报告的所有警告。voidclose() 立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。voiddeleteRow() 从此 ResultSet 对象和底层数据库中删除当前行。intfindColumn(StringcolumnName) 将给定的 ResultSet 列名称映射到其 ResultSet 列索引。booleanfirst() 将指针移动到此 ResultSet 对象的第一行。ArraygetArray(inti) 以 Java 编程语言中 Array 对象的形式检索此 ResultSet 对象的当前行中指定列的值。ArraygetArray(StringcolName) 以 Java 编程语言中 Array 对象的形式检索此 ResultSet 对象的当前行中指定列的值。InputStreamgetAsciiStream(intcolumnIndex) 以 ASCII 字符流的形式检索此 ResultSet 对象的当前行中指定列的值。InputStreamgetAsciiStream(StringcolumnName) 以 ASCII 字符流的形式检索此 ResultSet 对象的当前行中指定列的值。BigDecimalgetBigDecimal(intcolumnIndex) 以具有全精度的 java.math.BigDecimal 的形式检索此 ResultSet 对象的当前行中指定列的值。BigDecimalgetBigDecimal(intcolumnIndex, intscale) 已过时。BigDecimalgetBigDecimal(StringcolumnName) 以具有全精度的 java.math.BigDecimal 的形式检索此 ResultSet 对象的当前行中指定列的值。BigDecimalgetBigDecimal(StringcolumnName, intscale) 已过时。InputStreamgetBinaryStream(intcolumnIndex) 以未解释字节的二进制流的形式检索此 ResultSet 对象的当前行中指定列的值。InputStreamgetBinaryStream(StringcolumnName) 以未解释的 byte 流的形式检索此 ResultSet 对象的当前行中指定列的值。BlobgetBlob(inti) 以 Java 编程语言中 Blob 对象的形式检索此 ResultSet 对象的当前行中指定列的值。BlobgetBlob(StringcolName) 以 Java 编程语言中 Blob 对象的形式检索此 ResultSet 对象的当前行中指定列的值。booleangetBoolean(intcolumnIndex) 以 Java 编程语言中 boolean 的形式检索此 ResultSet 对象的当前行中指定列的值。booleangetBoolean(StringcolumnName) 以 Java 编程语言中 boolean 的形式检索此 ResultSet 对象的当前行中指定列的值。bytegetByte(intcolumnIndex) 以 Java 编程语言中 byte 的形式检索此 ResultSet 对象的当前行中指定列的值。bytegetByte(StringcolumnName) 以 Java 编程语言中 byte 的形式检索此 ResultSet 对象的当前行中指定列的值。bytegetBytes(intcolumnIndex) 以 Java 编程语言中 byte 数组的形式检索此 ResultSet 对象的当前行中指定列的值。bytegetBytes(StringcolumnName) 以 Java 编程语言中 byte 数组的形式检索此 ResultSet 对象的当前行中指定列的值。ReadergetCharacterStream(intcolumnIndex) 以 java.io.Reader 对象的形式检索此 ResultSet 对象的当前行中指定列的值。ReadergetCharacterStream(StringcolumnName) 以 java.io.Reader 对象的形式检索此 ResultSet 对象的当前行中指定列的值。ClobgetClob(inti) 以 Java
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!