My = Batisを使用してPostgreSQLデータベースにアクセスするJavaプロジェクトがあります。PostgreSQLでは、INSERT
ステートメントの後に新しく作成された行のフィールドを返すことができます。新しく作成されたレコードの自動生成されたBIGSERIAL
id
を返すため、PostgreSQLの機能を使用するようにXMLのinsert
コマンドを変更し、resultType="long"
を追加します<insert>
タグの属性、およびマッパーのJavaインターフェースで、long
ではなくvoid
を返すように挿入メソッドを設定しました。
これを実行しようとすると、org.xml.sax.SAXParseException
にAttribute "resultType" must be declared for element type "insert"
と表示されます。
ここで、<insert>
タグを<select>
に変更すると、すべてが正常に機能しますが、<select>
タグを使用してINSERT
ステートメントを実行するのは面倒です。
<insert>
タグにマップされたメソッドが結果を返すようにする方法はありますか、またはMyBatisはそのように設計されていません。<select>
タグとして保持する必要がありますか?
マップされた挿入メソッドの戻り型は、void
またはint
です(この場合、挿入された行の数が返されます)。次のメカニズムを実行して、生成されたIDを返すことができます。
<insert id="insert" parameterClass="MyParameter">
<selectKey order="AFTER" keyProperty="id" resultType="long">
SELECT currval('my_seq')
</selectKey>
INSERT INTO mytable(col1, col2) VALUES (#{val1}, #{val2})
</isnert>
これにより、生成されたid
列がパラメータークラスのid
プロパティに設定されます。その後、パラメーターとして渡したオブジェクトは、そのプロパティにid
セットを生成します。
以下のように使用できます。 XMLで
_ <insert id="insertNewUser" parameterType="User">
<selectKey keyProperty="userId" resultType="Integer" order="BEFORE">
select NEXTVAL('base.user_id_seq')
</selectKey>
INSERT INTO base.user(
user_id, user_name)
VALUES (#{userId}, #{userName});
</insert>
_
Java挿入するメソッドを呼び出した場所からのクラスでは、user.getUserId()
を呼び出すことで値を取得できます。
基本的に、次のvalはオブジェクトの変数内に格納されます。 _Here userId inside User.
_
挿入された1つのレコードのIDを取得する方法は2つあります(少なくとも私は知っています)。
たとえば、クラスEntityDao
があります。
public class EntityDao {
private Long id;
private String name;
// other fields, getters and setters
}
insert
タグを使用してオブジェクトのインスタンスを返すMyBatisインターフェース
public interface EntityDaoMapper {
EntityDao insert(EntityDao entity);
}
MyBatis XMLマッパー:
<insert id="insert" parameterType="com.package.EntityDao" useGeneratedKeys="true" keyColumn="entity_id" keyProperty="id">
INSERT INTO some_table (name, type, other_fields, etc)
VALUES (#{name}, #{type}, #{other_fields}, #{etc})
</insert>
サンプルコード:
EntityDao saved = entityDaoMapper.insert(entityToSave);
System.out.println(saved.getId());
select
およびresultType
タグを使用して、レコードのIDのみを返すMyBatisインターフェース
public interface EntityDaoMapper {
Long insert(EntityDao entity);
}
MyBatis XMLマッパー:
<select id="insert" parameterType="com.package.EntityDao" resultType="long">
INSERT INTO some_table (name, type, other_fields, etc)
VALUES (#{name}, #{type}, #{other_fields}, #{etc})
RETURNING entity_id <-- id only or many fields
</select>
サンプルコード:
Long id = entityDaoMapper.insert(entityToSave);
System.out.println(id);
生成されたキーを使用することもできます。
<insert id="create" parameterType="Skupina" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
INSERT INTO ODBOR
(NAZEV, POPIS, ZKRATKA, WEBROLE, JEODBOR, AKTIVNI)
VALUES
(#{nazev}, #{popis}, #{webrole}, #{webrole}, false, #{aktivni})
</insert>
挿入後、パラメーターにはプロパティidが列の値に設定されますid。