存储过程具有高效,安全,方便快捷等特点,一直深受广大编程者的喜爱,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);