如何在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);获取