-
存储过程:单户SQL语句不支持复杂执行逻辑,无法完成复杂的逻辑功能,特别是循环、分支条件的SQL;
-
存储过程(Store Procedure)在大型数据库系统中完成特定功能的SQL语句集,存储在数据库中,经过一次编译不需要再次编译,用户指出存储过程的名字并给出参数(如果有参数的话)来执行;
-
在数据库段执行,效率高;
-
带参数的过程支持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类型的
-
创建一个
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(); } } }
-
在
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参数值
-