开发者社区> 技术小胖子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Java调用存储过程------

简介:
+关注继续查看

 1.例子1:一个简单的存储过程的java调用:有参数无返回值!

<1>.存储过程的写法:


  1. /*写一个简单的存储过程--如插入t_user表中的数据*/ 
  2. DELIMITER // 
  3. CREATE PROCEDURE insert_test( 
  4. IN username VARCHAR(50), 
  5. IN address VARCHAR(50) 
  6. BEGIN 
  7. INSERT INTO t_user(username,address) VALUES(username,address); 
  8. END // 
  9. DELIMITER ; 
  10.  
  11. /*调用该存储过程*/ 
  12. CALL insert_test('ok','chenc'); 

<2>.java调用存储过程:

 


  1. package com.hanchao.test; 
  2.  
  3. import java.sql.CallableStatement; 
  4. import java.sql.Connection; 
  5. import java.sql.DriverManager; 
  6. import java.sql.SQLException; 
  7.  
  8. /** 
  9.  * java调用存储过程的测试 
  10.  * @author hanlw 
  11.  * 2012-07-09 
  12.  */ 
  13. public class TestProcedure { 
  14.  
  15.     public static void main(String[] args) throws Exception { 
  16.         /** 
  17.          * 为什么要使用存储过程? 
  18.          * 1.效率高; 
  19.          *  
  20.          * 2.在日程开发的过程中,当我们的SQL语句很复杂时,我们要考虑写 
  21.          *    一个存储过程,以达到优化数据库的过程!! 
  22.          *     
  23.          * 3.数据库优化的几个方法: 
  24.          * ①不要连接不需要的表; 
  25.          * ②不要用like等通配符,即使用也要放在最后。 
  26.          * ③存储过程的java调用!!    
  27.          */ 
  28.          
  29.         Class.forName("com.mysql.jdbc.Driver"); 
  30.         Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root","root"); 
  31.          
  32.         //与以前不一样的地方 
  33.         CallableStatement cs = con.prepareCall("{call insert_test(?,?)}"); 
  34.         cs.setString(1"tom"); 
  35.         cs.setString(2"America"); 
  36.          
  37.         int rows = cs.executeUpdate(); 
  38.         if(rows > 0) { 
  39.             System.out.println("thank you !"); 
  40.         } else { 
  41.             System.out.println("good bye !"); 
  42.         } 
  43.         cs.close(); 
  44.         con.close(); 
  45.     } 

2.无参数,只有返回结果集。(相当于全查询)

<1>.存储过程的写法:

 


  1. /*全查询*/ 
  2. DELIMITER // 
  3. CREATE PROCEDURE find_test() 
  4. BEGIN 
  5. SELECT id,username,address FROM t_user; 
  6. END // 
  7. DELIMITER ; 
  8.  
  9. /*调用该存储过程*/ 
  10. CALL find_test(); 

<2>.java调用存储过程:

 


  1. package com.hanchao.test; 
  2.  
  3. import java.sql.CallableStatement; 
  4. import java.sql.Connection; 
  5. import java.sql.DriverManager; 
  6. import java.sql.ResultSet; 
  7.  
  8.  
  9. /** 
  10.  * java调用存储过程 
  11.  * @author hanlw 
  12.  * 2012-07-09 
  13.  */ 
  14. public class TestProcedure2 { 
  15.  
  16.     public static void main(String[] args) throws Exception { 
  17.         Class.forName("com.mysql.jdbc.Driver"); 
  18.         Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root","root"); 
  19.          
  20.         //注意:CallableStatement是java.sql.CallableStatement 
  21.         CallableStatement cs = con.prepareCall("{call find_test}"); 
  22.         ResultSet rs = cs.executeQuery(); 
  23.          
  24.         while(rs.next()) { 
  25.             int id = rs.getInt("id"); 
  26.             String username = rs.getString("username"); 
  27.             String address = rs.getString("address"); 
  28.             System.out.println(id+"\t"+username+"\t"+address); 
  29.         } 
  30.         rs.close(); 
  31.         cs.close(); 
  32.         con.close(); 
  33.          
  34.         /** 
  35.          * 注意:发现没有,这和我们的JDBC的写法几乎没有区别。 
  36.          * 只是把PreparedStatement换成了CallableStatement!!! 
  37.          */ 
  38.     } 

3.有返回值参数的存储过程;(获得刚刚插入数据的ID号)

<1>.存储过程的写法:



  1. /*带返回值参数的存储过程*/ 
  2. DELIMITER // 
  3. CREATE PROCEDURE insert_getId( 
  4. IN username VARCHAR(20), 
  5. IN address VARCHAR(20), 
  6. OUT id INT 
  7. BEGIN 
  8. INSERT INTO t_user(username,address) VALUES(username,address); 
  9. SELECT LAST_INSERT_ID() INTO id; 
  10. SELECT id; 
  11. END // 
  12. DELIMITER ; 
  13.  
  14. /*调用该存储过程*/ 
  15. CALL insert_getId('jack','USA',@id); 
  16.  
  17.  
  18.  
  19. /*比较一下这个存储过程与上面的不同之处!以及调用的不同之处!!*/ 
  20.  
  21.  
  22. /*带返回值参数的存储过程*/ 
  23. DELIMITER // 
  24. CREATE PROCEDURE insert_getId12( 
  25. IN username VARCHAR(20), 
  26. IN address VARCHAR(20), 
  27. OUT id INT 
  28. BEGIN 
  29. INSERT INTO t_user(username,address) VALUES(username,address); 
  30. SELECT LAST_INSERT_ID() INTO id; 
  31. #SELECT id;   /*体会一下这一句的不同!*/ 
  32. END // 
  33. DELIMITER ; 
  34.  
  35. /*调用该存储过程*/ 
  36. CALL insert_getId12('jack1','USA1',@id); 
  37. SELECT @id; 

<2>.java调用存储过程:

 


  1. package com.hanchao.test; 
  2.  
  3. import java.sql.CallableStatement; 
  4. import java.sql.Connection; 
  5. import java.sql.DriverManager; 
  6. import java.sql.Types; 
  7.  
  8. /** 
  9.  * java调用存储过程 
  10.  * @author hanlw 
  11.  * 2012-07-09 
  12.  */ 
  13. public class TestProcedure3 { 
  14.  
  15.     public static void main(String[] args) throws Exception { 
  16.         Class.forName("com.mysql.jdbc.Driver"); 
  17.         Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root","root"); 
  18.          
  19.         //煮一下下面几行 
  20.         CallableStatement cs = con.prepareCall("{call insert_getId(?,?,?)}"); 
  21.         cs.setString(1"hanchao"); 
  22.         cs.setString(2"Canada"); 
  23.         cs.registerOutParameter(3, Types.INTEGER); //注意这一句的不同之处!! 
  24.         cs.executeUpdate(); //执行 
  25.          
  26.         int id = cs.getInt(3);//注意: 
  27.          
  28.         System.out.println("刚刚插入的ID为:"+id); 
  29.         cs.close(); 
  30.         con.close(); 
  31.     } 

怎么样,童鞋们知道如何使用java调用存储过程了吗??这只是最简单的,最基本的。往后的日子,我们一起继续学习!O(∩_∩)O~





     本文转自韩立伟 51CTO博客,原文链接:http://blog.51cto.com/hanchaohan/926333,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
线程 - Java 多线程编程(下)
线程 - Java 多线程编程(下)
25 0
线程 - Java 多线程编程(上)
线程 - Java 多线程编程(上)
62 0
Java多线程那些事,对Java并发编程2w余字的总结,超详细(从入门到完全掌握)
Java多线程那些事,对Java并发编程2w余字的总结,超详细(从入门到完全掌握)
79 0
java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?
死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了。
68 0
五分钟带你玩转多线程(一)java多线程基础知识简介
线程概念 进程:是一个执行中的程序,如打开网易云音乐,网易云音乐就是一个进程 线程:是进程的组成,一个进程包含多个线程,是jvm最小调度单元。如网易云音乐听歌是一个线程,评价是一个线程。
50 0
Java的并发编程中的多线程问题到底是怎么回事儿?
原创: Hollis 在我之前的一篇《再有人问你Java内存模型是什么,就把这篇文章发给他。》文章中,介绍了Java内存模型,通过这篇文章,大家应该都知道了Java内存模型的概念以及作用,这篇文章中谈到,在Java并发编程中,通常会遇到三个问题,即原子性问题、一致性问题和有序性问题。
1057 0
21114
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载