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 值