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>
なにが問題ですか?この挿入の生成されたキーを取得するにはどうすればよいですか?ありがとう!
私にとっては、このように動作しています(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");
これは2つの方法で実現できます。
useGeneratedKeys="true", keyProperty="id", keyColumn="id"
を使用して
keyProperty
はPOJO変数名を指し、keyColumn
はデータベースで生成された列名を指します
挿入タグ内で<selectKey/>
を使用することにより
簡単な解決策:
KeyProperty
属性をobjectName.AutoincrementId
として使用します以下のように...
useGeneratedKeys="true", KeyProperty="person.id", KeyColumn="id"
MyBatis documentation 、useGeneratedKeysおよび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が実装されていない場合があります)。
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クラスを自分で作成する必要があります。それだ。
マッパー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;
}