1.什么是存储过程:
在数据库中,可以通过创建一个存储过程来达到一次性执行多条SQL语句的目的
在 mysql命令行中:
创建不带参数的存储过程,如:
create procedure sp_name () select * from usertable; 表示创建一个名为sp_name的存储过程,执行的语句为 select * from usertable;
执行存储过程:
call sp_name();
2.通过CallableStatement接口在JAVA程序中执行存储过程:
1.Connection conn = 连接数据库 ;(conn 为连接数据库后返回的引用)
2.[例子] CallableStatement cstmt = conn.prepareCall("{call show_usertbl()}"); //创建CallableStatement对象.调用prepareCall方法调用存储过程
//例子中,存储过程的名字为 show_usertbl(),call表示调用.注意,旁边要有中括号{}引起来
(一)调用没有参数的存储过程
public class Test3 {
public static void main(String[] args) {
test();
}
static void test() {
Connection conn = DBUtil.open(); // 连接数据库 (注:DBUtil是自定义的类,详细定义如何可翻看之前文章)
try {
CallableStatement cstmt = conn.prepareCall("{call show_usertbl()}");// 第一步
ResultSet rs = cstmt.executeQuery(); // 第二步,执行存储过程调用,结果返回到 rs中。
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
System.out.println("id:" + id + " name:" + name);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(conn); // 关闭数据库
}
}
}
(二)带输入参数的存储过程:
参数类型: in 表示输入,out 表示输出
在mysql命令行下:
创建带输入参数的存储过程:
例子:create procedure insert_usertbl(in myid int, in myname varchar(20)) insert into usertbl(id,name) values(20,“xiaoming”);
说明:insert_usertbl 是存储过程的名字,myid是整型的输入参数,myname是字符型的输入参数, insert into usertbl(id,name) values(20,“xiaoming”) 是SQL语句
创建存储过程后,在JAVA程序中通过CallableStatement接口调用:
问号?表示要动态赋值的变量。
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
public class Test4 {
public static void main(String[] args) {
Insert();
}
static void Insert()
{
Connection conn = DBUtil.open(); //连接数据库
try {
CallableStatement cstmt = conn.prepareCall("{call insert_usertbl(?,?)}");
//问号表示要动态赋值的参数
cstmt.setInt(1, 8); //给第一个问号赋值为8
cstmt.setString(2, "xiaowang"); //给第二个问号赋值为“xiaowang”
cstmt.executeUpdate(); //执行 call insert_usertbl(8,“xiaowang”)
} catch (SQLException e) {
e.printStackTrace();
}finally
{
DBUtil.close(conn); //关闭数据库
}
}
}
(三)创建有输入输出参数的存储过程:
参数类型: in 表示输入,out 表示输出
在mysql命令行下:
例子:create procedure getNameById(in cid int,out return_name varchar(20)) select name from usertbl where id = cid;
说明:其中getNameById为存储过程名字,cid为要输入的参数,而return_name为系统要返回给我的数据。select name into return_name from usertbl where id = cid 是操作的SQL语句 (返回的name是从return_name中抽取的)
Java程序中用CallableStatement接口调用此存储过程:
注意:有输出变量的时候,要给输出变量进行注册
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;
public class Test5 {
public static void main(String[] args) {
getName();
}
static void getName() {
Connection conn = DBUtil.open();
try {
CallableStatement cstmt = conn.prepareCall("{call getNameById(?,?)}");// 输入输出变量都要以?表示
cstmt.setInt(1, 20); // 给第一个问号赋值为20
// 注册输出参数
cstmt.registerOutParameter(2, Types.CHAR); // 给作为输出变量的第二个问号注册,并制定其为char型
cstmt.execute(); // 执行 call getNameById()
String name = cstmt.getString(2); // 取存储过程中的第二个变量的值
System.out.println("name:" + name);
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(conn);
}
}
}