2013-08-29 13 views
24

Come posso ottenere la chiave generata di un inserto con MyBatis? Ho letto molte pagine su questa domanda ma sono ancora bloccato, qualcuno potrebbe aiutarmi, per favore? Questo è il mio codice:MyBatis, come ottenere la chiave generata automaticamente di un inserto? [MySql]

La tabella:

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

Il 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; 

Il 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); 

Il 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> 

Cosa c'è che non va? Come posso ottenere la chiave generata di questo inserto? Grazie!

risposta

-1

Se si desidera ottenere la chiave primaria generata, si dovrebbe passare gli argomenti da Map o POJO Object

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

Quando chiamare il metodo di mappatura, mettere i valori per mappare.

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

Si prega di seguire i passaggi qui sotto:

  1. Creare POJO Errore con ID come attributo

  2. Sostituire returnId all'errore come sotto,

public void InsertRecord (@Param ("errore") Errore di errore, @Param ("timestamp") Timestamp timestamp, @ Param ("type") String type, @ Param ("message") String message, @ Param ("source") String source);

  1. Change keyProperty = "ID_ERROR" per keyProperty = "Errore.id"

  2. Rimuovere

    <selectKey resultType="long" order="AFTER" keyProperty="returnedId"> 
        SELECT LAST_INSERT_ID() as returnedId 
    </selectKey> 
    

Otterrete inserita id in error.id

+1

Non si dovrebbe mai usare error.id per nulla, ma il codice di errore. Hacks del genere rendono il codice sporco e illeggibile – Bostone

11

È possibile raggiungere questo obiettivo in due modi,

  1. Utilizzando useGeneratedKeys="true", keyProperty="id", keyColumn="id"

    keyProperty si riferisce al nome della variabile POJO e keyColumn si riferisce al nome della colonna generato nel database

  2. Utilizzando <selectKey/> all'interno tag insert

33

per me è lavorare in questo modo (3.x mybatis) .. L'id deve essere impostato di incremento automatico nella tabella mysql

<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" e useGeneratedKeys="true"

mia interfaccia è:

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

finalmente per ottenere il valore (che saranno assegnati automaticamente alla proprietà id del POJO) io uso:

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

Questo è molto utile. –

+0

si dovrebbe rimuovere il nome dell'oggetto, qui progetto, da keyProperty = "project.projectId" – Humoyun

3

soluzione facile:

Utilizza l'attributo KeyProperty come objectName.AutoincrementId Come sotto ...

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

0

Sotto l'Xml Mapper, utilizzare la query:

<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 laterale

@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; 
}