2013-08-29 46 views
24

我怎樣才能使用MyBatis獲得插入的生成密鑰? 我看了很多關於這個問題的網頁,但我仍然被封鎖,有人能幫助我嗎? 這是我的代碼:MyBatis,如何獲取插入的自動生成密鑰? [MySql]

表:

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

的道:

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> 

有什麼問題?我怎樣才能得到這個插入的生成密鑰? 謝謝!

回答

-1

如果你想獲得生成的主鍵,你應該MapPOJO Object

public void insertRecord(Map<String, Object> map); 

傳遞參數當調用映射方法,把值映射。

Map<String, Object> map = new HashMap<String, Object>(); 
map.put("returnedId", 0); 
map.put("message", message); 
// other paramters 
mapper.insertRecord(map); 
return map.get("returnedId"); 
-1

請按照下列步驟操作:

  1. 的屬性

  2. 與ID創建錯誤POJO更換returnId到如下錯誤,

公共無效insertRecord (@Param(「error」)錯誤錯誤,參數(「時間戳」)時間戳記時間戳,@參數(「類型」)字符串 類型,@參數(「消息」)字符串消息,@參數(「源」)字符串源);

  • 變化keyProperty = 「ID_ERROR」 到keyProperty =「錯誤。ID」

  • 刪除

    <selectKey resultType="long" order="AFTER" keyProperty="returnedId"> 
        SELECT LAST_INSERT_ID() as returnedId 
    </selectKey> 
    
  • 您將在error.id

    +1

    一個不應該使用error.id任何東西,但錯誤ID。像這樣的黑客使代碼變得骯髒和難以辨認 – Bostone

    11

    您可以通過兩種方式實現這一目標得到插入id

    1. 通過使用useGeneratedKeys="true", keyProperty="id", keyColumn="id"

      keyProperty指POJO變量名和keyColumn是指生成的列名在數據庫

    2. 通過使用<selectKey/>插入標籤

    33

    內對我來說是這樣工作(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> 
    

    NOTEkeyProperty="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"); 
    
    +0

    這非常有用。 –

    +0

    您應該從keyProperty =「project.projectId」中刪除對象名稱,這裏是項目, – Humoyun

    3

    簡單的解決方案:

    使用KeyProperty屬性作爲objectName.AutoincrementId 如下所示...

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

    0

    下的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; 
    } 
    
    相關問題