欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java回顾之JDBC(1)(2)

来源: javaer 分享于  点击 10194 次 点评:54

如何调用存储过程

存储过程是做数据库开发时经常使用的技术,它可以通过节省编译时间的方式来提升系统性能,我们这里的示例使用MySQL数据库。

如何调用不带参数的存储过程

假设我们现在有一个简单的存储过程,它只是返回user表中的所有记录,存储过程如下:

  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `GetUser`() 
  2. BEGIN 
  3. select ID,NAME from user
  4. END 

我们可以使用CallableStatement来调用存储过程:

调用存储过程示例一

它的执行结果如下:

ID:1; NAME=Zhang San ID:2; NAME=TEST

如何调用带参数的存储过程

MySQL的存储过程中的参数分为三种:in/out/inout,我们可以把in看做入力参数,out看做出力参数,JDBC对这两种类型的参数设置方式不同:

1)in, JDBC使用类似于cst.set(1, 10)的方式来设置

2)out,JDBC使用类似于cst.registerOutParameter(2, Types.VARCHAR);的方式来设置

我们来看一个in参数的示例,假设我们希望返回ID为特定值的user信息,存储过程如下:

  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `GetUserByID`(in id int
  2. BEGIN 
  3. set @sqlstr=concat('select * from user where ID=', id); 
  4. prepare psmt from @sqlstr; 
  5. execute psmt; 
  6. END 

Java的调用代码如下:

JDBC调用存储过程示例二

我们执行下面的语句:

execStoredProcedureTest2(1);

结果如下:

ID:1; NAME=Zhang San

对于out类型的参数,调用方式类似,不再赘述。

获取数据库以及结果集的metadata信息

在JDBC中,我们不仅能够对数据进行操作,我们还能获取数据库以及结果集的元数据信息,例如数据库的名称、驱动信息、表信息;结果集的列信息等。

获取数据库的metadata信息

我们可以通过connection.getMetaData方法来获取数据库的元数据信息,它的类型是DatabaseMetaData。

获取数据库的元数据信息

这里我们使用的数据库是MySQL中自带的默认数据库:mysql,它会记录整个数据库服务器中的一些信息。上述代码执行结果如下:

数据库:MySQL 5.5.28 驱动程序:MySQL-AB JDBC Driver mysql-connector-java-5.0.4 ( $Date: 2006-10-19 17:47:48 +0200 (Thu, 19 Oct 2006) $, $Revision: 5908 $ ) |表名称                      |表类别      |表类型      |表模式      |
|columns_priv                 |mysql     |TABLE     |null      |
|db                           |mysql     |TABLE     |null      |
|event                        |mysql     |TABLE     |null      |
|func                         |mysql     |TABLE     |null      | 。。。

由于mysql中表比较多,上述结果只截取了一部分。

获取结果集的元数据信息

我们可以通过使用resultset.getMetaData方法来获取结果集的元数据信息,它的类型是ResultSetMetaData。

获取结果集的元数据信息

它的执行结果如下:

Column Name:ID; Column Type:INTEGER UNSIGNED Column Name:NAME; Column Type:VARCHAR

可以看到,它返回类结果集中每一列的名称和类型。

基于ResultSet的操作

当我们需要对数据库进行修改时,除了上述通过Statement完成操作外,我们也可以借助ResultSet来完成。

需要注意的是,在这种情况下,我们定义Statement时,需要添加参数。

Statement构造函数可以包含3个参数:

  • resultSetType,它的取值包括:ResultSet.TYPE_FORWARD_ONLYResultSet.TYPE_SCROLL_INSENSITIVEResultSet.TYPE_SCROLL_SENSITIVE,默认情况下,该参数的值是ResultSet.TYPE_FORWARD_ONLY
  • resultSetConcurrency,它的取值包括:ResultSet.CONCUR_READ_ONLYResultSet.CONCUR_UPDATABLE,默认情况下,该参数的值是ResultSet.CONCUR_READ_ONLY
  • resultSetHoldability,它的取值包括:ResultSet.HOLD_CURSORS_OVER_COMMITResultSet.CLOSE_CURSORS_AT_COMMIT

为了使得ResultSet能够对数据进行操作我们需要:

  • 将resultSetType设置为ResultSet.TYPE_SCROLL_SENSITIVE
  • 将resultSetConcurrency设置为ResultSet.CONCUR_UPDATABLE

在通过ResultSet对数据进行调整的过程中,下面方法可能会被调用:

  • resultset.last()
  • resultset.first()
  • resultset.moveToInsertRow()
  • resultset.absolute()
  • resultset.setxxx()
  • resultset.updateRow()
  • resultset.insertRow()

下面是一个通过ResultSet对数据进行增、删、改的示例:

通过ResultSet对数据进行增、删、改

分别调用上述方法:

1 getResultCount(); 2 insertDataToResultSet(); 3 updateDataToResultSet(); 4 delDataFromResultSet();

执行结果如下:

=====Result Count===== 返回结果的条数:2
=====Insert===== ID:1; NAME=Zhang San ID:2; NAME=TEST ID:4; NAME=Xiao Ming =====Update===== ID:1; NAME=Zhang San ID:2; NAME=TEST ID:4; NAME=Xiao Qiang =====Delete===== ID:1; NAME=Zhang San ID:2; NAME=TEST

可以看到我们对ID为4的记录进行了插入、更新和删除操作。


相关栏目:

用户点评