在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)

2017-2-7 13:41| 发布者: zhangjf| 查看: 472| 评论: 0

摘要: 这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还能提高程序的执行效率, 今天在JAVA+Mysql ...

这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还能提高程序的执行效率, 今天在JAVA+Mysql上也实现了这个功能下面我贴出代码,这次我会讲详细点,让看的朋友能更加清楚它的好处在哪里。

一、封装的代码存储过过程调用方法

关于返回类CallableStatement的解释: CallableStatement 对象为所有的DBMS 提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement对象所含的内容。这种调用是 用一种换码语法来写的,有两种形式:一种形式带结果参,另一种形式不带结果参数。结果参数是 一种输出 (OUT) 参数,是已储存过程的返回值。两种形式都可带有数量可变的输入(IN 参数)、 输出(OUT 参数)或输入和输出(INOUT 参数)的参数。问号将用作参数的 占位符 。

  1. // 调用带有输入参数且有返回值的存储过程
  2. public static CallableStatement callProcInputAndOutPut(String sql, String[] inparameters) {
  3. try {
  4. conn = getConnection();
  5. cs = conn.prepareCall(sql);
  6. if(inparameters!=null)
  7. for(int i=0;i<inparameters.length;i++)
  8. {
  9. //if中循环的参数是我们,在存储过程需要使用到的参数
  10. if (i<inparameters.length-1) {
  11. cs.setObject(i+1, inparameters[i]);
  12. }
  13. //else中的参数是我们存储过程执行完毕后返回给我们的值,它会被保存在CallableStatement这个类里面,
  14. //然后我们可以根据传入参数时所在的位置,这个位置就是传入的数组参下标+1去取存储过程返回给我们的值
  15. else {
  16. cs.registerOutParameter(2, java.sql.Types.VARCHAR);
  17. }
  18. }
  19. cs.execute();
  20. }
  21. catch (Exception e) {
  22. e.printStackTrace();
  23. throw new RuntimeException(e.getMessage());
  24. }finally{
  25. }
  26. return cs;
  27. }
复制代码

二、调用方法的代码

  1. /*调用带output参数的存储过程*/
  2. //下面就是我们组合的参数,其中第一个是存储过程所需参数,第二个""没有赋值的参数就对应存储过程中的输出参数,就是我们需要的返回值
  3. String[] sqlParameter=new String[]{"hellow",""};
  4. //调用存储过程的的字符串
  5. String executString="call outputProcudure(?,?)";
  6. //调用存储过程的的字符串 outPutProcudure就是我们的存储过程名称,然后两个?表示两个参数,1是我们参数的参数,第二是我们存储过程处理完后返回的值
  7. CallableStatement proReturnData=MySqlHepler.callProcInputAndOutPut(executString, sqlParameter);
  8. try {
  9. //取值 由于带OUT参数的返回值在我们存储过程中参数的位置是第二位所以我们 使用GETINT(2),接着我会贴存储过程
  10. int returnValue= proReturnData.getInt(2);
  11. if (returnValue==1) {
  12. String groupAlertString="返回值是:"+returnValue+"--->插入成功.";
  13. out.println(groupAlertString);
  14. }
  15. else
  16. {
  17. String groupAlertString="返回值是:"+returnValue+"--->插入失败,该用户名已经存在.";
  18. out.println(groupAlertString);
  19. }
  20. } catch (SQLException e) {
  21. e.printStackTrace();
  22. }
复制代码
三:存储过程

这里我详细说下:这个调用的存储过程执行的步骤很简单,就是传入一个名称,然后判断数据库中是否有相同名称的人员,如果有

就返回2(不插入),如果没就返回1(表示我们以hellow为名称给数据库中增加了一条数据),这个步骤如果

是直接写SQL语句是必须写两条的,但是这里用到了存储过程,就只需要如此简单一步就处理了...,也许你觉得我这个例子举得不正确,

也许你还会想,我们可以将这个名称字段设置个主键啊,不就一个SQL语句就行了吗,呵呵 不过我这里说了,我只是举了这么一

简单的例子,SQL操作复杂逻辑的地方太多了。。...也许连带操作的有10步如果你写SQL语句就需要10次访问数据,那么这时候

你再来看这个例子。你会觉得是多么的让你愉快.

下面贴存储过程的图:

三:执行效果

第一次调用存储过程截图

第二次调用存储过程截图

来自: http://www.cnblogs.com/xiaoliao/p/5094151.html

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-9 11:23

Copyright 2015-2025 djqfx

返回顶部