JDBC之CallableStatement

  1. 存储过程:单户SQL语句不支持复杂执行逻辑,无法完成复杂的逻辑功能,特别是循环、分支条件的SQL;

  2. 存储过程(Store Procedure)在大型数据库系统中完成特定功能的SQL语句集,存储在数据库中,经过一次编译不需要再次编译,用户指出存储过程的名字并给出参数(如果有参数的话)来执行;

  3. 在数据库段执行,效率高;

  4. 带参数的过程支持IN、OUT、INOUT三种类型参数;

    IN:参数接收传递给存储过程的值;
    OUT:只是来返回调用存储过程后的返回值;
    IN OUT:参数则是即作为输入,也作为结果的输出;
    

    定义一个MySQL函数,返回Student表中和指定firstName与lastName匹配的记录个数

   drop function if exists studentFound;
   delimiter //
   create function studentFound(firstN varchar(20),lastN varchar(20))
   	returns int
   begin
   	declare res int;//声明变量
   	select count(*) into res from student
   		where student.firstName = firstN and  student.lastName = lastN;
   	return res;
   end;

MySQL的存储过程分为function和procedure, procedure的参数类型IN、OUT、INOUT,但是function的参数只能是IN类型的

  1. 创建一个CallableStatement对象

    CallableStatement callableStatement = connection.prepareCall("{? = call sampleProcedure(?,?,?)}");
    

    {? = call sampleProcedure(?,?,?)}是SQL转义语法,它通知驱动程序其中的代码应该被不同处理。驱动程序解析转义语法,并将它翻译成数据库可以理解的代码。? 占位符为 IN、 OUT 还是 INOUT 参数,取决于存储过程 sampleProcedure

    public static void main(String[] args){
            String url = "jdbc:mysql://localhost:3306/javacourse";
            Connection conn = ConnectionFactory.create(url,"root","root");
            if(conn != null){
                try{
                    //Create a callable statement
                    CallableStatement stmt = conn.prepareCall({? = call studentFound(?,?)}); //调用存储过程studentFound
                    Scanner input = new Scanner(System.in);
                    System.out.print("Input first name:");
                    String firstName = input.nextLine();
                    System.out.print("Input last name:"); 
                    String lastName = input.nextLine();
                    stmt.setString(2, firstName);       //设置第一个输入参数(第2个问号),注意=左边的?序号为1
                    stmt.setString(3, lastName);        //设置第二个输入参数(第3个问号),注意参数序号
                    stmt.registerOutParameter(1, Types.INTEGER); //设置第一个参数(第一个?)的返回值类型 
                    stmt.executeUpdate();	 //执行存储过程
                    int matches = stmt.getInt(1); 	//获取返回值,因为这里的返回内容不是记录,是标量(scalar),理解为只有一个字段,序号为1
    /* 对于第一个和第二个?处的数据无需指定类型,数据库端解析器能知道其类型,而第一个?是Java程序处理,不理解第一个?的类型 */
                    System.out.println(matches + " records matched");
                    conn.close();
                } catch (SQLException e){
                    e.printStackTrace(); 
                }
            }
    }
    
  2. CallableStatement对象中设置参数

    • IN参数:

      callableStatement.setX(paremerterIndex,java.sql.Types.TINYINT)

    • OUT参数:

      //registerOutParameter方法注册输出值的类型,告诉Java怎么处理从数据库收到的值类型
      callableStatement.registerOutParameter(parameterIndex,java.sql.Types.TINYINT); 
      callableStatement.executeQuery(); 
      
    • IN OUT参数:

      callableStatement.setX(parameterIndex,  ...);	//设置输入值
      // registerOutParameter方法注册输出值的类型	callableStatement.registerOutParameter(n3, java.sql.Types.TINYINT); callableStatement.executeUpdate(); 		
      byte x = callableStatement.getByte(parameterIndex); //获取OUT参数值
      

系列教程见链接添加链接描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值