1。无参
我们先看预先写好的存储过程:
create procedure p1
as
select * from student
go
如何实现JDBC调用无参的存储过程呢?
package a1;
import java.sql.*;
public class Test05 {
public static void main(String[] args) {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection connection = DriverManager.getConnection(""
+ "jdbc:sqlserver://localhost:1433;DatabaseName=tongjunchao","sa","123");;
// CallableStatement cs = connection.prepareCall("p1");
CallableStatement cs = connection.prepareCall("{call p1 }");
//以前是这里面些sql语句,现在因为是调用了存储过程,所以,没有参数了。
ResultSet rSet = cs.executeQuery();
while (rSet.next()) {
String sid = rSet.getString("sid");
String sname = rSet.getString("sname");
String sex = rSet.getString(3);
int age = rSet.getInt(4);
String tel = rSet.getString("tel");
System.out.println(sid+"\t"+sname+"\t"+sex+"\t"+age+"\t"+tel);
}
//close();
rSet.close();
cs.close();
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
运行结果:
sid sname sex age tel
s001 丰登儿 男 35 13527542451
s002 班克尔 女 17 13884233134
s003 车笔刀 女 13 15086623248
s004 趴耳朵 男 19 15323535256
s005 直角 女 23 15653579258
s006 扳手 女 19 13663279788
s007 俄石板 女 21 13656529396
2.有参数,这里用两个参数做示例
--创建一个存储过程,根据年龄和性别查询学生信息
create procedure p3
@age int, @sex varchar(2)
as
select * from student
where age = @age and sex = @sex;
go
那么,如何实现JDBC调用带两个参数的存储过程呢?
有两种方法,以下给出的全部代码采用的是推荐的方法!
package a1;
import java.sql.*;
public class Test05 {
public static void main(String[] args) {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection connection = DriverManager.getConnection(""
+ "jdbc:sqlserver://localhost:1433;DatabaseName=tongjunchao","sa","123");;
// CallableStatement cs = connection.prepareCall("p1");
CallableStatement cs = connection.prepareCall("{call p3 (?,?)}");
//以前是这里面些sql语句,现在因为是调用了存储过程,所以,没有参数了。
cs.setString(1, "17");
cs.setString(2, "女");
ResultSet rSet = cs.executeQuery();
while (rSet.next()) {
String sid = rSet.getString("sid");
String sname = rSet.getString("sname");
String sex = rSet.getString(3);
int age = rSet.getInt(4);
String tel = rSet.getString("tel");
System.out.println(sid+"\t"+sname+"\t"+sex+"\t"+age+"\t"+tel);
}
//close();
rSet.close();
cs.close();
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
其中的
CallableStatement cs = connection.prepareCall("{call p3 (?,?)}");
//以前是这里面些sql语句,现在因为是调用了存储过程,所以,没有参数了。
cs.setString(1, "17");
cs.setString(2, "女");
可以替换成:CallableStatement cs = connection.prepareCall("p3 17,'女'");
这也是种不错的简便方式啦
运行结果:
s002 班克尔 女 17 13884233134
3.JDBC调用带有输出的存储过程
创建的存储过程如下:
--根据sid 输出该学生的电话号码
create procedure p4
@sid varchar(8),
@tel varchar(16) output
as
select @tel = tel from student
where sid = @sid
示例代码如下:
package a1;
import java.sql.*;
public class Test05 {
public static void main(String[] args) {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection connection = DriverManager.getConnection(""
+ "jdbc:sqlserver://localhost:1433;DatabaseName=tongjunchao","sa","123");;
// CallableStatement cs = connection.prepareCall("p1");
CallableStatement cs = connection.prepareCall("{call p4 (?,?)}");
//以前是这里面些sql语句,现在因为是调用了存储过程,所以,没有参数了。
/**
* 这里我想强调一下的是,下面的操作都是通过CallableStatement
* 的对象调用方法来进行的操作,
* 这样记忆是不是比较简便呢?
* (*^__^*) 嘻嘻
*/
cs.setString(1, "s001");
cs.registerOutParameter(2, Types.VARCHAR);
cs.execute();
String string = cs.getString(2);
System.out.println("tel:"+string);
//close();
cs.close();
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
运行结果为:
tel:13527542451