Java調用存儲過程
public static void main(String[] args ){
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, "hyq", "hyq");
CallableStatement proc = null;
proc = conn.prepareCall("{ call hyq.testc(?) }");
proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
proc.execute();
rs = (ResultSet)proc.getObject(1);
while(rs.next())
- //調用存儲過程 刪除流程相關記錄
- String procdure = "{Call sp_deleteInstByRootID(?)}";
- CallableStatement cs = this.getHibernateTemplate().getSessionFactory().getCurrentSession().connection().prepareCall(procdure);
- //this.getSession().connection().prepareCall(procdure).setString(0, orgdefid);
- cs.setString(1, procinstid);
- cs.execute();
ibatis配置文件:
復制代碼
<parameterMap id="parameterMapCesu" class="java.util.Map">
<!-- 參數 -->
<parameter property="cesuDate" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN" />
<parameter property="csCount" jdbcType="DOUBLE" javaType="java.lang.Long" mode="OUT"/>
</parameterMap>
<!-- 調用存儲過程-->
<procedure id="cesu" parameterMap="parameterMapCesu">
{call handiwork(?,?)}
</procedure>
Java代碼
public Long doTest(final String cesuDate) {
return (Long) this.getSqlMapClientTemplate().execute(new SqlMapClientCallback() {
@SuppressWarnings("unchecked")
public Object doInSqlMapClient(SqlMapExecutor executor)
throws SQLException {
long csCount = 0;
try {
//設置存儲過程參數
Map cesu = new HashMap();
cesu.put("cesuDate", cesuDate);//輸入參數
cesu.put("csCount", 0);//輸出參數
//調用存儲過程
executor.queryForObject("test.cesu",cesu);//ibatis文件的namespace是test
csCount = (Long)cesu.get("csCount");//獲取返回值
return csCount;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
});
}
- /**
- * 直接調用存儲過程
- * @param procString
- * @author kongqz
- * @throws Exception
- * @date 2009-03-03
- * **/
- public void callProcedure(String procString,List<Object> params) throws Exception {
- CallableStatement stmt = null;
- try {
- stmt = this.getSession().connection().prepareCall(procString);
- if (params != null){
- int idx = 1;
- for (Object obj : params) {
- if (obj != null) {
- stmt.setObject(idx, obj);
- } else {
- stmt.setNull(idx, Types.NULL);
- }
- idx++;
- }
- }
- stmt.execute();
- } catch (SQLException e) {
- e.printStackTrace();
- throw new Exception("調用存儲過程的時候發生錯誤[sql = " + procString + "]", e);
- }
- }
或
tx = session.beginTransaction();
Connection con=session.connection();
String procedure = "{call batchUpdateStudent(?) }";
CallableStatement cstmt = con.prepareCall(procedure);
cstmt.setInt(1,0); //把年齡參數設為0
cstmt.executeUpdate();
tx.commit();
spring調用存儲過程
1.繼承StoredProcedure
org.springframework.jdbc.object.StoredProcedure是對應存儲過程調用的操作對象,它通過其父類
org.springframework.jdbc.object.SqlCall獲得相應的底層API支持(CallableStatementCreator), 然
后在此基礎之上構建了調用存儲過程的執行方法。
2、重寫父類的execute()方法。將存儲過程的參數封裝成Map類型的傳入該方法
.
3、寫一個方法來封裝存儲過程的方法及把參數放到Map里面.
如:
Map paraMap = new HashMap();
paraMap.put(IN_PARAMETER_NAME, tableName);
paraMap.put(INOUT_PARAMETER_NAME, v);
注意:key值一定要與前面構造函數里面聲明的參數一致。
4、execute()返回的map值要取到里面的value值,可以用前面構造函數聲明時候用到的key值去取。
如:(String)resultMap.get(OUT_PARAMETER_NAME);就得到了存儲過程的返回值。
示例如下:
public class xxxxProcedure extends StoredProcedure {
private static final String PROCEDURE_NAME = "xxxx";
protected xxxxProcedure() {
/* empty */
}
public xxxxProcedure(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate, PRO_NAME);
declareParameter(new SqlParameter("xxxx", Types.VARCHAR));
declareParameter(new SqlParameter("xxxx", Types.VARCHAR));
declareParameter(new SqlParameter("xxxx", Types.NUMERIC));
}
public void execute(String xxxx,String xxxx,int xxxx) {
Map<String, Object> paramsIn = new HashMap<String, Object>();
paramsIn.put("xxxx", xxxx);
paramsIn.put("xxxx", xxxx);
paramsIn.put("xxxx", xxxx);
super.execute(paramsIn);
}
}
在mybatis中調用存儲過程,然后獲取該結果集:
1、xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ifeng.iis.bean.iis.Report" >
<resultMap type="java.util.HashMap" id="resultMap">
<result column="id" property="id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
<result column="name" property="name" javaType="java.lang.String" jdbcType="VARCHAR"/>
<result column="repDate" property="repDate" javaType="java.lang.String" jdbcType="VARCHAR"/>
<result column="summ" property="summ" javaType="java.lang.Long" jdbcType="BIGINT"/>
</resultMap>
<select id="test123" parameterType="java.util.Map" resultMap="resultMap" statementType="CALLABLE" >
{call pro_sql_data(
#{obj,jdbcType=VARCHAR,mode=IN}
)
}
</select>
</mapper>
Java代碼
public String query(String param) throws Exception {
logger.info(param);
Map queryMap = new HashMap();
queryMap.put("obj", param);
//List<Map> listIis1 = reportDao.select4MapParam(queryMap, "currentSql");
List<Map> listIis2 =reportDao.select4MapParam(queryMap,"test123");
return JSONArray.fromObject(listIis2).toString();
}