zoukankan      html  css  js  c++  java
  • Java调用存储过程

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

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

    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调用存储过程:

    1. 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>.存储过程的写法:

    1. /*全查询*/ 
      DELIMITER // 
      CREATE PROCEDURE find_test() 
      BEGIN 
      SELECT id,username,address FROM t_user; 
      END // 
      DELIMITER ; 
       
      /*调用该存储过程*/ 
      CALL find_test(); 

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

    1. 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>.存储过程的写法:

     

    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调用存储过程:

      1. 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(); 
            } 
        } 
  • 相关阅读:
    450. K组翻转链表
    6. 合并排序数组 II
    64. 合并排序数组
    165. 合并两个排序链表
    103. 带环链表 II
    102. 带环链表
    [web安全原理]PHP命令执行漏洞基础
    [原题复现]-HITCON 2016 WEB《babytrick》[反序列化]
    《将博客搬至CSDN》
    PHP反序列化漏洞-CVE-2016-7124(绕过__wakeup)复现
  • 原文地址:https://www.cnblogs.com/hbxblogs/p/2586761.html
Copyright © 2011-2022 走看看