web-dev-qa-db-ja.com

MyBatis <挿入>マップされたメソッドから値を返す

My = Batisを使用してPostgreSQLデータベースにアクセスするJavaプロジェクトがあります。PostgreSQLでは、INSERTステートメントの後に新しく作成された行のフィールドを返すことができます。新しく作成されたレコードの自動生成されたBIGSERIALidを返すため、PostgreSQLの機能を使用するようにXMLのinsertコマンドを変更し、resultType="long"を追加します<insert>タグの属性、およびマッパーのJavaインターフェースで、longではなくvoidを返すように挿入メソッドを設定しました。

これを実行しようとすると、org.xml.sax.SAXParseExceptionAttribute "resultType" must be declared for element type "insert"と表示されます。

ここで、<insert>タグを<select>に変更すると、すべてが正常に機能しますが、<select>タグを使用してINSERTステートメントを実行するのは面倒です。

<insert>タグにマップされたメソッドが結果を返すようにする方法はありますか、またはMyBatisはそのように設計されていません。<select>タグとして保持する必要がありますか?

15
Idan Arye

マップされた挿入メソッドの戻り型は、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セットを生成します。

20
partlov

以下のように使用できます。 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._

4
Bhabani

挿入された1つのレコードのIDを取得する方法は2つあります(少なくとも私は知っています)。

たとえば、クラスEntityDaoがあります。

public class EntityDao {
     private Long id;
     private String name;
     // other fields, getters and setters
}

1. 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());

2. 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);
2

生成されたキーを使用することもできます。

  <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

1
agad