Oracle
テーブルにデータを挿入しているのでid
、挿入された行のを取得する必要があります。これid
はシーケンスによって生成され、トリガーによってテーブルに挿入されます。
を使用して挿入された行のIDを取得する方法はいくつかありますがJDBC
、コマンドMyBatis
を実行してINSERT
いるため、データを挿入した後にIDを取得する方法がわからないようです。アドバイスをいただければ幸いです。
このようなものが機能するはずです
class User {
int userId
...
}
<insert id="addUser" useGeneratedKeys="true" keyColumn="user_id" keyProperty="userId">
INSERT INTO user(login, name,...) VALUES(#{login}, #{name},...
</insert>
私にとってはこのように機能します(mybatis 3)
<insert id="create" parameterType="Project" useGeneratedKeys="true" keyProperty="project.projectId" keyColumn="PROJECT_ID">
INSERT INTO PROJECT (TITLE,DESCRIPTION)
VALUES
(#{title},#{description})
</insert>
selectKeyは必要ありません。keyPropertyに正しい値を入力してください。oracleに挿入する前に、シーケンスから次のIDを取得するためのトリガーがあります。
あるいは、これも機能します。
<insert id="createEmpty" statementType="CALLABLE" parameterType="Panelist">
BEGIN INSERT INTO PANELIST(PANEL_ID) VALUES (#{panelId})
RETURNING PANELIST_ID INTO
#{panelist.panelistId,mode=OUT,jdbcType=INTEGER}; END;
</insert>
トリガーがid_seqOracleシーケンスを使用してIDを取得するとします。同じデータベースセッションを使用してMyBatisから実行する場合、SQL
select id_seq.currval from dual;
使用したIDを取得します。
オラクルでは、2つのフェーズでそれを行う方が良いでしょう。うまく機能し、価格はもう1つのマッパーだけです:
第1段階:
<?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.sample.work.dao.SequencerMapper" >
<select id="selectNextId" resultType="long" >
select seq_sample.nextval from dual
</select>
</mapper>
seqを取得し、オブジェクトプレースホルダーに入れて
第2フェーズ:
オブジェクトを挿入します