本文向您介绍JDBC调用存储过程的方法,包括如何使用存储过程,结合SQL操作存储过程等JDBC调用存储过程的必备知识。

存储进程是指保存在数据库并在数据库端履行的程序。你能够运用特别的语法在Java类中经过JDBC调用存储进程。在调用时,存储进程的称号及指定的参数经过JDBC衔接发送给DBMS,履行存储进程并经过衔接(假如有)回来成果。

JDBC调用存储进程详解(jdbc调用存储过程)  JDBC调用存储过程 第1张

运用存储进程具有和运用根据EJB或CORBA这样的运用服务器相同的优点。区别是存储进程能够从许多盛行的DBMS中免费运用,而运用服务器大都十分贵重。这并不仅仅许可证费用的问题。运用运用服务器所需求花费的办理、编写代码的费用,以及客户程序所增加的杂乱性,都能够经过DBMS中的存储进程所整个地代替。

你能够运用Java,Python,Perl或C编写存储进程,可是一般运用你的DBMS所指定的特定言语。Oracle运用PL/SQL,PostgreSQL运用pl/pgsql,DB2运用Procedural SQL。这些言语都十分相似。在它们之间移植存储进程并不比在Sun的EJB标准不同完成版别之间移植Session Bean困难。而且,存储进程是为嵌入SQL所规划,这使得它们比Java或C等言语愈加友爱地办法表达数据库的机制。

由于存储进程运行在DBMS本身,这能够协助削减运用程序中的等待时间。不是在Java代码中履行4个或5个SQL句子,而只需求在服务器端履行1个存储进程。网络上的数据往复次数的削减能够戏曲性地优化功能。

运用存储进程

