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(); 
      
          } 
      
      } 

       

你可能感兴趣的:(java)