1、在数据库中创建存储过程
create or replace procedure p_proc
is
begin
insert into testTable (id,name,age) values(seq_getid.nextval,'tiger','25');
end p_proc;
2、在Hibernate中的调用
public void insertInfo()
{
Session ses = HibernateSessionFactory.getSession();
try{
Connection conn = ses.connection();
conn.setAutoCommit(false);
String proc="{Call p_proc()}";
CallableStatement st = conn.prepareCall(proc);
st.executeUpdate();
conn.commit();
st.close();
conn.close();
ses.close();
}catch(Exception e){
e.printStackTrace();
}
}
3、方法封装
public void callProcedure(String procString,List<Object> params) throws Exception {
CallableStatement stmt = null;
try {
stmt = this.getSession().connection().prepareCall(procString);
if (params != null){
int index = 1;
for (Object obj : params) {
if (obj != null) {
stmt.setObject(idx, obj);
} else {
stmt.setNull(idx, Types.NULL);
}
index++;
}
}
stmt.execute();
} catch (SQLException e) {
e.printStackTrace();
throw new Exception("调用存储过程的时候发生错误[sql = " + procString + "]", e);
}
}
4、调用方式
不带参数的调用:
view plaincopy to clipboardprint?
try {
this.callProcedure("{call hdssh.testProc}", params);
} catch (Exception e) {
throw new Exception(e.getMessage());
}
try {
this.callProcedure("{ call hdssh.testProc}", params);
} catch (Exception e) {
throw new Exception(e.getMessage());
}
带参数的调用:
view plaincopy to clipboardprint?
List params = new ArrayList();
params.add("测试串");
this.callProcedure("{call hdssh.testProcParam(?)}", param);
List params = new ArrayList();
params.add("测试串");
this.callProcedure("{call hdssh.testProcParam(?)}", param);