简略的老的JDBC经过CallableStatement类支撑存储进程的调用。该类实际上是PreparedStatement的一个子类。假定咱们有一个poets数据库。数据库中有一个设置诗人去世年纪的存储进程。下面是对老酒鬼Dylan Thomas(old soak Dylan Thomas,不指定是否有关典故、文明,请批评指正。译注)进行调用的具体代码:

  1. try{
  2. intage=39;
  3. StringpoetName="dylanthomas";
  4. CallableStatementproc=connection.prepareCall("{callset_death_age(?,?)}");
  5. proc.setString(1,poetName);
  6. proc.setInt(2,age);
  7. cs.execute();
  8. }catch(SQLExceptione){//....}

传给prepareCall办法的字串是存储进程调用的书写标准。它指定了存储进程的称号,代表了你需求指定的参数。

和JDBC集成是存储进程的一个很大的便当:为了从运用中经过JDBC调用存储进程,不需求存根(stub)类或许配置文件,除了你的DBMS的JDBC驱动程序外什么也不需求。

当这段代码履行时,数据库的存储进程就被调用。咱们没有去获取成果,由于该存储进程并不回来成果。履行成功或失利将经过破例得知。失利或许意味着调用存储进程时的失利(比方供给的一个参数的类型不正确),或许一个运用程序的失利(比方抛出一个破例指示在poets数据库中并不存在“Dylan Thomas”)

结合SQL操作与存储进程

映射Java目标到SQL表中的行适当简略,可是一般需求履行几个SQL句子;或许是一个SELECT查找ID,然后一个INSERT刺进指定ID的数据。在高度规格化(契合更高的范式,译注)的数据库形式中,或许需求多个表的更新,因而需求更多的句子。Java代码会很快地胀大,每一个句子的网络开支也敏捷增加。

将这些SQL句子转移到一个存储进程中将大大简化代码,仅触及一次网络调用。一切相关的SQL操作都能够在数据库内部产生。而且,存储进程言语,例如PL/SQL,答应运用SQL语法,这比Java代码愈加天然。下面是咱们前期的存储进程,运用Oracle的PL/SQL言语编写:

  1. createprocedureset_death_age(poetVARCHAR2,poet_ageNUMBER)
  2. poet_idNUMBER;
  3. beginSELECTidINTOpoet_idFROMpoetsWHEREname=poet;
  4. INSERTINTOdeaths(mort_id,age)VALUES(poet_id,poet_age);
  5. endset_death_age;

很共同?不。我打赌你必定等待看到一个poets表上的UPDATE。这也暗示了运用存储进程完成是多么简略的一件工作。set_death_age简直能够肯定是一个很烂的完成。咱们应该在poets表中增加一列来存储去世年纪。Java代码中并不关怀数据库形式是怎样完成的,由于它仅调用存储进程。咱们今后能够改动数据库形式以进步功能,可是咱们不用修正咱们代码。

下面是调用上面存储进程的Java代码:

  1. publicstaticvoidsetDeathAge(PoetdyingBard,intage)throwsSQLException{
  2. Connectioncon=null;
  3. CallableStatementproc=null;
  4. try{
  5. con=connectionPool.getConnection();
  6. proc=con.prepareCall("{callset_death_age(?,?)}");
  7. proc.setString(1,dyingBard.getName());
  8. proc.setInt(2,age);
  9. proc.execute();
  10. }
  11. finally{
  12. try{proc.close();}
  13. catch(SQLExceptione){}
  14. con.close();
  15. }
  16. }

为了保证可保护性,主张运用像这儿这样的static办法。这也使得JDBC调用存储进程的代码会集在一个简略的模版代码中。假如你用到许多存储进程,就会发现仅需求复制、张贴就能够创立新的办法。由于代码的模版化,乃至也能够经过脚本自动生产调用存储进程的代码。

Functions

存储进程能够有回来值,所以CallableStatement类有相似getResultSet这样的办法来获取回来值。当存储进程回来一个值时,你有必要运用registerOutParameter办法告知JDBC驱动器该值的SQL类型是什么。你也有必要调整存储进程调用来指示该进程回来一个值。

下面接着上面的比如。这次咱们查询Dylan Thomas去世时的年纪。这次的存储进程运用PostgreSQL的pl/pgsql:

  1. createfunctionsnuffed_it_when(VARCHAR)returnsinteger'declare
  2. poet_idNUMBER;
  3. poet_ageNUMBER;
  4. begin
  5. --firstgettheidassociatedwiththepoet.
  6. SELECTidINTOpoet_idFROMpoetsWHEREname=$1;
  7. --getandreturntheage.
  8. SELECTageINTOpoet_ageFROMdeathsWHEREmort_id=poet_id;
  9. returnage;
  10. end;'language'pl/pgsql';

别的,留意pl/pgsql参数名经过Unix和DOS脚本的$n语法引证。一起,也留意嵌入的注释,这是和Java代码比较的另一个优越性。在Java中写这样的注释当然是能够的,可是看起来很杂乱,而且和SQL句子脱节,有必要嵌入到Java String中。

下面是调用这个存储进程的Java代码:

  1. connection.setAutoCommit(false);
  2. CallableStatementproc=connection.prepareCall("{?=callsnuffed_it_when(?)}");
  3. proc.registerOutParameter(1,Types.INTEGER);
  4. proc.setString(2,poetName);
  5. cs.execute();
  6. intage=proc.getInt(2);

假如指定了过错的回来值类型会怎样?那么,当JDBC调用存储进程时将抛出一个RuntimeException,正如你在ResultSet操作中运用了一个过错的类型所碰到的相同。

并不是一切的数据库都支撑存储进程,可是存在许多很棒的完成,包含免费/开源的和非免费的,所以移植并不是一个问题。Oracle、PostgreSQL和DB2都有相似的存储进程言语,而且有在线的社区很好地支撑。

存储进程东西许多,有像TOAD或TORA这样的修改器、调试器和IDE,供给了编写、保护PL/SQL或pl/pgsql的强壮的环境。

存储进程的确增加了你的代码的开支,可是它们和大多数的运用服务器比较,开支小得多。假如你的代码杂乱到需求运用DBMS,我主张整个选用存储进程的办法。

【修改引荐】

  1. 运用JDBC衔接SQL Server数据库
  2. 八大技巧通晓JDBC衔接Oracle数据库
  3. JSP环境建立之MySQL、JDBC的装置与测验体系
  4. JDBC与Hibernate读取功能剖析
  5. 揭密JDBC驱动程序
转载请说明出处
知优网 » JDBC调用存储进程详解(jdbc调用存储过程)

发表评论

您需要后才能发表评论