Baru-baru ini, karena kebutuhan bisnis dalam sistem e-commerce, saya perlu kembali ke ID produk setelah memasukkan informasi produk. Pada awalnya, saya menemukan beberapa jebakan, jadi saya membuat catatan di sini untuk mencegahnya dilupakan di masa depan.
Dapatkan kunci primer yang dimasukkan seperti kode berikut
Pengguna pengguna = pengguna baru (); user.setusername ("chenzhou"); user.setPassword ("xxxx"); user.setComment ("Tes fungsi memasukkan data untuk mengembalikan kunci primer"); System.out.println ("Kunci utama sebelum penyisipan adalah:"+user.getUserId ()); userdao.insertandgetId (user); // masukkan operasi sistem.out.println ("Kunci utama setelah penyisipan adalah:"+user.getUserId ());Setelah meminta informasi online, saya menemukan bahwa ada sekitar dua cara.
Metode 1:
Dalam file pemetaan kelas entitas "*mapper.xml" ditulis seperti ini:
<masukkan id = "insertAndgetId" useGeneratedKeys = "true" keyproperty = "userid" parameterType = "com.chenzhou.mybatis.user"> masukkan ke pengguna (nama pengguna, kata sandi, komentar) (#{username},#{kata sandi},#{komentar}) </insert>Tips:
UsegeneratedKeys = "Benar" berarti mengatur pertumbuhan diri untuk kunci utama
KeyProperty = "UserId" berarti menetapkan ID yang tumbuh ke bidang UserID di kelas entitas.
ParameterType = "com.chenzhou.mybatis.user" Properti ini menunjuk ke kelas entitas parameter yang diteruskan
Berikut ini adalah pengingat bahwa tidak ada atribut Hasil Hasil di <sert> </sert>, jadi jangan tambahkan secara acak.
Uerid di kelas entitas harus memiliki getter () dan setter (); metode
Karena saya sudah mengatur pertumbuhan diri saat membangun tabel di database MySQL, saya akhirnya memilih metode kedua.
Metode kedua:
Juga dalam file pemetaan "*mapper.xml" dari kelas entitas, tetapi harus ditulis seperti ini:
<!-Masukkan produk-> <masukkan id = "insertProduct" parameTerType = "domain.model.productbean"> <selectKey resultType = "java.lang.long" order = "setelah" keyproperty = "productId"> last_insert_id () </selectkey> masukkan ke dalam t_product (ProductName, ProductDesRCible, MerchantID) Values (#{ProductName},#{ProductDesRCible},#{MerchantId}); </sert>Tips:
Tidak ada atribut Hasil Hasil di <serter> </sert>, tetapi ada tag <spilihKey> </filihKey>.
order = "After" berarti bahwa pernyataan insert dieksekusi terlebih dahulu, dan kemudian pernyataan kueri dieksekusi.
Dapat diatur ke sebelum atau sesudah.
Jika diatur ke sebelumnya, pertama -tama akan memilih kunci utama, atur KeyProperty dan kemudian jalankan pernyataan INSERT.
Jika diatur ke setelah, lalu jalankan pernyataan insert terlebih dahulu, dan kemudian elemen terpilih - mirip dengan database Oracle, Anda dapat menanamkan panggilan urutan dalam pernyataan insert, seperti dalam database Oracle.
KeyProperty = "UserId" berarti menetapkan ID yang tumbuh ke bidang UserID di kelas entitas.
SELECT LAST_INSERT_ID () berarti bahwa ID pertumbuhan diri dari catatan yang baru saja dimasukkan ditanyakan dalam sintaks MySQL.
Uerid di kelas entitas harus memiliki getter () dan setter (); metode
Untuk mencapai persyaratan, di atas sudah cukup.
Jika Anda tertarik di sini, silakan terus dengarkan saya tentang kemungkinan kesalahan di mybatis.
Mengapa modifikasi metode penambahan di MyBatis memiliki nilai pengembalian, meskipun meminta database penyisipan berhasil dan data yang dimasukkan dapat dibaca, tetapi ketika Anda membuka database, Anda tidak dapat melihat data yang dimasukkan?
Jika Anda ingin memasukkan dan mengembalikan kunci utama saat menerapkan persyaratan di atas, ingatlah untuk tidak menulis dengan cara ini.
@Override Public Long InsertProduct (ProductBean ProductBean) {// TODO METODE AUTO-DEPAN SQLSESSION METODE SQLSESSION = myBATISJDBCUTIL.CURRENSSESSION (); ProductIdao ProductIdao = session.getMapper (ProductIdao.class); // di sini *.class // itu harus sesuai dengan lapisan antarmuka DAO return productidao.insertProduct (ProductBean); }Mengapa?
Karena jika Anda menulis seperti di atas, pengembalian ID kunci utama yang Anda inginkan setelah eksekusi bukanlah jumlah baris yang terpengaruh setelah menjalankan pernyataan database.
Selain itu, setelah Anda mengeksekusi, Anda akan menemukan bahwa prompt berhasil dimasukkan, dan Anda juga dapat membaca data yang dimasukkan dengan kode, tetapi selalu ada satu catatan.
Selain itu, ketika Anda membuka database, Anda akan menemukan bahwa tidak ada data yang dimasukkan dengan sukses dalam database.
Saya mengalami depresi di sini untuk waktu yang lama dan akhirnya menemukan poin kunci.
Perbedaan antara memiliki nilai pengembalian dan tidak memiliki nilai pengembalian adalah:
Nilai pengembalian hanya untuk mengakses mode baca database, dan tidak akan ada modifikasi pada data database, seperti berbagai metode kueri.
Jika tidak ada nilai pengembalian, database akan diakses dalam mode baca dan tulis, dan data dalam database akan dimodifikasi, seperti penghapusan dan penambahan.
Selain itu, menurut pemahaman pribadi, MyBatis harus terlebih dahulu mensy.
session.commit (); Mybatisjdbcutil.closesession ();
Dua pernyataan di atas tidak dikembalikan, yang berarti bahwa hanya setelah kedua pernyataan ini dieksekusi, mereka akan benar -benar dieksekusi dan dimasukkan ke dalam database dan memodifikasi data dalam database.
Sebaliknya, jika ada nilai pengembalian, kedua pernyataan ini tidak dijalankan, sehingga pernyataan penambahan hanya dieksekusi dalam sesi yang dibangun dengan sendirinya, tetapi tidak diserahkan ke database, sehingga tidak ada catatan dalam database.
Ini menjelaskan mengapa setelah memodifikasi metode penambahan di MyBatis untuk memiliki nilai pengembalian, meskipun ia meminta basis data dimasukkan dengan sukses, Anda tidak dapat melihat data yang dimasukkan ketika Anda membuka database.
Metode Pernyataan Penyisipan di MyBatis seharusnya tidak memiliki nilai pengembalian, karena menulis seperti ini benar.
@Override public void InsertProduct (ProductBean ProductBean) {// TODO Metode yang dihasilkan secara otomatis Stub SQLSESSION SESSION = MyBATISJDBCUTIL.CURRENTSESSION (); ProductIdao productIdao = session.getMapper (productIdao.class); // di sini *.class // harus sesuai dengan lapisan antarmuka DAO productidao.insertProduct (ProductBean); session.commit (); Mybatisjdbcutil.closesession (); }Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.