ResultSet相关ResultSetMetaData详细

ResultSet相关ResultSetMetaData详细

DatabaseMetaData 有关整个数据库的信息:表名、表的索引、数据库产品的名称和版本、数据库支持的操作。

ResultSet 关于某个表的信息或一个查询的结果。您必须逐行访问数据行,但是您可以任何顺序访问列。

ResultSetMetaData 有关 ResultSet 中列的名称和类型的信息。

尽管每个对象都有大量的方法让您获得数据库元素的极为详细的信息,但在每个对象中都有几种主要的方法使您可获得数据的最重要信息。然而,如果您希望看到比此处更多的信息,建议您学习文档以获得其余方法的说明。

ResultSet

ResultSet 对象是 JDBC 中最重要的单个对象。从本质上讲,它是对一个一般宽度和未知长度的表的一种抽象。几乎所有的方法和查询都将数据作为 ResultSet 返回。ResultSet 包含任意数量的命名列,您可以按名称访问这些列。它还包含一个或多个行,您可以按顺序自上而下逐一访问。在您使用 ResultSet 之前,必须查询它包含多少个列。此信息存储在 ResultSetMetaData 对象中。

//从元数据中获得列数 
ResultSetMetaData rsmd; 
rsmd = results.getMetaData(); 
numCols = rsmd.getColumnCount();

当您获得一个 ResultSet 时,它正好指向第一行之前的位置。您可以使用 next() 方法得到其他每一行,当没有更多行时,该方法会返回 false。由于从数据库中获取数据可能会导致错误,您必须始终将结果集处理语句包括在一个 try 块中。

您可以多种形式获取 ResultSet 中的数据,这取决于每个列中存储的数据类型。另外,您可以按列序号或列名获取列的内容。请注意,列序号从 1 开始,而不是从 0 开始。ResultSet 对象的一些最常用方法如下所示。

getInt(int); 将序号为 int 的列的内容作为整数返回。

getInt(String); 将名称为 String 的列的内容作为整数返回。

getFloat(int); 将序号为 int 的列的内容作为一个 float 型数返回。

getFloat(String); 将名称为 String 的列的内容作为 float 型数返回。

getDate(int); 将序号为 int 的列的内容作为日期返回。

getDate(String); 将名称为 String 的列的内容作为日期返回。

next(); 将行指针移到下一行。如果没有剩余行,则返回 false。

Close(); 关闭结果集。

getMetaData(); 返回 ResultSetMetaData 对象。

ResultSetMetaData

您使用 getMetaData() 方法从 ResultSet 中获取 ResultSetMetaData 对象。您可以使用此对象获得列的数目和类型以及每一列的名称。

getColumnCount(); 返回 ResultSet 中的列数。 
getColumnName(int); 返回列序号为 int 的列名。 
getColumnLabel(int); 返回此列暗含的标签。 
isCurrency(int); 如果此列包含带有货币单位的一个数字,则返回 true。 
isReadOnly(int); 如果此列为只读,则返回 true。 
isAutoIncrement(int); 如果此列自动递增,则返回 true。这类列通常为键,而且始终是只读的。 
getColumnType(int); 返回此列的 SQL 数据类型。这些数据类型包括

BIGINT 
BINARY 
BIT 
CHAR 
DATE 
DECIMAL 
DOUBLE 
FLOAT 
INTEGER 
LONGVARBINARY 
LONGVARCHAR 
NULL 
NUMERIC 
OTHER 
REAL 
SMALLINT 
TIME 
TIMESTAMP 
TINYINT 
VARBINARY 
VARCHAR

DatabaseMetaData

DatabaseMetaData 对象可为您提供整个数据库的信息。您主要用它获取数据库中表的名称,以及表中列的名称。由于不同的数据库支持不同的 SQL 变体,因此,也有多种方法查询数据库支持哪些 SQL 方法。

getCatalogs() 返回该数据库中的信息目录列表。使用 JDBC-ODBC Bridge 驱动程序,您可以获得用 ODBC 注册的数据库列表。这很少用于 JDBC-ODBC 数据库。

getTables(catalog, schema,tableNames, columnNames) 返回表名与 tableNames 相符而且列名与 columnNames 相符的所有表的说明。

getColumns(catalog, schema,tableNames, columnNames) 返回表名与 tableNames 相符而且列名与 columnNames 相符的所有表列说明。

getURL(); 获得您所连接的 URL 名称。

getDriverName(); 获得您所连接的数据库驱动程序的名称。

获取有关表的信息

您可以使用 DataBaseMetaData 的 getTables() 方法来获取数据库中表的信息。这个方法有如下4个 String 参数:

results =dma.getTables(catalog, schema, tablemask, types[]);

其中参数的意义是:

Catalog 要在其中查找表名的目录名。对于 JDBC-ODBC 数据库以及许多其他数据库而言,可将其设置为 null。这些数据库的目录项实际上是它在文件系统中的绝对路径名称。

