>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 24437 个阅读者 刷新本主题
 * 贴子主题:  【Java网络编程专题】通过JDBC API调用存储过程 回复文章 点赞(0)  收藏  
作者:sunweiqin    发表时间:2019-12-23 06:24:12     消息  查看  搜索  好友  邮件  复制  引用

本文参考《Java网络编程核心技术详解》,作者:孙卫琴,电子工业出版社出版
源代码下载地址为:http://www.javathinker.net/kecheng/javanet/javanetsourcecode.rar

java.sql.CallableStatement接口用来执行数据库中的存储过程。Connection的prepareCall()方法创建一个CallableStatement对象。假设MySQL数据库中有一个名为demoSp的存储过程,它的定义如下:
delimiter  //
CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), INOUT inOutParam INT)
BEGIN
    DECLARE z INT;
    SET z = inOutParam + 1;
    SET inOutParam = z;

    SELECT CONCAT('hello ', inputParam);
END  //

以上代码位于配套源代码包的sourcecode/chapter12/sql/demoSp.sql中。以上存储过程有两个参数,第一个参数inputParam是VARCHAR类型,并且是输入(IN)参数,第二个参数inOutParam是INT类型,并且是输入输出(INOUT)参数。对于输入输出参数,调用者既可以向存储过程传入参数值,也可以在存储过程执行完毕后读取被更新的参数值。以下ProcedureTester类演示如何调用该存储过程。

/* ProcedureTester.java */

import java.sql.*;
public class ProcedureTester{
  public static void main(String args[])throws Exception{
  //加载驱动器,下面的代码为加载MySQL驱动器
    Class.forName("com.mysql.cj.jdbc.Driver");
  
    //连接到数据库的URL,serverTimeZone表示时区
    String dbUrl = "jdbc:mysql://localhost:3306/STOREDB"
                   + "?serverTimezone=Asia/Shanghai";
    String dbUser="dbuser";
    String dbPwd="1234";
    //建立数据库连接
    Connection con = DriverManager.getConnection(dbUrl,dbUser,dbPwd);
    //创建一个调用demoSp存储过程的CallableStatement对象。
    CallableStatement cStmt = con.prepareCall("{call demoSp(?, ?)}");
    //设置第一个参数的值
    cStmt.setString(1, "Tom"); //按索引位置指定参数
    //cStmt.setString("inputParam", "Tom"); //按名字指定参数
    
    //注册第二个参数的类型
    cStmt.registerOutParameter(2, Types.INTEGER); //按索引位置指定参数
    //按名字指定参数
    //cStmt.registerOutParameter("inOutParam", Types.INTEGER);
    
    //设置第二个参数的值
    cStmt.setInt(2, 1); //按索引位置指定参数
    //cStmt.setInt("inOutParam", 1); //按名字指定参数
    
    //执行存储过程
    boolean hadResults = cStmt.execute();
    
    //访问结果集
    if (hadResults) {
      ResultSet rs = cStmt.getResultSet();
      //SQLExecutor类参见12.4.4节的例程12-8
      SQLExecutor.showResultSet(rs);
    }
    
    //获得第二个参数的输出值
    int outputValue = cStmt.getInt(2); //按索引位置指定参数
    //int outputValue = cStmt.getInt("inOutParam"); //按名字指定参数
  
    con.close();
  }
}

创建CallableStatement对象的代码如下:

CallableStatement cStmt = con.prepareCall("{call demoSp(?, ?)}");

以上两个问号分别代表存储过程的两个参数。可通过以下两种方式为参数赋值:

//方式一:指定参数的索引位置
cStmt.setString(1, "Tom");
cStmt.setInt(2, 1);

//方式二:指定参数的名字    
cStmt.setString("inputParam", "Tom");
cStmt.setInt("inOutParam", 1);

第二个参数为输入输出参数,为了获得它的输出值,必须先通过CallableStatement 的registerOutParameter()方法注册参数的类型,然后就可以在存储过程执行完毕后通过相应的getXXX()方法获得它的输出值。



程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 admin 在 2021-10-09 10:54:52 重新编辑]
  Java面向对象编程-->Swing组件(上)
  JavaWeb开发-->开发JavaMail Web应用
  JSP与Hibernate开发-->Spring、JPA与Hibernate的整合
  Java网络编程-->通过JDBC API访问数据库
  精通Spring-->通过Axios访问服务器
  Vue3开发-->CSS过渡和动画
  【Vue.js技术专题】路由导航中抓取数据
  【Spring Cloud Alibaba专题】按照集群模式搭建Redis集群
  【Java基础编程专题】使用和创建JavaDoc文档
  【持久化专题】映射对象标识符的基本原理
  【持久化专题】@Enumerated注解映射枚举类型
  【持久化专题】@Access注解设定Hibernate访问类的属性的方式
  【持久化专题】Hibernate的配置文件
  【持久化专题】EntityManager和Session的merge()方法详解
  【持久化专题】Spring与Hibernate与JPA的整合
  【Java网络编程专题】用java.net.URL类访问HTTP服务器读取网...
  【Java网络编程专题】盘点用Java抓取HTTP服务器和FTP服务器的...
  《大话Java程序设计从入门到精通》写作花絮
  【Java基础编程专题】Java基本类型和引用类型的三个区别
  【Java基础编程专题】用static修饰符进行静态导入的作用和语...
  【Java基础编程专题】Java继承的利弊和使用原则
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。