java调用存储过程时的错误

public static int getNum(){
        Connection conn = null;
        CallableStatement cs =null;
        try {
            conn = JdbcUtils.getConnection();
            cs = conn.prepareCall("{call getNum(?)}");
            cs.registerOutParameter(1, Types.INTEGER);
            cs.execute();
            int num = cs.getInt(1);
            return num;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(cs!=null){
                    cs.close(); 
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            JdbcUtils.free(null, null, conn);
        }

        return 0;
    }

这样写总是返回0,如果改成下面那样就对了,这是为什么

    Connection conn = null;
        CallableStatement cs =null;
        try {
            conn = JdbcUtils.getConnection();
            cs = conn.prepareCall("{call getNum(?)}");
            cs.registerOutParameter(1, Types.INTEGER);
            ResultSet result=cs.executeQuery();
            int num = 0;
            if(result.next()){
                num = result.getInt("num");
            }
            return num;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(cs!=null){
                    cs.close(); 
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            JdbcUtils.free(null, null, conn);
        }

        return 0;
    }

1、executeQuery方法是用的最多的,返回的结果集类型常态,例如select语句,取值和你写法差不多,比较固定的

2、execute方法,返回的结果集比较多样,例如返回多个结果集、多个更新计数或二者组合的语句,看起来更高级,但是非常少用,而且取值非常麻烦。
关于取值:前提是知道返回类型是getResultSet情况下,必须调用方法 getResultSet 获得第一个结果集,然后调用适当的 getXXX 方法获取其中的值。要获得第二个结果集,需要先调用 getMoreResults 方法,然后再调用 getResultSet 方法。如果已知某个过程返回两个更新计数,则首先调用方法 getUpdateCount,然后调用 getMoreResults,并再次调用 getUpdateCount,

如果调用的存储过程不知道返回类型,那就更难处理了。只举例resultset取值

ResultSet  rst=pst.getResultSet();  
ResultSetMetaData rdata=rst.getMetaData();  
int count=rdata.getColumnCount();  
while(rst.next()){  
    for(int i=0;i<count;i++){  
        System.out.print(rst.getString(i+1)+"/t");  

    }     
}

cs.execute();
ResultSet result=cs.executeQuery();
第一个是执行不带参数
第二个是带参数查询

cs.execute();
ResultSet result=cs.executeQuery();
第一个是执行不带参数
第二个是带参数查询

cs.execute();
ResultSet result=cs.executeQuery();
第一个是执行不带参数
第二个是带参数查询.

第一个没有获取ResultSet

cs.execute(); 返回的是boolean 值