日期:2014-05-16 浏览次数:20846 次
MySQL5.0版本引进了存储过程的概念。存储过程可以提高执行效率,更容易维护。
在没有存储过程(procedure)概念之前,通常的业务逻辑sql代码有时很长,它们一般被嵌入在宿主语言(比如Java)中,非常不便于维护,而有了存储过程,它们被定义在数据库端,并且进行了预编译。而且业务逻辑SQL代码无需在网络中传输,减轻了网络负担。可以说存储过程的优点大于它的缺点。
下面实现一个简单的加法存储过程。
mysql> delimiter $ mysql> create procedure pr_add (a int , b int) -> begin -> declare c int; -> if a is null then -> set a = 0; -> end if; -> if b is null then -> set b = 0; -> end if; -> set c = a + b; -> select c as sum; -> end; -> $
mysql> delimiter ; mysql> set @a = 10; Query OK, 0 rows affected (0.00 sec) mysql> set @b = 20; Query OK, 0 rows affected (0.00 sec) mysql> call pr_add(@a,@b); +------+ | sum | +------+ | 30 | +------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)
public class ProcedureTest { private static final String DB_URL = "jdbc:mysql://localhost:3306/zjut"; private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String USER = "root"; private static final String PASSWORD = "XXXXX"; private static String sql = "call pr_add(?,?)"; public static void main(String[] args) { try { Class.forName(DRIVER); Connection conn = DriverManager.getConnection(DB_URL,USER,PASSWORD); CallableStatement cstmt = conn.prepareCall(sql); cstmt.setInt(1,10); cstmt.setInt(2, 20); ResultSet rs = cstmt.executeQuery(); while(rs.next()) { System.out.println(rs.getInt("sum")); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } }
CallableStatement cstmt = conn.prepareCall("call pr_add(?,?)"); cstmt.setInt(1,10); cstmt.setInt(2, 20); ResultSet rs = cstmt.executeQuery();
30
原理:首先创建SQL字符串,即 "call pr_add(?,?)" ,调用存储过程用call命令,call命令后跟存储过程名字,两个问号是占位符。
使用Connection对象创建CallableStatement对象,即 conn.prepareCall(sql); 该方法接受一个字符串,代表一个sql语句。
再用CallableStatement对象的executeQuery()执行SQL语句,返回一个ResultSet对象。
利用ResultSet对象遍历得到的数据。