2013-03-16 39 views
10

Ben PostgreSQL'i erişmek için MyBatis kullanan bir Java projesi var. PostgreSQL bir INSERT ifadesinden sonra yeni oluşturulan satır alanları dönmek için izin verir ve ben dönmek için kullanmak istiyorum otomatik oluşturulan yeni oluşturulan kayıtların BIGSERIALid. Yani, PostgreSQL özelliğini kullanmak için XML'de insert komutunu değiştirin, <insert> etiketine resultType="long" özniteliği ekleyin ve eşleştiricinin Java arabiriminde, void yerine long dönmek için ekleme yöntemini ayarlayın. dönen değerleri

Bunu çalıştırmayı

, ben Attribute "resultType" must be declared for element type "insert" söyleyerek bir org.xml.sax.SAXParseException olsun. Ben <insert> etiketi <select> için her şey iyi çalışır değiştirmek, ancak ben bir INSERT ifadeyi gerçekleştirmek için <select> etiketi kullanmak beni rahatsız ediyor Şimdi

.

<insert> etiketlerinin sonuçları döndüren yöntemler oluşturmanın bir yolu var mı, yoksa MyBatis bunun için tasarlanmamış mıdır ve onları yalnızca <select> etiketleri olarak tutmalıyım?

cevap

13

Eşleşen ekleme yönteminin türü void veya int olabilir (bu durumda, eklenen satırın sayısını döndürür). Sen oluşturulan kimliği dönmek için aşağıdaki mekanizma yapabilirsiniz: Bu parametre sınıfının id kolon id mülkü oluşturulan biçimde ayarlanır

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

. Bundan sonra, parametre olarak ilettiğiniz nesne, kendi özelliğinde id kümesini oluşturacaktır.

+0

Görüyorum. Bunu PostgreSQL'in “RETURNING” sözdizimi ile kullanmanın bir yolu var mı? –

+2

"useGeneratedKeys =" true "keyColumn =" id "keyProperty =" id "' adlı öğeyi ekleyebilirsiniz. Bunu hiç kullanmadım ama işe yaramalı. Sorguda 'returnning 'kullanılmasına gerek yok, bu işin JDBC sürücüsü ve MyBatis yapmasına izin verin. Daha fazla yardım için [bu bağlantı] bölümüne bakın (http://edwin.baculsoft.com/2010/12/beginning-mybatis-3-part-3-how-to-get-tables-generated-ids/). – partlov

+0

Tamam, [bu dokümanlar] 'a baktım (http://www.mybatis.org/generator/configreference/generatedKey.html) ve temelde aynı şey gibi görünüyor - anahtarı almak için ikinci bir sorgu çalıştırıyor. Ayrıca, PostgreSQL için tanımlanmış değildir, bu da mantıklıdır - çünkü PostgreSQL'te anahtarı, satırın içine eklenmiş aynı sorgudan alabilirsiniz. Birlikte sorguyu yürütmek istediğinizde –

4

Aşağıdakileri kullanabilirsiniz. Eklemek yöntemi çağrıda yerden Java sınıfında

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

xml

olarak, user.getUserId() arayarak değer elde edebilirsiniz.

Temel olarak aşağıdaki val nesnesinin değişkeni içinde saklanır. Here userId inside User.

1

Ayrıca oluşturulan tuşlarını kullanabilirsiniz: ekin sonra

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

, parametre özelliği Kimliği sütununda id gelen değere kümesi vardır.