2012-08-24 18 views
6

Jestem nowicjuszem w mybatis. Próbuję uzyskać identyfikator ostatnio wstawionego rekordu. Moja baza danych MySQL i mój odwzorowujący XML jestUzyskaj identyfikator ostatniego wstawionego rekordu w 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> 

Myślałem pisemne oświadczenie o „SELECT LAST_INSERT_ID() jako id” powinien wrócić id ostatniej włożonej płyty, ale jestem coraz zawsze 1 po włożeniu płyty.

Moja klasa mapper.java mam metoda

int insertSelective(FileAttachment record); 

W mojej klasie dao Używam

int id = fileAttachmentMapper.insertSelective (fileAttachment);

Otrzymuję wartość Id zawsze 1 po włożeniu nowego rekordu. Moje pole ID jest automatycznie zwiększane i rekordy są wstawiane poprawnie.

Odpowiedz

13

id jest wstrzykiwany w obiekcie:

int num_of_record_inserted = fileAttachmentMapper.insertSelective(fileAttachment); 

int id = fileAttachment.getId(); 

Co selectKey robi to, aby ustawić identyfikator obiektu, który jest wstawianie, w tym przypadku w fileAttachment w jego majątku id i PO płyta jest włożona.

+0

thats great jddsantaella ... czy ten wątek jest bezpieczny? – user965884

+0

Nie wiem, ale ufam myBatis, więc powiedziałbym "tak". – jddsantaella

+0

Dobrze .. dzięki Jddsantaella – user965884

1

Myślę, że wartość 1, która jest zwracana, odnosi się do liczby rekordów, które są aktualizowane/wstawiane. Myślę, że id jest ustawiony na parametrze fileAttachment przekazanym do wywołania metody insertSelective.

+0

Dzięki za odpowiedź Ed, więc jak mogę uzyskać ten identyfikator? – user965884

6

Trzeba tylko użyć

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

Nie ma potrzeby wykonywać kwerendy wybierającej wewnątrz znacznika wstawiania w MyBatis. To zapewnia nowy parametr dla wkładki operation.Here zdefiniowania useGeneratedKeys = "true", keyProperty = "id", keyColumn = "id" .Możesz sprowadzaniu wartość dla id w następujący sposób

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

fileAttachment.getId() jest używany, ponieważ w tagu insert keyColumn = "id" jest zdefiniowany, a otrzymasz wszystkie wartości zwracane wewnątrz odwołania do pliku FileAttachment FileAttachment.

0

Mam nadzieję, że w pisarzu możesz mieć niestandardowy pisarz złożony i tam możesz uzyskać wstawione identyfikatory.

0

(1) Dodając do odpowiedzi Ruju, w instrukcji insert należy zdefiniować atrybut useGeneratedKeys = true, parameterType = "object", keyProperty = "objectId" i keyColumn = "objectId" powinny być ustawione z tym samym kluczem podstawowym nazwa kolumny (objectId) z tabeli przechowującej rekord obiektu. Podstawowa kolumna klucza (objectId) powinna być ustawiona na AUTO_INCREMENT w tabeli bazy danych.

(2) Po wywołaniu instrukcji wstawiania nowy wygenerowany klucz podstawowy (objectId) będzie przechowywany w obiekcie, a możesz go pobrać, uzyskując właściwość objectId przy użyciu tej metody (object.getObjectId() lub object.objectId). Teraz powinno to dać dokładny i wygenerowany pierwotny. To zadziałało dla mnie ...

3

W rzeczywistości MyBatis już dostarczył tę funkcję. Możesz użyć opcji: "useGeneratedKeys", aby uzyskać ostatni identyfikator wkładki.

Oto wyjaśnienie od MyBatis. (Jeśli chcesz dowiedzieć się więcej szczegółowych informacji, możesz przejść do oficjalnej strony MyBatis).

useGeneratedKeys (wstawić i aktualizować tylko) Przekazuje MyBatis użyć metody JDBC getGeneratedKeys odzyskać klucze generowane wewnętrznie przez bazę danych (np auto pola przyrost RDBMS jak MySQL lub SQL Server). Domyślnie: false

Jeśli używasz xml:

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

Jeśli używasz adnotacji:

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

Po zakończeniu wstawiania operacji metoda na fileAttachment za setId() będzie wywoływane i ustawione na identyfikator ostatnio wstawionego rekordu. Możesz użyć fileAttachment's getId(), aby uzyskać ostatni identyfikator wstawienia.

Mam nadzieję, że to ci pomoże.