Java回顾之JDBC(1)(2)
如何调用存储过程
存储过程是做数据库开发时经常使用的技术,它可以通过节省编译时间的方式来提升系统性能,我们这里的示例使用MySQL数据库。
如何调用不带参数的存储过程
假设我们现在有一个简单的存储过程,它只是返回user表中的所有记录,存储过程如下:
- CREATE DEFINER=`root`@`localhost` PROCEDURE `GetUser`()
- BEGIN
- select ID,NAME from user;
- 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信息,存储过程如下:
- CREATE DEFINER=`root`@`localhost` PROCEDURE `GetUserByID`(in id int)
- BEGIN
- set @sqlstr=concat('select * from user where ID=', id);
- prepare psmt from @sqlstr;
- execute psmt;
- 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_ONLY
、ResultSet.TYPE_SCROLL_INSENSITIVE
或ResultSet.TYPE_SCROLL_SENSITIVE,默认情况下,该参数的值是
ResultSet.TYPE_FORWARD_ONLY
。resultSetConcurrency
,它的取值包括:ResultSet.CONCUR_READ_ONLY
或ResultSet.CONCUR_UPDATABLE
,默认情况下,该参数的值是ResultSet.CONCUR_READ_ONLY
。resultSetHoldability
,它的取值包括:ResultSet.HOLD_CURSORS_OVER_COMMIT
或ResultSet.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的记录进行了插入、更新和删除操作。
用户点评