您的位置:首页 > 数据库

jdbc基础3--翻译sun官方教程

2006-03-22 18:41 387 查看
元数据

元数据是记录了数据的信息.JDBC允许程序通过元数据的class取得数据库(Database)和得到的结果集(ResultSet)的信息

数据库元数据(Database Metadata)

为了取道数据库的信息,JDBC必须先获得一个DatabaseMetaData对象.当程序建立了一个有效的连接,
那么就可以通过下面的代码来获取元数据对象
DatabaseMetaData dbmd=con.getMetaData();

正如指出的那样这样做的好处是,你可以调用方法(methods)去获取需要的信息,但是不幸的是
   在DatabaseMetaData类中有150多种方法,要清晰的掌握他们并非易事.还好你可以通过查找
   API文档来获取帮助.
   大多数的方法返回的是结果集(ResultSets),程序员必须逐步的去获取指定的信息.
   诸如获取数据库和表信息的这些方法,使用了比较混乱的名字模式,因为在特定的数据
   库中,这些信息的名字可能是大写的小写的或者大小写混用的,但是模式却是大小写敏感的.
   所以就导致我们在用方法获取数据库信息之前先要对了解一下存储在数据库中的信息.

尽管这是令人气馁的,但是大多数据的基本信息诸如数据库名字,驱动名字,版本,
最大连接数,等还是可以容易的获取的.大多程序不一定会用到这些信息.注意的是
可能有些数据库可能不提供获取这些信息的方法,所以需要调用方法后检查返回的对象是否为null,或者空字符串.

结果集元数据(ResultSet Metadata)
为了获取得到的结果集的信息,那么必须先获取一个ResultSetMetaData对象.如果得到
了一个有效的ResultSet那么可以通过下面的代码来获得元数据

ResultSetMetaData rsmd=rs.getMetaData();

与DatabaseMetaData比起来ResultSetMetaData比较好掌握,它仅有大约25种方法,
通过使用ResultSetMetaData,应用程序可以获取返回结果中列(columns)的数目,单个列
建议显示的大小,列名,列的类型等等.注意的是可能有些数据库可能不提供获取这些信息的方法,
所以需要调用方法后检查返回的对象是否为null,或者空字符串.

存储过程
元数据的支持
关于存储过程的DatabaseMetaData的方法

supportsStoreProcedure()检查数据库管理系统是否支持JDBC标准的存储过程
getProcedures()返回可用的存储过程的列表.
getProcedureColumns()返回结果和参数
getProcedureTerm().该方法的功能是获取数据库厂商对存储过程 的特定称呼(term)

输入输出参数(Parameter Ins and outs)
存储过程可以接受0或者多个参数,这就是输入参数.也可以返回一个数据集,
或者更新的数目数,结果,或者0或多个参数.另外还可以有INOUt类型的参数
,表示该参数既是传递变量也是输出变量.

CallableStatement
执行存储过程,可以通过CallableStatement,它继承了PrepareStatement.

    * 输入参数用setXXX()方法继承自PreparedStatement.
    * 输出参数必须先注册,使用CallableStatement.registerOutParameter()方法
    * 输入输出参数必须同时set和 registered.

A -

CallableStatement cstmt =
   con.prepareCall( "{ call sp_A }" );

无返回值可以用

cstmt.execute(); // 也可以用 executeUpdate()

返回结果集

ResultSet rs = cstmt.executeQuery();

返回更新数目

int iUC = cstmt.executeUpdate();

B -

CallableStatement cstmt =
   con.prepareCall( "{ ? = call sp_B( ? ) }" );

//注册输出参数
cstmt.registerOutParameter( 1, Types.INTEGER );
//设置输入参数
cstmt.setString( 2, "M-O-O-N" );

cstmt.execute(); // could use executeUpdate()

int iRP = cstmt.getInt( 1 );

C -

CallableStatement cstmt =
   con.prepareCall( "{ call sp_C( ? ? ? ) }" );

Setup:

// set int IN parameter
cstmt.setInt( 1, 333 );

// register int OUT parameter
cstmt.registerOutParameter( 2, Types.INTEGER );

// set int INOUT parameter
cstmt.setInt( 3, 666 );
// register int INOUT parameter
cstmt.registerOutParameter( 3, Types.INTEGER );

For no return ( other than OUT and INOUT: )

cstmt.execute(); // could use executeUpdate()

// get int OUT and INOUT
int iOUT = cstmt.getInt( 2 );
int iINOUT = cstmt.getInt( 3 );

For returned ResultSet:

ResultSet rs = cstmt.executeQuery();

// get int OUT and INOUT
int iOUT = cstmt.getInt( 2 );
int iINOUT = cstmt.getInt( 3 );

For returned update count:

int iUC = cstmt.executeUpdate();

// get int OUT and INOUT
int iOUT = cstmt.getInt( 2 );
int iINOUT = cstmt.getInt( 3 );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息