私は、Oracleのストアドプロシージャは、誰もが精通していると信じて、そして時にはそれがいくつかの特別な操作をする必要がありません。ストアドプロシージャは、大規模なデータセットを返すようにするときは、保管中にカーソルを使用する必要があります。結果が出てきたときに、どのようにこれらのデータを注入することで対応するオブジェクトにMyBatisのでしょうか?このresultMapに使用するMyBatisの中。
例:すべての情報がテーブルDEPTに格納されたプロセス出力の応用。
次のようにSQL文は次のとおりです。
- パッケージ、このパッケージの参照カーソル型の作成を作成し、タイプは、名前付き:t_cursor 作成 または 交換するパッケージtest_packを AS タイプt_cursorはIS REF カーソル; エンドtest_pack; - アウトを持つストアドプロシージャを作成します。パラメータは、パラメータの種類はちょうどパッケージ参照カーソル型で作成された 作成 または 交換する 手順CU_DEPT_TEST(test_pack.t_cursor OUT v_cursorを) され 始める オープン v_cursorをするために SELECT * からの学部; エンド ;
次のように次マッパーの設定ファイルは、次のとおりです。
<! - 调用储存过程(内含游标)- > < 選択のid = "callProcedure02" ParameterTypeが= "マップ" するStatementType = "CALLABLEを" > {CU_DEPT_TEST(#{v_cursor、モード= OUT、jdbcType = CURSOR、このresultMapを呼び出します= CALL_1})} </ 選択> < このresultMap タイプ= "部門" ID = "CALL_1" > < IDのカラム= "DEPTNO" プロパティ= "DEPTNO" /> < 結果カラム= "DNAME" プロパティ= "DNAME"/> < 結果カラム= "LOC"プロパティ= "LOC" /> </ このresultMap >
エンティティクラスを次のように
パッケージcom.yc.mybatis。 パブリック クラス部門{ プライベート int型のDEPTNO。 プライベート文字列のDNAME。 プライベート文字列のLOC。 公共 INT getDeptno(){ 戻りDEPTNO。 } 公共 ボイド setDeptno(INT DEPTNO){ この .deptno = DEPTNO。 } パブリック文字列getDname(){ 戻りDNAME。 } 公共 ボイドsetDname(文字列DNAME){ この .dname = DNAME。 } パブリック文字列getLoc(){ 戻りLOC。 } 公共 ボイドsetLoc(文字列LOC){ この .LOC = LOC。 } @Override パブリック文字列のtoString(){ リターン "部門[DEPTNO =" + DEPTNO + "DNAME =" + DNAME + "LOC =" + LOC + "]" 。 } @Override 公共 int型のハッシュコード(){ 最終 INTプライム= 31 。 int型の結果= 1 ; 結果 =プライム*結果+ DEPTNO。 結果=プライム*結果+((dnameの== nullの)0?:dname.hashCode()); 結果 =プライム*結果+((LOC == nullの)0?:loc.hashCode()); 戻り値の結果; } @Override パブリック ブール等しい(オブジェクトobj){ 場合(この == OBJ) を返す 真。 もし(OBJ == nullが) を返す 偽。 もし(のgetClass()!= obj.getClass())は 返す 偽。 DEPT他 = (DEPT)OBJ。 もし(!DEPTNO = other.deptno) を返す 偽。 もし(DNAME == nullの){ 場合(other.dname =!nullを) 返します 偽。 } それ以外の 場合(!dname.equals(other.dname)) を返す 偽。 もし(LOC == nullの){ 場合(other.loc!= nullを) 返す 偽。 } それ以外の 場合(!loc.equals(other.loc)) を返す 偽。 返す 真; } 公共部門(int型のDEPTNO、文字列DNAME、文字列LOC){ スーパー()。 この .deptno = DEPTNO。 この .dname = DNAME。 この .LOC = LOC; } 公共部門(){ スーパー()。 } }
次のようにテストクラスは次のとおりです。
パッケージcom.yc.mybatis。 インポートにjava.io.IOException; 輸入java.io.InputStreamを。 輸入java.util.HashMapを; 輸入はjava.util.List; 輸入java.util.Map; 輸入org.apache.ibatis.io.Resources。 輸入org.apache.ibatis.session.SqlSession。 輸入org.apache.ibatis.session.SqlSessionFactory; 輸入org.apache.ibatis.session.SqlSessionFactoryBuilder。 輸入org.junit.Test; パブリック クラスTestTest01 { 入力ストリームは、 = NULL ; SqlSessionFactory工場 =ヌル; SQLSESSIONセッション = nullを。 { 試みる{ である( "MyBatisの-config.xmlの" = Resources.getResourceAsStream )。 工場 = 新しい。SqlSessionFactoryBuilder()()で構築します。 セッション = factory.openSession()。 } キャッチ(IOExceptionを電子){ e.printStackTrace(); } } @Test 公共 ボイドTTest10(){ 地図 <文字列、部門>マップ= 新しいハッシュマップの<string、部門> (); map.put("v_cursor"、新部門()); session.selectOne( "TTest.callProcedure02" 、マップ); System.out.println(マップ) } }
スクリーンショットの結果、次のように:
MyBatisのがこれに基本的なストアドプロシージャを呼び出すについて、私のブログは、コメントを歓迎してください場合は何の問題もありません。