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

       

posted @ 2012-07-11 18:05  左眼跳跳  阅读(312)  评论(0编辑  收藏  举报