Java調用存儲過程


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())
     

 

  1. //調用存儲過程 刪除流程相關記錄  
  2.             String procdure = "{Call sp_deleteInstByRootID(?)}";  
  3.             CallableStatement cs = this.getHibernateTemplate().getSessionFactory().getCurrentSession().connection().prepareCall(procdure);  
  4.             //this.getSession().connection().prepareCall(procdure).setString(0, orgdefid);  
  5.             cs.setString(1, procinstid);  
  6.             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;
            } 
        }
    });
}

 

 

hibernate中調用存儲過程

  1. /** 
  2.  * 直接調用存儲過程 
  3.  * @param procString 
  4.  * @author kongqz 
  5.  * @throws Exception  
  6.  * @date 2009-03-03 
  7.  * **/  
  8. public void callProcedure(String procString,List<Object> params) throws Exception {  
  9.     CallableStatement stmt = null;  
  10.     try {  
  11.         stmt = this.getSession().connection().prepareCall(procString);  
  12.         if (params != null){  
  13.             int idx = 1;  
  14.             for (Object obj : params) {  
  15.                 if (obj != null) {  
  16.                     stmt.setObject(idx, obj);  
  17.                 } else {  
  18.                     stmt.setNull(idx, Types.NULL);  
  19.                 }  
  20.                 idx++;  
  21.             }  
  22.         }  
  23.         stmt.execute();  
  24.     } catch (SQLException e) {  
  25.         e.printStackTrace();  
  26.         throw new Exception("調用存儲過程的時候發生錯誤[sql = " + procString + "]", e);  
  27.           
  28.     }  
  29. }  

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();
 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM