mybatis存儲過程oracle
A. Oracle中存儲過程返回自定義的集合類型,java中使用mybatis返回List集合類型
存儲過程我不太熟,給你一個調用儲存過程mybatis的實例參考:
<mappernamespace="entity.puserMapper">
<!--調用存儲過程-->
<selectid="getCount"parameterMap="getUserCountMap"statementType="CALLABLE">
CALLmyts.ges_user_count(?,?)
</select>
<parameterMaptype="java.util.Map"id="getUserCountMap">
<parameterproperty="sexid"mode="IN"jdbcType="INTEGER"/>
<parameterproperty="usercount"mode="OUT"jdbcType="INTEGER"/>
</parameterMap>
</mapper>
主要是定義好parameterMap就行了
B. mybatis怎麼調用oracle存儲過程
create or replace procere my_procere(mypageNo number,mypageSize number,myInfo_Cursor out sys_refcursor)aspageNO number;pageSize number;begin open myInfo_Cursor for select * from proct where pid between 1 + (pageNo - 1) * pageSize and 4 + (pageNo - 1) * pageSize; end;
C. mybatis為什麼調用不了存儲過程
1、 sqlserver oracle sqlserver返回結果集是可以不要out參數的。如果sql中用的是select出結果,不需要配置out參數。多個結果集/結果集可以配置resultMap 來返回LIST,主要是調用selectList方法會自動把結果集加入到list中去的。
2 、sql有返回值 用select標簽 。
3 、注意sql參數和mybatis參數的對應關系,這個這里就不講了。
4、 注意參數個數 。
D. mybatis 調用存儲過程進行批量修改操作(只需要一次調用存儲過程),不知道如何配置配置文件
public class test
{
public static void main(String[] args)
{
Circle C=new Circle(4);
Rectangles Rt=new Rectangles(4, 4);
Triangle T=new Triangle(6,7);
C.Area();
Rt.Area();
T.Area();
}
}
E. mybatis 存儲過程有CHAR類型的輸出
1.無輸入和輸出參數的存儲過程,我寫了一個比較簡單的,需要注意的是Oracle無參存儲過程不能寫括弧
[sql]
view
plain
CREATE
OR
REPLACE
Procere
cascadeoperation
As
Begin
Delete
From
teacher
Where
id=1;
Update
studentdetail
Set
address='寧波市海曙區'
Where
studentid=10;
End;
這里執行了2個操作,可能用過mybatis的人會迷惑執行的時候到底使用update標簽呢還是delete標簽,其實都行,我也試過select標簽也是OK的,下面是部分的配置文件
[html]
view
plain
<delete
id="cascadeOperation"
statementType="CALLABLE"
>
{call
cascadeoperation}
</delete>
2.帶有輸入和輸出參數的存儲過程,我這里加入了if
else的幾個判斷
[sql]
view
plain
CREATE
OR
REPLACE
Procere
queryTeacher(fid
In
Integer,Type
In
Varchar,Name
Out
Varchar)
F. mybatise怎樣調用存儲過程
如何使用Myts調用資料庫中的存儲過程,下面以Oracle資料庫的為例: 1.在資料庫中創建以下的存儲過程: 2.編寫SQL映射文件WxclDAO.xml: 其中statementType="CALLABLE"表示要調用存儲過程,parameterType參數類型; jdbcType對應資料庫中的...
G. 請問MyBatis.net 如何執行一個不需要參數但返回結果集的oracle資料庫的存儲過程
創建或替換過程p_selTabSpace(卷
dba_data_files.tablespace_name%型)
VAR1 dba_data_files.tablespace_name%型;
VAR2號碼;
VAR3號碼;
VAR4號碼;
選擇A.A1「tabSpaceName」,b.b2/1024/1024「tabSpaceSize」,圓((b.b2 -
a.a2)/ 1024 / 1024 2)「tabSpaceUsed」,SUBSTR((b.b2 - a.a2)/ b.b2,1,
7)「tabSpaceVused」;為VAR1,VAR2,
VAR3,VAR4
(選擇TABLESPACE_NAME A1,SUM(NVL(位元組,0))A2
從DBA_FREE_SPACE
組由TABLESPACE_NAME)一,
(從DBA_DATA_FILES選擇TABLESPACE_NAME B1,SUM(位元組)B2
組由TABLESPACE_NAME)B,
(選擇TABLESPACE_NAME C1,C2的內容,extent_management C3
從DBA_TABLESPACES):C
其中A.A1 = UPPER(V1)和A.A1 = b.b1和C.C1 = b.b1;
DBMS_OUTPUT.PUT_LINE('tabSpaceName是'| | UPPER(VAR1)| |'
'| |'tabSpaceSize'| | VAR2 | |'' | |'tabSpaceUsed'| | VAR3 | |'
'| |'tabSpaceVused'| | VAR4);
完;
--------------------------------測試------------- ------------
EXECUTE p_selTabSpace('系統');
你想要的結果集是用來存儲數據或多個行存儲數據的單排,如果是後者的話,只需選擇...到...這方法未實現,因為你不能超過一個系列的所有支付給同一個變數,它是用SELECT ... INTO ...這方法的限制,如果你要存儲多行去樓上說的結果結果作為使用游標或復雜數據類型即可。
H. myBatis 調用 Oracle 存儲過程,報錯,求解答
你的語句有問題 在oracle客戶端執行過了 再往mybatis裡面貼
I. mybatis怎樣接收oracle資料庫存儲過程所返回的Table類型數據和array
幫你看了半天,沒有找到好的解決辦法,變相方法是可以在plsql中返回一個ref cursor,java中直接用resultset就能接收了。
希望其他人能回答你的問題吧。。
J. mybatis 連oracle 為什麼返回了row
比如統計一個單位不同職務級別女人數量、少數民族數量、30歲以上人員數量,40以上人員數量等。如:
董事長:0 0 0 1
中層領導:2 2 3 8
職員:20 40 80 200
剛開始想辦法拼成了一個超級長的sql來做,但是最後長度超過vachar2的最大長度了,雖然有其他辦法解決,雖然最大sql看起來很美好,但是想想後期的優化和維護,還是決定重新來規劃。中間的過程就不說了,最終確定先定義一行數據存number型object(類似一維數組),形式如(0,0,1)。然後放到二維數組里。閑言少敘,如下定義:
[html] view plain 在CODE上查看代碼片派生到我的代碼片create or replace
TYPE C_ROW IS OBJECT(
COUNT_SEX NUMBER, --性別女統計
COUNT_NATION NUMBER, --少數民族統計
COUNT_30AGE NUMBER --30歲統計
);
[html] view plain 在CODE上查看代碼片派生到我的代碼片create or replace
TYPE C_ROW_CLM IS TABLE OF C_ROW;
關於以上的語法我就不解釋了。C_ROW_CLM 就是二維數組。
一個簡單的存儲過程如下:就是往二維數組放了三列。
[html] view plain 在CODE上查看代碼片派生到我的代碼片PROCEDURE COUNT_TEST(C_VALUE OUT C_ROW_CLM) ASBEGIN
--初始化二維數組,存放格式如:(0,1,2,3),(0,0,2,3)C_VALUE:=C_ROW_CLM();
C_VALUE.extend;
C_VALUE(1) := C_ROW(0,0,0);
C_VALUE.extend;
C_VALUE(2) := C_ROW(1,2,3);
C_VALUE.extend;
C_VALUE(3) := C_ROW(7,8,9);
NULL;
END COUNT_TEST;
以上存儲過程生成而為數據已經有了,我們有一個out輸出。現在就看mybatis如何實現了。
目前能查到的文章大部分是關於Java如何自定義類型到資料庫的舉例,官方文檔也是,找到一篇文章很不容易,不過最終還是找到了。現在回頭看很簡單,由於我們自己定義的二維數組java不認識,需要我們自定義類型做數據轉換,mybatis提供了TypeHandler介面,只要實現它就可以。裡面有幾個方法,官方例子主要介紹了setParameter、getResult(ResultSet arg0, int arg1)兩個方法,這兩個方法共同完成的是java對資料庫的操作以及數據類型轉換,而我們的存儲過程調用是不用他們的,我們用的是getResult(CallableStatement cs, int arg1)這個方法,在這里實現數據類型轉換即可。具體事例如下:
[html] view plain 在CODE上查看代碼片派生到我的代碼片package com.broadengate.handler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import oracle.sql.Datum;
import oracle.sql.STRUCT;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;import com.XX.bean.CountRefMgrPerson;
/**
* 自定義Handler
*/
public class CRMPTypeHandler implements TypeHandler<Object> {public Object getResult(ResultSet arg0, String arg1) throws SQLException {// TODO Auto-generated method stub
return null;
}
public Object getResult(ResultSet arg0, int arg1) throws SQLException {// TODO Auto-generated method stub
return null;
}
/**
* 調用存儲過程實現該方法即可。
* @param cs 返回結果
* @param arg1 返回索引
*/
public Object getResult(CallableStatement cs, int arg1)throws SQLException {
// cs.getConnection();
// 此處是excel y方向數據
String names[] ={"董事長","中層領導","職員"};// 遍歷y方向數據
int i = 0;
// 定義結果集, XXDTO是我們自己定義的bean,用來與統計數量一行數據一一對應。
List< XXDTO > dtos = new ArrayList< XXDTO >();ResultSet rs = cs.getArray(arg1).getResultSet();while (rs.next()) {
Datum[] data = ((STRUCT)rs.getObject(2)).getOracleAttributes();XXDTO dto = new CountRefMgrPerson();
// key_value賦值
dto.setDataValue(names[i]);
i ++;
// 以下操作取得資料庫中數據值賦給相應的bean。
dto.setSex(data[0].intValue());
dto.setNation(data[1].intValue());
dto.setDegreeCodeDoctor(data[2].intValue());// 獲得list
dtos.add(dto);
}
return dtos;
}
public void setParameter(PreparedStatement ps, int arg1, Object arg2,JdbcType arg3) throws SQLException {
// TODO Auto-generated method stub
}
}
[html] view plain 在CODE上查看代碼片派生到我的代碼片package com.xx.bean;
public class CountRefMgrPerson extends BaseBean {private Integer id;// null
private String dataValue;// 縱列數值( {"董事長","中層領導","職員"};等值 )private Integer countNation;// 民族(少數民族)數量private Integer countSex;// 性別(女)數量[html] view plain 在CODE上查看代碼片派生到我的代碼片<pre name="code" class="html"><span style="white-space:pre"> </span>private Integer count30;// age數量get、set方法略}
這樣我們就完成了數據轉換的操作,剩下的工作就是配置mybatis了。為了找到這個方法,憋屈了一天,國內幾乎沒啥資料,老外的帖子也幾乎翻遍了,後來終於在一個老外的回復中找到了答案。不啰嗦了,直接上答案:
[html] view plain 在CODE上查看代碼片派生到我的代碼片<resultMap type="com.broadengate.bean.CountRefMgrPerson" id="clist">
<!-- 職級-->
<result property="sex" column="COUNT_SEX"/>
<!-- 民族-->
<result property="nation" column="COUNT_NATION" />
<!-- 性別-->
<result property="degreeCodeDoctor" column="COUNT_BOSHI"/>
</resultMap>
[html] view plain 在CODE上查看代碼片派生到我的代碼片<!-- 存儲過程調用-->
<select id="queryByList" statementType="CALLABLE" parameterType="Object">
{call TEST.COUNT_TEST(
#{result ,mode=OUT, javaType=java.util.List,jdbcType=ARRAY,jdbcTypeName=C_ROW_CLM, resultMap=clist,typeHandler=com.xx.handler.CRMPTypeHandler}
)}
</select>
相信上面的配置,用mybatis的人都知道,這里我只強調兩點,一是typeHandler=com.xx.handler.CRMPTypeHandler需要指定我們自己的自定義類型,而是必須加jdbcTypeName,這個name坑爹啊,讓我找了很長時間,其實就是我們out的那個類型C_ROW_CLM。值得一提的是,不要把一維數組和二維數組定義在包體內,調用存儲過程是找不到的。
對了順便放一下,我接受out參數的類。
[html] view plain 在CODE上查看代碼片派生到我的代碼片import java.util.List;
import com.xx.bean.XXDTO;
public class XXModel {
private List< XXDTO > result; // 調用存儲過程返回的結果集public List< XXDTO > getResult() {
return result;
}
public void setResult(List< XXDTO > result) {this.result = result;
}
}
類里的result與mybatis配置里的返回結果result對應。
ok了。