使用jdbcTemplate调用存储过程

24 阅读1分钟

本文中罗列基于JdbcTemplate调用存储过程的情况,在实际应用中可以依据实际情况选择合理的方式使用。

1. 有参,无返回值,有结果集

// 存储过程依据传入的参数进行查询,但是存储过程中没有设置返回值,可以使用本处理方式
public List<DTO> queryInHospitalPatFee(String date) {  
    List<DTO> list = jdbcTemplate.execute("exec ODR_CUR ? ", ( CallableStatementCallback<List<DTO>>) cs->{  
        List<DTO> retList = new ArrayList<>();  
        cs.setObject(1,date);  // 设置入参
        ResultSet rs = cs.executeQuery();  
        while(rs!=null&&rs.next()){  
            DTO tmp = new DTO();  
            ...
            tmp.setTotalFee(rs.getDouble("费用"));    
            retList.add(tmp);  
        }  
        return retList;  
    });  
    return list;  
}

2. 有返回值,无结果集

// 存储过程返回的值在存储过程中有定义,可以直接使用本处理方式
public void test() {  
String param = jdbcTemplate.execute(  
con -> {  
    String sql = "{call query_cur2 (?,?)}";// 调用存储过程  
    CallableStatement cs = con.prepareCall(sql);  
    cs.setString(1, "p1");// 设置输入参数的值  
    cs.registerOutParameter(2, OracleType.VARCHAR2);// 注册输出参数的类型  
    return cs;  
}, (CallableStatementCallback) cs -> {  
    cs.execute();  
    return cs.getString(2);// 获取输出参数的值  
});  
}