MyBatisでOracleのストアドプロシージャ・ストアドファンクションを実行する

posted in: Java | 0

松山事務所の石丸です。
MyBatisでOracleのストアドプロシージャ・ストアドファンクションを実行するのに苦労したので記事にしました。
MyBatisのバージョンは3.4(SpringBootプロジェクトでmybatis-spring-boot-starter:1.3.1)になります。

ストアドプロシージャの呼び出し方

例えば次のようなプロシージャを呼び出す場合。

モデルクラスを作成せずにMapでIN/OUTを受け取ってみます。

mapperの定義では statementTypeに "CALLABLE" を指定します。
OUTパラメータを受け取るために、普段は省略している mode を指定します。

呼び出し例

INパラメータだけ設定してプロシージャを呼び出すと、OUTパラメータが設定されて返ってきます。

ストアドファンクションの呼び出し方

例えばこんなファンクションを呼び出す場合。

ここで気を付けるのは戻り値の型です。
呼び出すストアドファンクションはNUMBERを返しますが、その戻り値はparametersで受け取るため、mapperの戻り値はvoidです。

mapperの定義ではcallの結果をRESULTで受けとるように記述します。

(今ふと思ったのですが、もしかしたら resultType="java.lang.Integer" にしたらRESULTへの代入なしにInteger返してくれたりして。。。)

呼び出し例

mapなのが嫌だ

せっかく型のある言語なのでちゃんとモデルクラスを定義してみます。
例えばこんなプロシージャ。

IN/OUTを1つのクラスで渡して受け取る

呼び出し例

IN/OUTをそれぞれを別のクラスにしてみる

複数オブジェクトを渡す場合は、オブジェクトを区別するために@Paramで名前を付けます。

mapper.xml側では@Paramで指定された名前を使用してオブジェクトが区別できます。

呼び出し例

LINEで送る
Pocket