CallableStatement是在存储过程调用过程中使用的,方法是prepareCall。当自定义的存储过程包含参数,我们需要在执行前对参数进行设置:
private void setStatement(PreparedStatement stmt, Object... params) throws SQLException { if (params == null) { return; } ParameterMetaData pmd = null; if (!pmdKnownBroken) { pmd = stmt.getParameterMetaData(); if (pmd.getParameterCount() < params.length) { throw new SQLException("Too many parameters: expected " + pmd.getParameterCount() + ", was given " + params.length); } } for (int i = 0; i < params.length; i++) { if (params[i] != null) { stmt.setObject(i + 1, params[i]); } else { // VARCHAR works with many drivers regardless // of the actual column type. Oddly, NULL and // OTHER don't work with Oracle's drivers. int sqlType = Types.VARCHAR; if (!pmdKnownBroken) { try { sqlType = pmd.getParameterType(i + 1); } catch (SQLException e) { pmdKnownBroken = true; } } stmt.setNull(i + 1, sqlType); } } }设置参数用到的类是ParameterMetaData,它的getParameterCount和getParameterType两个方法是很重要的,通常我们在写JDBC时不会想到这两个方法,只是简单的setObject就了事了,在商业项目当中还是需要考虑全面的。
当我们需要将执行之后的数据返回为一个Object[],可以:
rs = cstmt.executeQuery(); rs.next(); objs = toArray(rs);将执行后的ResultSet先使用next方法使指针指向数据库中有数据的第一行,然后就可以将整个ResultSet toArray了。
通常我们要获得一个query返回的记录总数,我们可以使用count(*)来获得,还有一种方法就是:
rs = pstmt.executeQuery(); rs.last(); icount = rs.getRow();先将ResultSet指向last,这时指针即指向了查出数据中的最后一行,然后使用getRow方法来获得最后一行的行编号即为记录总数了。
将ResultSet的一行数据转化为Object[],这时我们要用到ResultSetMetaData这个类的相关方法了:
private Object[] toArray(ResultSet rs) throws SQLException { ResultSetMetaData meta = rs.getMetaData(); int cols = meta.getColumnCount();//返回此ResultSet
对象中的列数 Object[] result = new Object[cols]; for (int i = 0; i < cols; i++) { result[i] = rs.getObject(i + 1);//getObject返回的是保存列值得java object } return result; }