2013-03-16 11 views
10

Ich habe ein Java-Projekt, das MyBatis verwendet, um auf eine PostgreSQL-Datenbank zuzugreifen. Mit PostgreSQL können Felder einer neu erstellten Zeile nach einer INSERT-Anweisung zurückgegeben werden, und ich möchte damit die automatisch generierten BIGSERIAL neu erstellten Datensätze zurückgeben. Also ändere ich den insert Befehl im XML, um das Feature von PostgreSQL zu verwenden, ein resultType="long" Attribut zum <insert> Tag hinzuzufügen, und in der Java Schnittstelle des Mappers setze ich die Einfügemethode so zurück, dass long anstelle von void zurückgegeben wird.Rückgabe von Werten aus MyBatis <insert> gemappte Methoden

Wenn ich versuche, dies zu tun, bekomme ich eine org.xml.sax.SAXParseException sagen, dass Attribute "resultType" must be declared for element type "insert".

Nun, wenn ich die <insert> Tag <select> alles gut funktioniert ändern, aber es stört mich, dass ich <select>-Tag verwenden, um eine INSERT Anweisung auszuführen.

Gibt es eine Möglichkeit, Methoden auf <insert> Tags abgebildet Ergebnisse zurückgeben, oder ist MyBatis nicht dafür entworfen, und ich sollte sie einfach als <select> Tags behalten?

Antwort

13

Rückgabetyp der abgebildeten Einfügemethode kann void oder int sein (in diesem Fall wird die Nummer der eingefügten Zeile zurückgegeben). Sie können den folgenden Mechanismus tun, um erzeugt id zurück:

<insert id="insert" parameterClass="MyParameter"> 
    <selectKey order="AFTER" keyProperty="id" resultType="long"> 
    SELECT currval('my_seq') 
    </selectKey> 
    INSERT INTO mytable(col1, col2) VALUES (#{val1}, #{val2}) 
</isnert> 

Dies wird id Spalte id Eigenschaft Ihrer Parameterklasse erzeugten Satz. Danach wird das Objekt, das Sie als Parameter übergeben haben, in seiner Eigenschaft id gesetzt.

+0

Ich sehe. Gibt es eine Möglichkeit, dies mit PostgreSQL 'RETURNING' Syntax zu verwenden? –

+2

Sie können versuchen, add 'useGeneratedKeys =" true "keyColumn =" id "keyProperty =" id "'. Ich habe das nie benutzt, aber es sollte funktionieren. Keine Notwendigkeit, in der Abfrage zurück zu geben, lassen Sie diesen Job JDBC-Treiber und MyBatis tun. Weitere Informationen finden Sie unter [this link] (http://edwin.baculsoft.com/2010/12/beginning-mybatis-3-part-3-how-to-get-tables-generated-ids/). – partlov

+0

OK, ich sah [diese Dokumente] (http://www.mybatis.org/generator/configreference/generatedKey.html) und es sieht so aus, als ob es im Wesentlichen die gleiche Sache - führt eine zweite Abfrage, um den Schlüssel abzurufen. Es ist auch nicht für PostgreSQL definiert, was sinnvoll ist - da Sie in PostgreSQL den Schlüssel von derselben Abfrage erhalten können, die die Zeile eingefügt hat. –

4

Sie können wie folgt verwenden. In xml

<insert id="insertNewUser" parameterType="User"> 
      <selectKey keyProperty="userId" resultType="Integer" order="BEFORE"> 
       select NEXTVAL('base.user_id_seq') 
      </selectKey> 
      INSERT INTO base.user(
       user_id, user_name) 
      VALUES (#{userId}, #{userName}); 
    </insert> 

In Java-Klasse von wo aus man die Methode aufgerufen haben einfügen, können Sie den Wert erhalten, indem user.getUserId() aufrufen.

Grundsätzlich wird das nächste val in der Variablen des Objekts gespeichert. Here userId inside User.

1

Sie können auch generierten Schlüssel verwenden:

<insert id="create" parameterType="Skupina" useGeneratedKeys="true" keyColumn="id" keyProperty="id"> 
     INSERT INTO ODBOR 
      (NAZEV, POPIS, ZKRATKA, WEBROLE, JEODBOR, AKTIVNI) 
     VALUES 
      (#{nazev}, #{popis}, #{webrole}, #{webrole}, false, #{aktivni}) 
    </insert> 

Nach dem Einfügen der Parameter hat die Eigenschaft id Set Wert aus Spalte id.

Verwandte Themen