mysql必知必会(五)

如何在java中调用存储过程,下面分三种做介绍:调用传入值的存储过程、调用有返回结果集的存储过程、调用有返回值和传入值的存储过程。
1.调用传入值的存储过程
创建存储过程:

delimiter//
create procedure save(in pname varchar(20),in price float,in tid int)
begin
insert into product(prodname,prodprice,typeid) values(pname,price,tid)
end//
delimiter;

测试:

CALL save("mi2",599,2);

在java中调用:

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;


public class ProcedureTest {
    public static void main(String[] args) throws Exception {

        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db","root","root");

        //调用传入值的存储过程
        CallableStatement  cs = con.prepareCall("{CALL save(?,?,?)}");

        cs.setString(1, "xiaomi");
        cs.setFloat(2, 1999);
        cs.setInt(3, 3);
        cs.executeUpdate();

        cs.close();
        con.close();

    }
}
  • 引用了CallableStatement接口
  • 使用 {CALL save(?,?,?)}的形式
  • 有几个问号“?”,set几个值

2.调用有返回结果集的存储过程
创建存储过程:

DELIMITER //
CREATE PROCEDURE findAll()
BEGIN
SELECT * FROM product;
END//
DELIMITER ;

CALL findAll();

在java中调用:

package com.xingguo.pm.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;


public class ProcedureTest {
    public static void main(String[] args) throws Exception {

        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db","root","root");

        //调用返回结果集的存储过程
        CallableStatement cs = con.prepareCall("{CALL findAll()}");
        ResultSet rs = cs.executeQuery();
        while(rs.next()){
            String name = rs.getString("prodname");
            float price = rs.getFloat("prodprice");
            int tid = rs.getInt("typeid");
            System.out.println(name+":"+price+":"+tid);
        }
        rs.close();
        cs.close();
        con.close();

    }
}   

3.调用有返回值和传入值的存储过程
穿件存储过程:

DELIMITER //
CREATE PROCEDURE save_id(OUT pk INT,IN pname VARCHAR(20),IN price FLOAT,IN tid INT)
BEGIN
INSERT INTO product(prodname,prodprice,typeid) VALUES(pname,price,tid);
SELECT LAST_INSERT_ID() INTO pk;
END//
DELIMITER ;

测试:

CALL save_id(@pk,'mi2s',499,4);

在java中调用

package com.xinguo.pm.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Types;


public class ProcedureTest {
    public static void main(String[] args) throws Exception {

        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db","root","root");

        //调用有返回值的存储过程
        CallableStatement cs = con.prepareCall("{CALL save_id(?,?,?,?)}");

        cs.registerOutParameter(1, Types.INTEGER);

        cs.setString(2, "iphone6");
        cs.setFloat(3, 5599);
        cs.setInt(4, 5);

        cs.executeUpdate();
        int pk = cs.getInt(1);

        System.out.println("主键:"+pk);

        cs.close();
        con.close();

    }
}   
  • 使用cs.registerOutParameter(1, Types.INTEGER);
  • 第几个问号“?”需要返回值就用其对应的号和types.的相应类型接收
  • 执行过后用 cs.getInt(1);获取
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值