web-dev-qa-db-ja.com

MyBatis、挿入の自動生成キーを取得する方法は? [MySql]

myBatisで挿入の生成されたキーを取得するにはどうすればよいですか?この質問について多くのページを読みましたが、まだブロックされています。誰か助けてください。これは私のコードです:

テーブル:

ID_ERROR long primary key
DATE timestamp
TYPE varchar
MESSAGE varchar
SOURCE varchar

Dao:

Long returnedId = 0L;
MyMapper myMapper = this.sqlSession.getMapper(MyMapper.class);
myMapper.insertRecord(returnedId, Utils.now(), t.getClass().getName(), t.getMessage(), c.getName());
return returnedId;

Mapper.Java:

public void insertRecord(@Param("returnedId") Long returnedId, @Param("timestamp")Timestamp timestamp,@Param("type") String type,@Param("message") String message,@Param("source") String source);

Mapper.xml

 <insert id="insertRecord" parameterType="map" useGeneratedKeys="true"  keyProperty="ID_ERROR">
    INSERT INTO errors (
        DATE,
        TYPE,
        MESSAGE,
        SOURCE
    )
    VALUES (
        #{timestamp},
        #{type},
        #{message},
        #{source}
    )
    <selectKey resultType="long" order="AFTER" keyProperty="returnedId">
        SELECT LAST_INSERT_ID() as returnedId
    </selectKey>
</insert>

なにが問題ですか?この挿入の生成されたキーを取得するにはどうすればよいですか?ありがとう!

30
user2572526

私にとっては、このように動作しています(mybatis 3.x).. mysqlテーブルでidを自動インクリメントに設定する必要があります

<insert id="createEmpty" parameterType="Project" useGeneratedKeys="true" keyProperty="project.projectId" keyColumn="PROJECT_ID">
    INSERT INTO PROJECT (TITLE,DESCRIPTION)
    VALUES
    (#{title},#{description})
</insert>

[〜#〜] note [〜#〜]keyProperty="project.projectId"およびuseGeneratedKeys="true"

私のインターフェースは:

public int createEmpty(@Param("project") Project project, @Param("title") String title,
    @Param("description") String description);

最後に値を取得するために(自動的にpojoのidプロパティに割り当てられます)私は使用します:

projectRepository.createEmpty(p, "one", "two");
System.err.print(p.getProjectId() + "\n");
48
T M

これは2つの方法で実現できます。

  1. useGeneratedKeys="true", keyProperty="id", keyColumn="id"を使用して

    keyPropertyはPOJO変数名を指し、keyColumnはデータベースで生成された列名を指します

  2. 挿入タグ内で<selectKey/>を使用することにより

13
bharanitharan

簡単な解決策:

KeyProperty属性をobjectName.AutoincrementIdとして使用します以下のように...

useGeneratedKeys="true", KeyProperty="person.id", KeyColumn="id"

5

MyBatis documentationuseGeneratedKeysおよびkeyPropertyは、少なくとも自動インクリメントデータを取得するために必要なものです(データベースによっては、keyColumnを追加する必要があります)。

ご覧のとおり、useGeneratedKeysは、データベースのJDBCのgetGeneretadKeysメソッドが実装されているかどうかによって異なります。

たとえば、 mysql またはH2の場合、getGeneretadKeysは1列のみをサポートします。最後に生成されたキーは、getGeneretadKeysによって返されるキーになります。

結論として、あなたのケースではuseGeneratedKeysとkeyPropertyのみを追加する必要があります(ID_ERROR auto_incrementを使用):

Mapper.xml

<resultMap type='pathToJavaClass/Error' id='error'>
    <id property='id' column='ID_ERROR' />
    <result property='timestamp' column='DATE' />
    <result property='type' column='TYPE'/>
    <result property='message' column='MESSAGE'/>
    <result property='source' column='SOURCE'/>
</resultMap>
<insert id="insertRecord" parameterType="error" useGeneratedKeys="true" keyProperty="id">
INSERT INTO errors (
    DATE,
    TYPE,
    MESSAGE,
    SOURCE
)
VALUES (
    #{timestamp},
    #{type},
    #{message},
    #{source}
)
</insert>

Interface.Java

public void insertRecord(@Param("error") Error error);

それでも生成されたキーを取得するための問題が発生する場合は、mysqlのJDBCのドキュメントも確認してください(古いバージョンではgetGeneretadKeysが実装されていない場合があります)。

3
Audrey Carval

Xmlファイルで5行以下に配置します。

<insert id="createPet" parameterType="Java.util.Map"
    useGeneratedKeys="true" keyProperty="id">
    INSERT INTO Pet (NAME, OWNER, SPECIES, SEX, BIRTH)
    VALUES (#{name}, #{owner}, #{species}, #{sex}, #{birth})
</insert>

Javaメインクラスでこのメソッドを作成し、メインメソッドで呼び出します。

public int createPet(PetDVO petDVO) throws Exception {
    HashMap<String, Object> inputMap = new HashMap<String, Object>();
    inputMap.put("name", petDVO.getName());
    inputMap.put("owner", petDVO.getOwner());
    inputMap.put("species", petDVO.getSpecies());
    inputMap.put("sex", petDVO.getSex());
    inputMap.put("birth", petDVO.getBirth());

    /**
     * Get the sql session and commit the data
     */
    SqlSession sqlSession = getSqlSession();
    sqlSession.insert("createPet", inputMap);
    sqlSession.commit();

    BigInteger newID = (BigInteger)inputMap.get("id");
    return newID.intValue();
}

ただし、PetDVOクラスを自分で作成する必要があります。それだ。

2
Park JongBum

マッパーXmlの下で、クエリを使用します。

    <insert id="saveDemo" parameterType="com.abc.demo"
       useGeneratedKeys="true" keyProperty="demoId" keyColumn="DEMOID">
       INSERT INTO TBL_DEMO (DEMONAME,DEMODESCRIPTION)
       VALUE (#{demoName},#{demoDescription})
       <selectKey keyProperty="demoId" resultType="int" order="AFTER">
        SELECT LAST_INSERT_ID();
       </selectKey>
    </insert>

Java側

@Override
public boolean saveDemo(Demo demo) {
    boolean status = false;
    SqlSession session = this.sqlSessionFactory.openSession();
    try {
        DemoMapper mapper = session.getMapper(DemoMapper.class);
        mapper.saveDemo(demo);
        session.commit();
        status = true;
    } catch(PersistenceException e) {
        System.out.println(e);
    } finally {
        session.close();
    }
    return status;
}
0
Shubham Verma