|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
再说第三点:我并没有提到服务器也要整合,然后是IDE,一个好的IDE能够200%提高开发的速度,就说图形方面:你是经过简单托拽和点击就能实现功能好那。7-CallableStatement
本概述是从《JDBCTMDatabaseAccessfromJavaTM:ATutorialandAnnotatedReference》这本书中摘引来的。JavaSoft今朝正在筹办这本书。这本书是一本教程,同时也是JDBC的主要参考手册,它将作为Java系列的构成部分在1997年春季由Addison-Wesley出书公司出书。
7.1概述
CallableStatement对象为一切的DBMS供应了一种以尺度情势挪用已贮存历程的办法。已贮存历程贮存在数据库中。对已贮存历程的挪用是CallableStatement对象所含的内容。这类挪用是用一种换码语法来写的,有两种情势:一种情势带了局参数,另外一种情势不带了局参数(有关换码语法的信息,拜见第4节“语句”)。了局参数是一种输入(OUT)参数,是已贮存历程的前往值。两种情势都可带无数量可变的输出(IN参数)、输入(OUT参数)或输出和输入(INOUT参数)的参数。问号将用作参数的占位符。
在JDBC中挪用已贮存历程的语法以下所示。注重,方括号暗示其间的内容是可选项;方括号自己并非语法的构成部分。
{call历程名[(?,?,...)]}
前往了局参数的历程的语法为:
{?=call历程名[(?,?,...)]}
不带参数的已贮存历程的语法相似:
{call历程名}
一般,创立CallableStatement对象的人应该晓得所用的DBMS是撑持已贮存历程的,而且晓得这些历程都是些甚么。但是,假如必要反省,多种DatabaseMetaData办法都能够供应如许的信息。比方,假如DBMS撑持已贮存历程的挪用,则supportsStoredProcedures办法将前往true,而getProcedures办法将前往对已贮存历程的形貌。
CallableStatement承继Statement的办法(它们用于处置一样平常的SQL语句),还承继了PreparedStatement的办法(它们用于处置IN参数)。CallableStatement中界说的一切办法都用于处置OUT参数或INOUT参数的输入部分:注册OUT参数的JDBC范例(一样平常SQL范例)、从这些参数中检索了局,大概反省所前往的值是不是为JDBCNULL。
7.1.1创立CallableStatement对象
CallableStatement对象是用Connection办法prepareCall创立的。下例创立CallableStatement的实例,个中含有对已贮存历程getTestData挪用。该历程有两个变量,但不含了局参数:
CallableStatementcstmt=con.prepareCall(
"{callgetTestData(?,?)}");
个中?占位符为IN、OUT仍是INOUT参数,取决于已贮存历程getTestData。
7.1.2IN和OUT参数
将IN参数传给CallableStatement对象是经由过程setXXX办法完成的。该办法承继自PreparedStatement。所传进参数的范例决意了所用的setXXX办法(比方,用setFloat来传进float值等)。
假如已贮存历程前往OUT参数,则在实行CallableStatement对象之前必需先注册每一个OUT参数的JDBC范例(这是必须的,由于某些DBMS请求JDBC范例)。注册JDBC范例是用registerOutParameter办法来完成的。语句实行完后,CallableStatement的getXXX办法将取回参数值。准确的getXXX办法是为各参数所注册的JDBC范例所对应的Java范例(从JDBC范例到Java范例的尺度映照见8.6.1节中的表)。换言之,registerOutParameter利用的是JDBC范例(因而它与数据库前往的JDBC范例婚配),而getXXX将之转换为Java范例。
作为示例,下述代码先注册OUT参数,实行由cstmt所挪用的已贮存历程,然后检索在OUT参数中前往的值。办法getByte从第一个OUT参数中掏出一个Java字节,而getBigDecimal从第二个OUT参数中掏出一个BigDecimal对象(小数点前面带三位数):
CallableStatementcstmt=con.prepareCall(
"{callgetTestData(?,?)}");
cstmt.registerOutParameter(1,java.sql.Types.TINYINT);
cstmt.registerOutParameter(2,java.sql.Types.DECIMAL,3);
cstmt.executeQuery();
bytex=cstmt.getByte(1);
java.math.BigDecimaln=cstmt.getBigDecimal(2,3);
CallableStatement与ResultSet分歧,它不供应用增量体例检索年夜OUT值的特别机制。
7.1.3INOUT参数
既撑持输出又承受输入的参数(INOUT参数)除挪用registerOutParameter办法外,还请求挪用得当的setXXX办法(该办法是从PreparedStatement承继来的)。setXXX办法将参数值设置为输出参数,而registerOutParameter办法将它的JDBC范例注册为输入参数。setXXX办法供应一个Java值,而驱动程序先把这个值转换为JDBC值,然后将它送到数据库中。
这类IN值的JDBC范例和供应给registerOutParameter办法的JDBC范例应当不异。然后,要检索输入值,就要用对应的getXXX办法。比方,Java范例为byte的参数应当利用办法setByte来赋输出值。应当给registerOutParameter供应范例为TINYINT的JDBC范例,同时应利用getByte来检索输入值(第8节“JDBC和Java范例之间的映照”将给出具体信息和范例映照表)。
下例假定有一个已贮存历程reviseTotal,其独一参数是INOUT参数。办法setByte把此参数设为25,驱动程序将把它作为JDBCTINYINT范例送到数据库中。接着,registerOutParameter将该参数注册为JDBCTINYINT。实行完该已贮存历程后,将前往一个新的JDBCTINYINT值。办法getByte将把这个新值作为Javabyte范例检索。
CallableStatementcstmt=con.prepareCall(
"{callreviseTotal(?)}");
cstmt.setByte(1,25);
cstmt.registerOutParameter(1,java.sql.Types.TINYINT);
cstmt.executeUpdate();
bytex=cstmt.getByte(1);
7.1.4先检索了局,再检索OUT参数
因为某些DBMS的限定,为了完成最年夜的可移植性,倡议先检索由实行CallableStatement对象所发生的了局,然后再用CallableStatement.getXXX办法来检索OUT参数。
假如CallableStatement对象前往多个ResultSet对象(经由过程挪用execute办法),在检索OUT参数前应先检索一切的了局。这类情形下,为确保对一切的了局都举行了会见,必需对Statement办法getResultSet、getUpdateCount和getMoreResults举行挪用,直到不再有了局为止。
检索完一切的了局后,便可用CallableStatement.getXXX办法来检索OUT参数中的值。
7.1.5检索作为OUT参数的NULL值
前往到OUT参数中的值大概会是JDBCNULL。当呈现这类情况时,将对JDBCNULL值举行转换以使getXXX办法所前往的值为null、0或false,这取决于getXXX办法范例。关于ResultSet对象,要晓得0或false是不是源于JDBCNULL的独一办法,是用办法wasNull举行检测。假如getXXX办法读取的最初一个值是JDBCNULL,则该办法前往true,不然前往flase。第5节“ResultSet”将给出具体信息。
为什么外国人还要写那些框架进行代码封装,他们不就是为了别人使用时可以更简单么!如果要达到一个企业级项目的不用框架是很难的。小一些的项目还行,大的光是MVC模式的设计的编码量就够大的了。还有性能方面,单轮windows,这个工具是微软写的,。 |
|