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();
- }
- }
怎么样,童鞋们知道如何使用java调用存储过程了吗??这只是最简单的,最基本的。往后的日子,我们一起继续学习!O(∩_∩)O~
本文转自韩立伟 51CTO博客,原文链接:http://blog.51cto.com/hanchaohan/926333,如需转载请自行联系原作者