2012-08-24 15 views
6

Sono novizio di mybatis. Sto cercando di ottenere l'id dell'ultimo record inserito. Il mio database è MySQL e il mio mapper XML èOttieni l'ID dell'ultimo record inserito in mybatis

<insert id="insertSelective" parameterType="com.mycom.myproject.db.mybatis.model.FileAttachment" > 
    <selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER" > 
    SELECT LAST_INSERT_ID() as id 
</selectKey> 
insert into fileAttachment 
<trim prefix="(" suffix=")" suffixOverrides="," > 
    <if test="name != null" > 
    name, 
    </if> 
    <if test="attachmentFileSize != null" > 
    size, 
    </if>  
</trim> 
<trim prefix="values (" suffix=")" suffixOverrides="," > 
    <if test="name != null" > 
    #{name,jdbcType=VARCHAR}, 
    </if> 
<if test="attachmentFileSize != null" > 
    #{attachmentFileSize,jdbcType=INTEGER}, 
    </if> 
</trim> 
</insert> 

ho pensato dichiarazione scritta qui 'SELECT LAST_INSERT_ID() come id' dovrebbe restituire id dell'ultimo record inserito, ma sto ottenendo sempre 1 dopo aver inserito il record.

La mia classe mapper.java Ho metodo

int insertSelective(FileAttachment record); 

Nella mia classe dao sto usando

int id = fileAttachmentMapper.insertSelective (fileAttachment);

Ricevo il valore di Id sempre 1 quando si inserisce un nuovo record. il mio campo ID è incrementato automaticamente e i record si stanno inserendo correttamente.

risposta

13

L'ID viene iniettato nell'oggetto:

int num_of_record_inserted = fileAttachmentMapper.insertSelective(fileAttachment); 

int id = fileAttachment.getId(); 

Nei selectKey fa è impostare l'id nell'oggetto si sta inserendo, in questo caso in fileAttachment nella sua struttura id e dopo l'inserimento record.

+0

thats great jddsantaella ... questo thread è sicuro? – user965884

+0

Non lo so, ma mi fido di myBatis, quindi direi di si. – jddsantaella

+0

Bene .. grazie Jddsantaella – user965884

1

Penso che il 1 che viene restituito si riferisce al numero di record che viene aggiornato/inserito. Penso che l'id sia impostato sul parametro fileAttachment che hai passato alla chiamata per insertSelective.

+0

Grazie per la risposta Ed, quindi come posso ottenere quell'Id? – user965884

6

Hai solo bisogno di utilizzare

<insert id="insert" parameterType="com.mycom.myproject.db.mybatis.model.FileAttachment" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> 

v'è alcuna necessità di eseguire query di selezione all'interno del tag inserto in MyBatis. Esso fornisce nuovo parametro per l'inserimento operation.Here definire useGeneratedKeys = "true", keyProperty = "id", KeyColumn = "id" .È possibile retrive rapporto qualità-id in modo seguente

FileAttachment fileAttachment=fileAttachmentMapper.insertSelective(fileAttachment); 
    Integer id=fileAttachment.getId(); 

fileAttachment.getId() è usato perché nel tag insert keyColumn = "id" è definito e otterrete tutti i valori di ritorno all'interno del riferimento fileAttachment di FileAttachment.

0

Spero che nello scrittore, puoi avere uno scrittore composito personalizzato e lì puoi ottenere gli ID inseriti.

0

(1) Aggiunta alla risposta di Ruju, nell'istruzione di inserimento è necessario definire l'attributo useGeneratedKeys = true, parameterType = "object", keyProperty = "objectId" e keyColumn = "objectId" deve essere impostato con la stessa chiave primaria nome della colonna (objectId) dalla tabella che memorizza il record dell'oggetto. La colonna della chiave primaria (objectId) deve essere impostata su AUTO_INCREMENT nella tabella del database.

(2) Quando viene attivata l'istruzione di inserimento, la nuova chiave primaria generata (objectId) verrà archiviata nell'oggetto e sarà possibile recuperarla accedendo alla proprietà objectId tramite questi metodi (object.getObjectId() o object.objectId). Ora questo dovrebbe dare il primario generato esattamente e nuovo. Ha funzionato per me ....

3

Infatti, MyBatis ha già fornito questa funzione. È possibile utilizzare l'opzione: "useGeneratedKeys" per ottenere l'ultimo ID di inserimento.

Ecco la spiegazione da MyBatis. (Se vuoi sapere informazioni più dettagliate, puoi andare alla pagina ufficiale di MyBatis).

useGeneratedKeys (inserimento e aggiornamento) Dice MyBatis di utilizzare il metodo JDBC getGeneratedKeys per recuperare le chiavi generate internamente dal database (ad esempio auto i campi di incremento in RDBMS come MySQL o SQL Server). Predefinito: false

Se si utilizza xml:

<insert id="" parameterType="" useGeneratedKeys="true"> 

Se si utilizza l'annotazione:

@Insert("your sql goes here") 
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") 
int insert(FileAttachment fileAttachment) throws Exception; 

Una volta terminata operazione di inserimento, il metodo del fileAttachment setId() sarà invocato ed è impostato sull'ID dell'ultimo record inserito. È possibile utilizzare il file getId() di fileAttachment per ottenere l'ultimo ID di inserimento.

Spero che questo ti possa aiutare.

Problemi correlati