`

Connection Statement ResultSet的一些接口和用法

 
阅读更多

JDBC是由一系列连接(Connection)、SQL语句(Statement)和结果集(ResultSet)构成的,其主要作用概括起来有如下3个方面:
建立与数据库的连接。
向数据库发起查询请求。
处理数据库返回结果。



这些作用是通过一系列API实现的,其中的几个重要接口如表13-1所示。


表13-1 JDBC API中的重要接口
接 口 作 用
java.sql.DriverManager 处理驱动程序的加载和建立新数据库连接
java.sql.Connection 处理与特定数据库的连接
java.sql.Statement 在指定连接中处理SQL语句
java.sql.ResultSet 处理数据库操作结果集



这些JDBC API的组成结构如图13-2所示。

13-2 JDBC API的组成结构


DriverManager

DriverManager类是Java.sql包中用于数据库驱动程序管理的类,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接,也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等事务。DriverManager 类直接继承自java.lang.object,其主要成员方法如表13-2所示。
13-2 DriverManager的主要成员方法及其含义



对于简单的应用程序,程序开发人员需要在此类中直接使用的惟一方法是 DriverManager.getConnection。该方法是用来建立与数据库的连接的。JDBC 允许用户调用 DriverManager 的方法 getDrivergetDrivers registerDriver Driver 的方法 connect。但多数情况下,最好让 DriverManager 类管理建立连接的细节。

Connection

Connection是用来表示数据库连接的对象,对数据库的一切操作都是在这个连接的基础上进行的。Connection类的主要成员方法如表13-3所示。



表13-3 Connection类的主要成员方法及其含义
方 法 含 义
void clearWarnings 清除连接的所有警告信息
Statement createStatement() 创建一个statement对象
Statement createStatement(int resultSetType, int resultSetConcurrency)
创建一个statement对象,它将生成具有特定类型和并发性的结果集
void commit() 提交对数据库的改动并释放当前连接持有的数据库的锁
void rollback() 回滚当前事务中的所有改动并释放当前连接持有的数据库的锁
String getCatalog() 获取连接对象的当前目录名
boolean isClosed() 判断连接是否已关闭
boolean isReadOnly() 判断连接是否为只读模式
void setReadOnly() 设置连接的只读模式
void close() 立即释放连接对象的数据库和JDBC资源


Statement

Statement用于在已经建立的连接的基础上向数据库发送SQL语句的对象。它只是一个接口的定义,其中包括了执行SQL语句和获取返回结果的方法。实际上有3 Statement 对象:StatementPreparedStatement(继承自Statement )和 CallableStatement(继承自PreparedStatement)。它们都作为在给定连接上执行 SQL 语句的容器,每个都专用于发送特定类型的 SQL 语句: Statement 对象用于执行不带参数的简单 SQL 语句;PreparedStatement 对象用于执行带或不带 IN 参数的预编译 SQL 语句;CallableStatement 对象用于执行对数据库已存储过程的调用。Statement 接口提供了执行语句和获取结果的基本方法;PreparedStatement 接口添加了处理 IN 参数的方法;而 CallableStatement 添加了处理 OUT 参数的方法。

创建statement对象的方法如下:
Statement stmt = con.createStatement();

Statement接口定义中包括的方法如表13-4所示。



表13-4 Statement接口的主要成员方法及其含义
方 法 含 义
void addBatch(String sql) 在Statement语句中增加用于数据库操作的SQL批处理语句
void cancel() 取消Statement中的SQL语句指定的数据库操作命令
void clearBatch() 清除Statement中的SQL批处理语句
void clearWarnings() 清除Statement语句中的操作引起的警告
void close() 关闭Statement语句指定的数据库连接
boolean execute(String sql) 执行SQL语句
int[] executeBatch() 执行多个SQL语句
ResultSet executeQuery(String sql) 进行数据库查询,返回结果集
int executeUpdate(String sql) 进行数据库更新
Connection getConnection() 获取对数据库的连接
int getFetchDirection() 获取从数据库表中获取行数据的方向
int getFetchSize() 获取返回的数据库结果集行数
int getMaxFieldSize() 获取返回的数据库结果集最大字段数
int getMaxRows() 获取返回的数据库结果集最大行数
boolean getMoreResults() 获取Statement的下一个结果
int getQueryTimeout() 获取查询超时设置
ResultSet getResultSet() 获取结果集
int getUpdateCount() 获取更新记录的数量
void setCursorName(String name) 设置数据库Cursor的名称
void setFetchDirection(int dir) 设置数据库表中获取行数据的方向
void setFetchSize(int rows) 设置返回的数据库结果集行数
void setMaxFieldSize(int max) 设置最大字段数
void setMaxRows(int max) 设置最大行数
void setQueryTimeout(int seconds)设置查询超时时间


值得注意的是,Statement 接口提供了3种执行SQL语句的方法:executeQueryexecuteUpdateexecute。使用哪一个方法由SQL语句所产生的内容决定。executeQuery方法用于产生单个结果集的SQL语句,如SELECT语句。executeUpdate方法用于执行INSERTUPDATEDELETEDDL(数据定义语言)语句,例如CREATE TABLE DROP TABLEexecuteUpdate 的返回值是一个整数,表示它执行的SQL语句所影响的数据库中的表的行数(更新计数)。execute 方法用于执行返回多个结果集或多个更新计数的语句。

PreparedStatement接口继承了Statement接口,但PreparedStatement语句中包含了经过预编译的SQL语句,因此可以获得更高的执行效率。在PreparedStatement语句中可以包含多个用""代表的字段,在程序中可以利用setXXX方法设置该字段的内容,从而增强了程序设计的动态性。PreparedStatement接口的主要成员方法及其含义如表13-5所示。



表13-5 PreparedStatement接口的主要成员方法及其含义
方 法 含 义
void addBatch(String sql) 在Statement语句中增加用于数据库操作的SQL批处理语句
void clearparameters () 清除PreparedStatement中的设置参数
ResultSet executeQuery(String sql) 执行SQL查询语句
ResultSetMetaData getMetaData() 进行数据库查询,获取数据库元数据
void setArray(int index,Array x) 设置为数组类型
void setAsciiStream(int index,InputStream stream,int length)设置为ASCII输入流
void setBigDecimal(int index,BigDecimal x) 设置为十进制长类型
void setBinaryStream
(int index,InputStream stream,int length) 设置为二进制输入流
void setCharacterStream
(int index,InputStream stream,int length) 设置为字符输入流
void setBoolean(int index, boolean x) 设置为逻辑类型
void setByte(int index,byte b) 设置为字节类型
void setBytes(int byte[] b) 设置为字节数组类型
void setDate(int index,Date x) 设置为日期类型
void setFloat(int index,float x) 设置为浮点类型
void setInt(int index,int x) 设置为整数类型
void setLong(int index,long x) 设置为长整数类型
void setRef(int index,int ref) 设置为引用类型
void setShort(int index,short x) 设置为短整数类型
void setString(int index,String x) 设置为字符串类型
void setTime(int index,Time x) 设置为时间类型


PreparedStatementStatement的区别在于它构造的SQL语句不是完整的语句,而需要在程序中进行动态设置。这一方面增强了程序设计的灵活性;另一方面,由于PreparedStatement语句是经过预编译的,因此它构造的SQL语句的执行效率比较高。所以对于某些使用频繁的SQL语句,用PreparedStatement语句比用Statement具有明显的优势。

PreparedStatement对象的创建方法如下:
PreparedStatement pstmt = con.prepareStatement("update tbl_User set reward = ? where userId = ?");

在该语句中,包括两个可以进行动态设置的字段:rewarduserId

例如,我们想给第一个注册的用户5000点奖励,则可以用下面的方法设置空字段的内容:



pstmt.setInt(1, 5000);
pstmt. setInt (2, 1);


如果我们想给前50个注册的用户每人5000点奖励,则可以用循环语句对空字段进行设置:



pstmt.setInt(1, 5000);
for (int i = 0; i < 50; i++)
{
pstmt.setInt(2,i);
int rowCount = pstmt.executeUpdate();
}


如果传递的数据量很大,则可以通过将 IN 参数设置为 Java 输入流来完成。当语句执行时,JDBC驱动程序将重复调用该输入流,读取其内容并将它们当做实际参数数据传输。JDBC 提供了3种将IN参数设置为输入流的方法:setBinaryStream用于含有未说明字节的流;setAsciiStream用于含有ASCII字符的流;setUnicodeStream用于含有Unicode字符的流。这些方法比其他的setXXX方法要多一个用于指定流的总长度的参数,因为一些数据库在发送数据之前需要知道它传送的数据的大小。

下面是一个使用流作为 IN 参数发送文件内容的例子:



java.io.File file = new java.io.File("/tmp/data");
int fileLength = file.length();
java.io.InputStream fin = new java.io.FileInputStream(file);
java.sql.PreparedStatement pstmt = con.prepareStatement(
"update table set stuff = ? where index = 4");
pstmt.setBinaryStream (1, fin, fileLength);
pstmt.executeUpdate();


当语句执行时,将反复调用输入流 fin 以传递其数据。

CallableStatement 对象用于执行对数据库已存储过程的调用。在CallableStatement对象中,有一个通用的成员方法call,这个方法用于以名称的方式调用数据库中的存储过程。在数据库调用过程中,可以通过设置IN参数向调用的存储过程提供执行所需的参数。另外,在存储过程的调用中,通过OUT参数获取存储过程的执行结果。

CallableStatement 接口的主要成员方法及其含义如表13-6所示。



表13-6 CallableStatement 接口的主要成员方法及其含义
方 法 含 义
Array getArray(int I) 获取数组
BigDecimal getBigDecimal(int index)
BigDecimal getBigDecimal(int index,int scale) 获取十进制小数
boolean getBoolean(int index) 获取逻辑类型
byte getByte(int index) 获取字节类型
Date getDate(int index)Date getDate
(int index,Calendar cal) 获取日期类型
double getDouble(int index) 获取日期类型双精度类型
float getFloat(int index) 获取日期类型浮点类型
int getint(int index) 获取日期类型整数类型
long getLong(int index) 获取日期类型长整数类型
Object getObject(int index)
Object getObject(int index,Map map) 获取对象类型
Ref getRef(int I) 获取日期类型Ref类型
short getShort(int index) 获取日期类型短整数类型
String getString(int index) 获取日期类型字符串类型
Time getTime(int index) Time
getTime(int index,Calendar cal) 获取时间类型
void registerOutputParameter(int index)
void registerOutputParameter(int index,int type)
void registerOutputParameter
(int index,int type,int scale) 注册输出参数
调用存储过程的语法为:
{call procedure_name} // 过程不需要参数
{call procedure_name[(?,?,?,...)]} // 过程需要若干个参数
{? = call procedure_name[(?,?,?,...)]} //过程需要若干个参数并返回一个参数


其中procedure_name为存储过程的名字,方括号中的内容是可选的多个用于存储过程执行的参数。CallableStatement 对象的创建方法如下:
CallableStatement cstmt = con.prepareCall("{call getData(?, ?)}");

向存储过程传递执行需要参数的方法是通过setXXX语句完成的。例如,我们可以将两个参数设置如下:



cstmt.setByte(1, 25);
cstmt.setInt(2,64.85);


如果需要存储过程返回运行结果,则需要调用registerOutParameter方法设置存储过程的输出参数,然后调用getXXX方法来获取存储过程的执行结果。例如:



cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.registerOutParameter(1, java.sql.Types. INTEGER);
cstmt.executeUpdate();
byte a = cstmt.getByte(1);
int b = cstmt.getInt(2);


从上面的程序可以看出,Java的基本数据类型和SQL中支持的数据类型有一定的对应关系。这种对应关系如表13-7所示。



表13-7 SQL的数据类型与Java数据类型的对应关系
SQL数据类型 Java数据类型
CHAR String
VARCHAR String
LONGVARCHAR String
NUMERIC java.math.BigDecimal
DECIMAL java.math.BigDecimal
BIT boolean
TINYINT byte
SMALLINT short
INTEGER int
BIGINT long
REAL float
FLOAT double
DOUBLE double
BINARY byte[]
VARBINARY byte[]
LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp


ResultSet

结果集(ResultSet)用来暂时存放数据库查询操作获得的结果。它包含了符合 SQL 语句中条件的所有行,并且它提供了一套 get 方法对这些行中的数据进行访问。ResultSet类的主要成员方法及其含义如表13-8所示。



表13-8 ResultSet类的主要成员方法及其含义
方 法 含 义
boolean absolute(int row) 将指针移动到结果集对象的某一行
void afterLast() 将指针移动到结果集对象的末尾
void beforeFirst() 将指针移动到结果集对象的头部
boolean first() 将指针移动到结果集对象的第一行
Array getArray(int row) 获取结果集中的某一行并将其存入一个数组
boolean getBoolean(int columnIndex) 获取当前行中某一列的值,返回一个布尔型值
byte getByte(int columnIndex) 获取当前行中某一列的值,返回一个字节型值
short getShort(int columnIndex) 获取当前行中某一列的值,返回一个短整型值
int getInt(int columnIndex) 获取当前行中某一列的值,返回一个整型值
long getLong(int columnIndex) 获取当前行中某一列的值,返回一个长整型值
double getDouble(int columnIndex) 获取当前行中某一列的值,返回一个双精度型值
float getFloat(int columnIndex) 获取当前行中某一列的值,返回一个浮点型值
String getString(int columnIndex) 获取当前行中某一列的值,返回一个字符串
Date getDate(int columnIndex) 获取当前行中某一列的值,返回一个日期型值
Object getObject(int columnIndex) 获取当前行中某一列的值,返回一个对象
Statement getStatement() 获得产生该结果集的Statement对象
URL getURL(int columnIndex) 获取当前行中某一列的值,返回一个java.net.URL型值
boolean isBeforeFirst() 判断指针是否在结果集的头部
boolean isAfterLast() 判断指针是否在结果集的末尾
boolean isFirst() 判断指针是否在结果集的第一行
boolean isLast() 判断指针是否在结果集的最后一行
boolean last() 将指针移动到结果集的最后一行
boolean next() 将指针移动到当前行的下一行
boolean previous() 将指针移动到当前行的前一行



从表13-8中可以看出,ResultSet类不仅提供了一套用于访问数据的get方法,还提供了很多移动指针(cursor,有时也译为光标)的方法。cursorResultSet 维护的指向当前数据行的指针。最初它位于第一行之前,因此第一次访问结果集时通常调用 next方法将指针置于第一行上,使它成为当前行。随后每次调用 next 指针向下移动一行。(

分享到:
评论

相关推荐

    数据库-数据库编码解决方案

    首先我们设计Connection接口的代理类_Connection,这个代理类接管了Connection接口中所有可能获取到Statement或者PreparedStatement接口实例的方法,例如:prepareStatement和createStatement。改变这两个方法使之...

    Java数据库接口JDBC介绍

    2.1.1 DriverManager.getConnection方法 3 2.1.2 URL说明 3 2.1.3 JDBC URL 3 2.1.4 odbc子协议 4 2.1.5 发送 5 2.1.6 事务隔离级别 5 2.2 DriverManager类 6 2.2.1 跟踪可用驱动程序 6 2.2.2 建立连接 7 2.3 ...

    西安交大JAVA 基础讲义

    1.详细讲述了JAVA环境变量的配置和说明 2.透彻的介绍了类,对象的概念 3.对JAVA的多态,继承,封装做了比较详细的介绍 ...9.使用JDBC,ODBC连接数据库,介绍了Connection,Statement ,ResultSet的使用方法和注意事项。

    JDBCFacade模式的运用

    JDBC访问数据库需要用到一些相关的类和接口,主要有数据库的jdbc驱动程序,DriverManager,Connection, Statement, ResultSet,SQLException等。为了将这些复杂的细节与数据库应用程序的设计者隔离开,请设计一个...

    计算机程序设计(Java)-教案--单元十--数据库编程技术.docx.docx

    /调用close()方法关闭ResultSet&gt;Statement和Connection对象,释放系统资源。 【实例10.2:实现数据库的查询操作】 【实例10-3:实现数据库的插入操作】 【实例10-4:实现数据库的修改操作】 【实例10-5:实现数据库的...

    数据库工具类DatabaseUtil.java

    * 返回记录总数, 使用方法: getAllCount("SELECT count(ID) from tableName") 2004-06-09 * 可滚动的 Statement 不能执行 SELECT MAX(ID) 之类的查询语句(SQLServer 2000) * * @param sql * 需要执行的 SQL *...

    JDBC笔记 JDBC笔记

    这个包中的类和接口主要针对基本的数据库编程服务,如生成连接、执行语句以及准备语句和运行批处理查询等。同时也有一些高级的处理,比如批处理更新、事务隔离和可滚动结果集等。 ② javax.sql 扩展功能。它主要为...

    5 JDBC的使用

    编写Java代码,熟悉并掌握JDBC的使用,包括Connection、Statement、ResultSet等对象的使用。了解JDBC访问数据库的方法。

    JDBC详解HTML-JDBC.pp

    1、JDBC(Java Database Connection):java连接数据库统一接口API,底层主要通过直接的JDBC驱动和 JDBC-ODBC桥驱动实现与数据库的连接。 1&gt;.JDBC驱动程序类型: &lt;1&gt;.JDBC-ODBC桥加ODBC驱动程序:需要ODBC驱动,适合...

    spring-boot-data-source-decorator:与p6spy,datasource-proxy,flexy-pool和spring-cloud-sleuth集成的Spring Boot

    增加了拦截和记录sql查询的功能,包括拦截大多数Connection , Statement和ResultSet方法调用 -增加了拦截所有查询以及Connection , Statement和ResultSet方法调用的功能 添加连接池指标(jmx,codahale,...

    JDBC访问数据库的步骤

    6. (1)应用Statement接口 获取Statement对象,通过Statement对象执行SQL语句: Statement stmt=con.createStatement(); 执行SQL查询,返回给结果集对象: ResultSet rs=stmt. executeQuery(“select * from 表名...

    mysql-connector-java-5.1.46-bin

    2.建立连接 使用connection对象的getConnection方法   url(jdbc:oracle:thin:@ip:端口:数据库sid),  user,password,如果要手动提交,调用conn.setAutoCommit(false) 3.创建statement对象 一个statement对象只能...

    Java数据库编程宝典2

    第14章 使用Blob和Clob管理图像和文档 14.1 大对象 14.1.1 使用Blob存储二进制数据 14.1.2 使用Clob存储文本数据 14.2 从浏览器上载图像或文档 14.2.1 用于从DBMS下载大对象的servlet 14.3 小结 第15章 ...

    Java数据库编程宝典4

    第14章 使用Blob和Clob管理图像和文档 14.1 大对象 14.1.1 使用Blob存储二进制数据 14.1.2 使用Clob存储文本数据 14.2 从浏览器上载图像或文档 14.2.1 用于从DBMS下载大对象的servlet 14.3 小结 第15章 ...

    Java数据库编程宝典1

    第14章 使用Blob和Clob管理图像和文档 14.1 大对象 14.1.1 使用Blob存储二进制数据 14.1.2 使用Clob存储文本数据 14.2 从浏览器上载图像或文档 14.2.1 用于从DBMS下载大对象的servlet 14.3 小结 第15章 ...

    Java数据库编程宝典3

    第14章 使用Blob和Clob管理图像和文档 14.1 大对象 14.1.1 使用Blob存储二进制数据 14.1.2 使用Clob存储文本数据 14.2 从浏览器上载图像或文档 14.2.1 用于从DBMS下载大对象的servlet 14.3 小结 第15章 ...

    JSP分页(技术)代码

    目前比较广泛使用的分页方式是将查询结果缓存在HttpSession或有状态bean中,翻页的时候从缓存中取出一页...因为ResultSet在Statement或Connection关闭时也会被关闭,如果要使ResultSet有效势必长时间占用数据库连接。

    JSP分页技术实现.mht

    目前比较广泛使用的分页方式是将查询结果缓存在HttpSession或有状态bean中,翻页的时候从缓存中取出一页...因为ResultSet在Statement或Connection关闭时也会被关闭,如果要使ResultSet有效势必长时间占用数据库连接。

    Java WEB访问数据库

    在使用statement获取jdbc访问时所具有的一个共通的问题是输入适当格式的日期和时间戳:2002-02-05 20:56 或者 02/05/02 8:56 pm。 通过使用java.sql.preparedstatement,这个问题可以自动解决。一个...

    JAVA连接ORACLE数据库方法及测试

    /* 通过DriverManager的getConnection()方法获取数据库连接 */ conn = DriverManager.getConnection(url, user, password); } catch (Exception ex) { System.out.println("数据库连接出错"); } ...

Global site tag (gtag.js) - Google Analytics