1.例子1:一个简单的存储过程的java调用:有参数无返回值!
<1>.存储过程的写法:
-
/*写一个简单的存储过程--如插入t_user表中的数据*/ DELIMITER // CREATE PROCEDURE insert_test( IN username VARCHAR(50), IN address VARCHAR(50) ) BEGIN INSERT INTO t_user(username,address) VALUES(username,address); END // DELIMITER ; /*调用该存储过程*/ CALL insert_test('ok','chenc');
<2>.java调用存储过程:
-
package com.hanchao.test; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * java调用存储过程的测试 * @author hanlw * 2012-07-09 */ public class TestProcedure { public static void main(String[] args) throws Exception { /** * 为什么要使用存储过程?★ * 1.效率高;★ * * 2.★在日程开发的过程中,当我们的SQL语句很复杂时,我们要考虑写 * 一个存储过程,以达到优化数据库的过程!!★ * * 3.数据库优化的几个方法: * ①不要连接不需要的表; * ②不要用like等通配符,即使用也要放在最后。 * ③存储过程的java调用!! */ Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root","root"); //★与以前不一样的地方 CallableStatement cs = con.prepareCall("{call insert_test(?,?)}"); cs.setString(1, "tom"); cs.setString(2, "America"); int rows = cs.executeUpdate(); if(rows > 0) { System.out.println("thank you !"); } else { System.out.println("good bye !"); } cs.close(); con.close(); } }
2.无参数,只有返回结果集。(相当于全查询)
<1>.存储过程的写法:
-
/*全查询*/ DELIMITER // CREATE PROCEDURE find_test() BEGIN SELECT id,username,address FROM t_user; END // DELIMITER ; /*调用该存储过程*/ CALL find_test();
<2>.java调用存储过程:
-
package com.hanchao.test; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; /** * java调用存储过程 * @author hanlw * 2012-07-09 */ public class TestProcedure2 { 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/mydb","root","root"); //★注意:CallableStatement是java.sql.CallableStatement CallableStatement cs = con.prepareCall("{call find_test}"); ResultSet rs = cs.executeQuery(); while(rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String address = rs.getString("address"); System.out.println(id+"\t"+username+"\t"+address); } rs.close(); cs.close(); con.close(); /** * 注意:发现没有,这和我们的JDBC的写法几乎没有区别。 * 只是把PreparedStatement换成了CallableStatement!!! */ } }
3.有返回值参数的存储过程;(获得刚刚插入数据的ID号)
<1>.存储过程的写法:
-
/*带返回值参数的存储过程*/ DELIMITER // CREATE PROCEDURE insert_getId( IN username VARCHAR(20), IN address VARCHAR(20), OUT id INT ) BEGIN INSERT INTO t_user(username,address) VALUES(username,address); SELECT LAST_INSERT_ID() INTO id; SELECT id; END // DELIMITER ; /*调用该存储过程*/ CALL insert_getId('jack','USA',@id); /*★比较一下这个存储过程与上面的不同之处!以及调用的不同之处!!★*/ /*带返回值参数的存储过程*/ DELIMITER // CREATE PROCEDURE insert_getId12( IN username VARCHAR(20), IN address VARCHAR(20), OUT id INT ) BEGIN INSERT INTO t_user(username,address) VALUES(username,address); SELECT LAST_INSERT_ID() INTO id; #SELECT id; /*★体会一下这一句的不同!*/ END // DELIMITER ; /*调用该存储过程*/ CALL insert_getId12('jack1','USA1',@id); SELECT @id;
<2>.java调用存储过程:
-
package com.hanchao.test; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Types; /** * java调用存储过程 * @author hanlw * 2012-07-09 */ public class TestProcedure3 { 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/mydb","root","root"); //★煮一下下面几行 CallableStatement cs = con.prepareCall("{call insert_getId(?,?,?)}"); cs.setString(1, "hanchao"); cs.setString(2, "Canada"); cs.registerOutParameter(3, Types.INTEGER); //注意这一句的不同之处!! cs.executeUpdate(); //执行 int id = cs.getInt(3);//注意: System.out.println("刚刚插入的ID为:"+id); cs.close(); con.close(); } }