在mysql中建立兩個存儲過程,以下:java
一、根據id查找某條數據:mysql
1 CREATE PROCEDURE `findEmpById`(IN id INTEGER(11))2 begin3 select * from emp where empId=id;4 end;
二、根據id查找某個字段,並返回sql
1 CREATE PROCEDURE `getNameById`(in id integer(11),out eName varchar(50))2 begin3 select empName into eName from emp where empId=id;4 end;
在存儲過程的參數列表裏面,in修飾的參數表明輸入參數,out修飾的表明輸出參數。session
使用hibernate調用上面兩個存儲過程:ui
(1)調用第一個存儲過程spa
1 package com.test; 2 3 import java.sql.CallableStatement; 4 import java.sql.Connection; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 8 import org.hibernate.Session; 9 import org.hibernate.SessionFactory;10 import org.hibernate.cfg.Configuration;11 12 13 public class 調用存儲過程 {14 15 /**16 * @param args17 * @throws SQLException 18 */19 public static void main(String[] args) throws SQLException {20 Configuration cfg = new Configuration().configure();21 SessionFactory factory = cfg.buildSessionFactory();22 Session session = factory.openSession();23 Connection con = session.connection();24 String sql = "{call findEmpById(?)}";25 CallableStatement cs = con.prepareCall(sql);26 cs.setObject(1, 2);27 ResultSet rs = cs.executeQuery();28 while(rs.next()){29 int id = rs.getInt("empId");30 String name = rs.getString("empName");31 System.out.println(id+"\t"+name);32 }33 }34 35 }
調用存儲過程的sql語句爲:call 存儲過程名(參數...),不過在java中調用存儲過程通常都加{}。調用存儲過程使用的是CallableStatement。hibernate
(2)調用第二個存儲過程code
1 package com.test; 2 3 import java.sql.CallableStatement; 4 import java.sql.Connection; 5 import java.sql.SQLException; 6 7 import org.hibernate.Session; 8 import org.hibernate.SessionFactory; 9 import org.hibernate.cfg.Configuration;10 11 public class 調用存儲過程1 {12 13 14 public static void main(String[] args) throws SQLException {15 Configuration config = new Configuration().configure();16 SessionFactory sessionFactory = config.buildSessionFactory();17 Session session = sessionFactory.openSession();18 Connection conn = session.connection();19 String sql = "{call getNameById(?,?)}";20 CallableStatement cs = conn.prepareCall(sql); 21 cs.setObject(1, 3); //設置輸出參數22 cs.registerOutParameter(2, java.sql.Types.VARCHAR); //設置第二個參數爲輸出參數23 cs.execute(); //調用存儲過程24 String name = cs.getString(2);//獲取輸出參數25 System.out.println(name);26 }27 28 }
若是有輸出參數,須要特別指出,如上面的代碼22行get