遇到調用存儲過程的業務,以前有用過,但不是用Spring的 JdbcTemplate去做的,這次是在一個已經有的SpringMVC框架的項目下寫處理存儲過程的。
參考網絡中的方法,在實際操作中遇到兩個問題:
1 存儲過程的參數問題 ,原本以為只要傳對應的入參就可以,即每個入參占用一個?,在報錯后檢查發現,出參也要占用一個?;
2連接數據庫,這個是開始沒有注意,但很快就發現了。
完成這個存儲過程調用的代碼
int param2Value = (Integer ) jdbcTemplate.execute(new CallableStatementCreator()
{
public CallableStatement createCallableStatement(Connection con) throws SQLException
{
String storedProc = sql;// 調用的sql
CallableStatement cs = con.prepareCall(storedProc);
cs.setString(1, obj[0] + "");
cs.setInt(2, Integer.parseInt(obj[1] + ""));
cs.setString(3, obj[2] + "");
cs.setString(4, obj[3] + "");
cs.setString(5, obj[4] + "");
cs.setInt(6, Integer.parseInt(obj[5] + ""));
cs.setLong(7, Long.parseLong(obj[6] + "") );
// 注冊輸出參數的類型
cs.registerOutParameter(8, OracleTypes.NUMBER);
return cs;
}
}, new CallableStatementCallback()
{
public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException
{
cs.execute();
return cs.getInt(8);// 獲取輸出參數的值
}
});
return param2Value;
}
catch (Exception e)
{
e.printStackTrace();
return -1;
}
trycatch 非必須的。
其中 jdbcTemplate要設置其獲取oracle數據庫的連接,也就是讀取配置。
private JdbcTemplate jdbcTemplate;
/**
* 設置數據源
* @param dataSource 數據源對象
* @return void 無返回對象
* @author 鄒建松 2014-07-14
*/
@Resource(name="baseDataSource")
public void setJdbcTemplate(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
baseDataSource 是配置文件xml里的
以上是有返回參數,即是有出參數的。
沒有出參的如下
public void test(){
try
{
this.jdbcTemplate.execute("call p_create_student_test('123')");
}
catch (Exception e)
{
e.printStackTrace();
}
}
還有一種情況就是有結果集的,這種我還沒有用過,參考網絡的
- public void test() {
- List resultList = (List) jdbcTemplate.execute(
- new CallableStatementCreator() {
- public CallableStatement createCallableStatement(Connection con) throws SQLException {
- String storedProc = "{call sp_list_table(?,?)}";// 調用的sql
- CallableStatement cs = con.prepareCall(storedProc);
- cs.setString(1, "p1");// 設置輸入參數的值
- cs.registerOutParameter(2, OracleTypes.CURSOR);// 注冊輸出參數的類型
- return cs;
- }
- }, new CallableStatementCallback() {
- public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException {
- List resultsMap = new ArrayList();
- cs.execute();
- ResultSet rs = (ResultSet) cs.getObject(2);// 獲取游標一行的值
- while (rs.next()) {// 轉換每行的返回值到Map中
- Map rowMap = new HashMap();
- rowMap.put("id", rs.getString("id"));
- rowMap.put("name", rs.getString("name"));
- resultsMap.add(rowMap);
- }
- rs.close();
- return resultsMap;
- }
- });
- for (int i = 0; i < resultList.size(); i++) {
- Map rowMap = (Map) resultList.get(i);
- String id = rowMap.get("id").toString();
- String name = rowMap.get("name").toString();
- System.out.println("id=" + id + ";name=" + name);
- }
- }
還有就是用別的方法調用存儲過程,如
public void updateStudentIncludeType(User bean) {
Connection con = getConnection();
CallableStatement csmt = null;
Student student = (Student) bean.getDetails();
try {
/*
* v_student_id in number,--學生ID v_student_name in varchar,--學生姓名
* v_sex in number,--性別 v_student_no in number,--學號 v_duty in
* varchar,--職務 v_phonenumber in varchar,--聯系電話 v_school_org_id in
* number,--組織ID v_school_org in number,--組織 v_card_id in
* varchar,--考勤卡號
*/
csmt = con.prepareCall("{CALL P_MODIFY_STUDENT_AND_TYPE(?,?,?,?,?,?,?,?,?,?,?)}");
csmt.setLong(1, student.getUserId());
csmt.setString(2, student.getStudentName());
csmt.setLong(3, student.getSex());
csmt.setString(4, student.getStudentNo());
csmt.setString(5, student.getDuty());
csmt.setString(6, student.getLinkDn());
csmt.setLong(7, student.getOrgId());
csmt.setLong(8, Long.parseLong(student.getSchool_id()));
csmt.setString(9, student.getCard());
csmt.setInt(10, student.getStudentType());
csmt.registerOutParameter(11, Types.INTEGER);
csmt.executeUpdate();
if (csmt.getInt(11) == 1) {
throw new DaoException("修改學生信息失敗!");
}
if (csmt.getInt(11) == 2) {
throw new DaoException("考勤卡號重復,請重輸!");
}
if (csmt.getInt(11) == 3) {
throw new DaoException("學生學號重復,請重輸!");
}
} catch (SQLException e) {
throw new DaoException("系統維護中,請稍后再試!", e);
} finally {
JdbcUtils.closeStatement(csmt);
closeConnectionIfNecessary(con);
}
}
用到jar包