Schema 要包括的数据库“方案”。许多数据库不支持方案,而对另一些数据库而言,它代表数据库所有者的用户名。一般将它设置为 null。

Tablemask 一个掩码,用来描述您要检索的表的名称。如果您希望检索所有表名,则将其设为通配符 %。请注意,SQL 中的通配符是 % 符号,而不是一般 PC 用户的 * 符号。

types[] 这是描述您要检索的表的类型的 String 数组。数据库中通常包括许多用于内部处理的表,而对作为用户的您没什么价值。如果它是空值,则您会得到所有这些表。如果您将其设为包含字符串“TABLES”的单元素数组,您将仅获得对用户有用的表格。

一个简单的 JDBC 程序

我们已经学习了 JDBC 的所有基本功能,现在我们可以编写一个简单的程序,该程序打开数据库,打印它的表名以及某一表列的内容,然后对该数据库执行查询。此程序如下所示:

package skydevkit; 
import java.sql.*; 
public class JdbcOdbc_test { 
ResultSet results; 
ResultSetMetaData rsmd; 
DatabaseMetaData dma; 
Connection con;

public JdbcOdbc_test() throws SQLException { 
String url = "jdbc:odbc:Northwind"; 
try { 
//加载 JDBC-ODBC 桥驱动程序 
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
con = DriverManager.getConnection(url);//连接数据库 
dma = con.getMetaData();//获取数据库的元数据 
System.out.println("Connected to:" + dma.getURL()); 
System.out.println("Driver " + dma.getDriverName()); 
} catch (Exception e) { 
System.out.println(e); 

try { 
Statement stmt = con.createStatement(); 
results = stmt.executeQuery("select * from 客户;"); 
ResultSetMetaData resultMetaData = results.getMetaData(); 
int cols = resultMetaData.getColumnCount(); 
String resultRow = ""; 
for (int i = 1; i < cols; i++) { 
resultRow += resultMetaData.getColumnName(i) + ";"; 

System.out.println(resultRow); 
while (results.next()) { 
resultRow = ""; 
for (int i = 1; i < cols; i++) { 
try { 
resultRow += results.getString(i) + ";"; 
} catch (NullPointerException e) { 
System.out.println(e.getMessage()); 


System.out.println(resultRow); 

} catch (Exception e) { 
System.out.println("query exception"); 
} finally { 
results.close(); 


}

补充高级内容

关于调用SQLServer存储过程的例子:(用到了我们开发的数据库连接类)

CREATE PROCEDURE [dbo].[sp_getStudentByName](@name char(10)) 
AS 
Select * from Students where [Name][email protected] 
GO

DbObject DbO = new DbObject(new SqlServerConnectionFactory("localhost", 
1433, "demo", "sa", "")); 
Connection con = DbO.getConnection(); 
CallableStatement pstmt = null; 
System.out.println("TestDB1()............"); 
/* try { 
pstmt = con.prepareCall("{call sp_getStudentById(?)}"); 
pstmt.setInt(1, 1); 
}*/ 
try { 
pstmt = con.prepareCall("{call sp_getStudentByName(?)}"); //注意参数如何传递 
pstmt.setString(1, "Tom"); 

……

使用输出参数:

CREATE PROCEDURE [dbo].[sp_insertStudent](@name char(10),@age int,@id int OUTPUT) AS 
insert into Students([Name],[Age]) values (@name,@age) 
select @[email protected]@IDENTITY 
GO

try { 
pstmt = con.prepareCall("{call sp_insertStudent(?,?,?)}"); 
pstmt.setString(1, "zengqingsong"); 
pstmt.setInt(2, 22);

pstmt.registerOutParameter(3, Types.INTEGER); 
pstmt.executeUpdate();

int id = pstmt.getInt(3); 
System.out.println(id); 
}

使用返回参数的例子:

CREATE PROCEDURE [dbo].[sp_insertStudent](@name char(10),@age int,@id int OUTPUT) AS 
insert into Students([Name],[Age]) values (@name,@age) 
select @[email protected]@IDENTITY –测试输出参数 
return 30 –测试返回30 
GO

try { 
pstmt = con.prepareCall("{?=call sp_insertStudent(?,?,?)}"); 
pstmt.setString(2, "zengqingsong"); 
pstmt.setInt(3, 22);

pstmt.registerOutParameter(4, Types.INTEGER); 
pstmt.registerOutParameter(1, Types.INTEGER); 
int ret = pstmt.executeUpdate(); //执行影响的行数

int ret2 = pstmt.getInt(1); //返回参数(输出参数) 
int id = pstmt.getInt(4); //输出参数 
System.out.println(ret); 
System.out.println(ret2); 
System.out.println(id);

时间: 2024-12-25 21:41:39

ResultSet相关ResultSetMetaData详细的相关文章

Nginx服务器处理相关图片详细方法

Nginx服务器在进行图片处理时,会有有不少的问题.说到访问权限控制,很多看了Nginx相关文章的朋友都会自然联想到X-Accel-Redirect这个头.这个头有个缺陷,就是所有的访问都会先经过一个fastcgi来判断权限. 在下载系统上,用这个方法是非常合适的,但是在访问量非常大的图片服务器,单单用这个方法会使大量无需权限判定的图片也经过一个fastcgi处理,多此一举并且无端耗费大量的资源.虽然X-Accel-Redirect是一个新的方案,但是并不代表它能很好的解决所有问题,同时也不妨碍

AndroidStudio导入项目到VisualSVN Server并忽略(ignore)相关文件详细步骤

当你提交代码的时候,如果出现各种你不想提交的文件的时候,你也许会选择在项目左边栏选中java–>src来进行提交,这样操作是没有问题,但是如果你想使用快捷提交的图标进行提交的话,就会很蛋疼了. 如图就是此图标: 花了一中午时间借助VisualSVN Server 工具,终于实现了点击快捷提交图标出现如图的效果(很干净,只看到我想要看到的东西): 步骤如下: 1.下载VisualSVN Server https://www.visualsvn.com/ 2.安装VisualSVN Server ,

ResultSetMetaData和ResultSet

我现在有一张表t_product;我们查询所有的商品:SELECT * FROM t_product; 上述所有的数据都可以封装成一个对象,我们称这个查询出来的对象为结果集对象:ResultSet. 对于Java实现查询来说,sql语句是不同的,比如select * from t_product;或者select * from t_product where id=? and name=?;等等.?的个数是不同的,而且不可控制的,结果集合又是不一样的:那么我们如何实现呢?在这里我给出两中实现方案

ResultSet转成java类对象

在做web开发时遇到一个事情: 需要从mysql数据表中查询数据并遍历查询结果 这样最简单的方式是:查询到结果根据表中字段列表的顺序来一个个获取字段,但这样需要记住字段的顺序,操作起来不是那么方便.因此便想可不可以把查询结果 ResultSet转化成java的实例对象,然后利用类对象的get方法,这样会方便清晰很多. 查了下,有很多可以参考,于是参考着有了自己的代码,如下: 1.mapper函数: package com.alibaba.search.offline.oddiff.service

如何把ResultSet转换成Java对象

有时候我们不想使用任何框架,但又需要用JDBC实现类似于iBATIS的orm映射功能,把一个ResultSet转换成我们的JavaBeans,我们可以模仿iBATIS的方式自己写一个ResultSetMapper实现类,利用反射原理把ResultSet转换成一个JavaBeans,下面是网上的一个开源实现,主要用到的是注解和反射机制,我们先看一下使用效果: package com.heaven.mapper; import java.sql.Connection; import java.sql

【python】内存相关

1.  /proc/pid/status 可以查看进程相关的详细信息,当内存异常时可查看 参考:http://blog.csdn.net/beckdon/article/details/48491909 2. top -p 进程号 实时查看进程相关内存 3. 内存调试 参考:http://blog.csdn.net/ybdesire/article/details/73128353 memory_profiler  查看函数中各行代码的内存增长 guppy  查看python对象占用的堆内存大小

投资、投机、经济周期相关22本书,其中好书10本半

最近几年看过评过的投资.投机.经济周期相关的22本书,其中好书有10本半:5星1本,4星9本,3.5星1本.<涛动周期论>是新增的. 5星|<穷查理宝典>:智者语录,当代<论语> 本书名气非常大,并且其中的内容时不时有人提起,因此我判断是名实相符的名著.买了纸书好几年了,最近买了电子版对着看. 内容比较多,实质性的内容接近语录体,全书没有特别完整的理论体系,而是芒格对市场.社会.人生的观点的汇集. 具体内容我认为非常不错,是一位智者的人生经验与感悟.我评5星. kind

投资、投机、经济周期相关24本书,其中好书11本半

最近几年看过评过的投资.投机.经济周期相关的24本书,其中好书有10本半:5星1本,4星10本,3.5星1本.新增<清华韩秀云讲经济>. 5星|<穷查理宝典>:智者语录,当代<论语> 本书名气非常大,并且其中的内容时不时有人提起,因此我判断是名实相符的名著.买了纸书好几年了,最近买了电子版对着看. 内容比较多,实质性的内容接近语录体,全书没有特别完整的理论体系,而是芒格对市场.社会.人生的观点的汇集. 具体内容我认为非常不错,是一位智者的人生经验与感悟.我评5星. ki

【超详细】一文学会链表解题

前言 如果说数据结构是算法的基础,那么数组和链表就是数据结构的基础. 因为像堆,栈,对,图等比较复杂的数组结基本上都可以由数组和链表来表示,所以掌握数组和链表的基本操作十分重要. 今天就来看看链表的基本操作及其在面试中的常见解题思路,本文将从以下几个点来讲解链表的核心知识 什么是链表,链表的优缺点 链表的表示及基本操作 面试中链表的常见解题思路---翻转 面试中链表的常见解题思路---快慢指针 什么是链表 相信大家已经开始迫不及待地想用链表解题了,不过在开始之前我们还是要先来温习下链表的定义,以