1. 程式人生 > >java中jdbc呼叫儲存過程

java中jdbc呼叫儲存過程

     儲存過程具有高效,安全,方便快捷等特點,一直深受廣大程式設計者的喜愛,Jdbc也為我們提供了與儲存過程打交道的通道。通過CallableStatement我們可以呼叫儲存過程。

可以呼叫無引數,有輸入引數和輸出引數的儲存過程。

  1.呼叫無參儲存過程

CREATE DEFINER=`root`@`localhost` PROCEDURE `SkusProc`()
BEGIN
  SELECT 
    skucode,
    skuname 
  FROM
    skus ;
  END
    
private static  Connection createCon()
	{
		
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} //classLoader,載入對應驅動
        try {
			conn = (Connection) DriverManager.getConnection(url, username, pwd);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
		return conn;
	}

	//呼叫無引數儲存過程
	public List<skus> GetNoParaSkuList()
	{
      List<skus> list=new ArrayList<skus>();
		
		conn=createCon();

		CallableStatement  cs=null;//使用CallableStatement呼叫儲存過程
		try {
			  
		  cs=(CallableStatement) conn.prepareCall("CALL `SkusProc`");
			
			ResultSet resultSet=cs.executeQuery();
			
			while(resultSet.next())
			{
				skus sku=new skus();
				sku.setSkuCode(resultSet.getString("skucode"));
				sku.setSkuName(resultSet.getString("skuname"));
				list.add(sku);
			}
			cs.close();
			conn.close();
			
		
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		};
		
		return list;
		
	}

 2.呼叫有參儲存過程

    有參儲存過程包括輸入引數和輸出引數

CREATE DEFINER=`root`@`localhost` PROCEDURE `GetSkuCountProc`(IN categoryId INT, OUT count_num INT )
BEGIN  
            SELECT COUNT(0) INTO  count_num  FROM skus s INNER JOIN category  c ON s.categoryid=c.id
             WHERE c.Id=categoryId;
         END
 
	//呼叫有引數的儲存過程
	public int GetParaSkuList(int categoryID)
	{

		conn=createCon();

		CallableStatement  cs=null;//使用CallableStatement呼叫儲存過程
		try {
			  
		  cs=(CallableStatement) conn.prepareCall("CALL GetSkuCountProc(?,?)");
			
			cs.setInt(1,categoryID);
			cs.registerOutParameter(2, Types.INTEGER);//註冊輸出引數
			cs.execute();
		    int result=cs.getInt(2);//獲取輸出引數值
			cs.close();
			conn.close();
			return result;
		
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		};
		
		return 0;
		
	}
     如果有輸出引數,我們要使用registerOutParameter進行註冊。然後使用getInt獲取返回值
	//呼叫無引數儲存過程
	   List<skus> list=dao.GetNoParaSkuList();
		for(skus sku:list)
		{
			System.out.println(sku.getSkuCode()+"--"+sku.getSkuName());
			
		}
		
		//呼叫有引數儲存過程
		int result=dao.GetParaSkuList(6);
		System.out.println(result);