Objek pengumpulan daftar dienkapsulasi dalam program, dan kemudian entitas dalam koleksi perlu dimasukkan ke dalam database. Karena proyek menggunakan konfigurasi Spring+MyBatis, direncanakan untuk menggunakan penyisipan batch MyBatis. Karena belum ada pemasangan batch sebelumnya, saya akhirnya menerapkannya setelah mencari beberapa informasi di internet dan memposting proses terperinci.
Struktur TrainRecord kelas entitas adalah sebagai berikut:
Public Class TrainRecord mengimplementasikan Serializable {private static final long serialversionuid = -1206960462117924923l; ID Panjang Pribadi; aktivitas panjang pribadi; Private Long Empid; bendera int pribadi; Private String AddTime; // setter and getter} Mapper.xml yang sesuai didefinisikan sebagai berikut:
<resultMap type = "trainrecord" id = "trainRecordResultMap"> <id kolom = "id" properti = "id" jdbctype = "bigint" /> <column hasil = "add_time" properti = "addTime" jdbctype = "varchar" /> <hasil kolom = "emper_id" properti "jdbctype =" varchar " /> <hasil hasil =" emper_id "properti" jdbctype = "varchar" properti = "ActivityId" jdbctype = "bigint" /> <column hasil = "aktivitas_id" properti = "ActivityId" jdbctype = "bigint" /> <column column = "flag" properti = "status" jdbctype = "varchar" /< /resultMap>
Definisi metode penyisipan batch di mapper.xml adalah sebagai berikut:
<masukkan id = "addtrainrecordBatch" useGeneratedKeys = "true" parameTerType = "java.util.list"> <selectKey resultType = "long" keyproperty = "id" order = "after"> last_insert_id () </selectKey> masukkan ke dalam t_train_record (tambahan, add_time, tambahan, add -list_time () </selectkey> for Activity, forcord, add -eveleach, for list_id, eveleach, for list_lEach, for " item = "item" index = "index" sparator = ","> (#{item.addtime},#{item.empid},#{item.activityId},#{item.flag}) </foreach> </insert>Penjelasan tag foreach direferensikan informasi online, sebagai berikut:
Foreach terutama digunakan dalam membangun dalam kondisi, dapat mengulangi koleksi dalam pernyataan SQL. Atribut elemen foreach terutama mencakup item, indeks, koleksi, terbuka, pemisah, dan tutup. Item mewakili alias ketika setiap elemen dalam koleksi diulang. Indeks menentukan nama untuk mewakili posisi yang setiap iterasi dicapai selama proses iterasi. Open mewakili apa yang dimulai dengan pernyataan, pemisah mewakili simbol apa yang digunakan sebagai pemisah antara setiap iterasi, dan Close mewakili apa yang diakhiri dengan. Hal yang paling kritis dan paling rawan kesalahan saat menggunakan foreach adalah atribut koleksi. Atribut ini harus ditentukan, tetapi dalam kasus yang berbeda, nilai atribut berbeda. Ada tiga situasi utama:
1. Jika lulus dalam satu parameter dan jenis parameter adalah daftar, nilai atribut koleksi adalah daftar
2. Jika lulus dalam satu parameter dan jenis parameter adalah array, nilai properti koleksi adalah array
3. Jika ada beberapa parameter yang dilewati, kita perlu merangkumnya ke dalam peta. Tentu saja, satu parameter juga dapat dienkapsulasi ke dalam peta.
Saya tidak akan mencantumkan contoh spesifik tentang foreach di sini. Saya dapat memberikan contoh dari setiap situasi jika saya memiliki kesempatan di masa depan.
Mysqlbasedao:
Kelas publik mysqlbasedAo memperluas sqlsessiondaosupport { /*** masukkan: masukkan operasi. <br/> * * @author chenzhou * @param metode metode nama dari operasi insert * @param entitas parameter kueri atau kelas entitas * @Return mengembalikan jumlah baris yang terpengaruh * @since jdk 1.6 */ public int insert (Metode string, entitas objek) {return this.getsqlSession (). Method, Method, Entertity); } // metode lain dihilangkan} TrainRecorddao yang sesuai dengan kelas entitas TrainRecord didefinisikan sebagai berikut:
Public Class TrainRecorddao memperluas mysqlbasedao { /*** addtrainrecordbatch: catatan pelatihan insert batch. <br/> * * @author chenzhou * @param trainRecordList Training record list collection * @return Number of rows affected* @since JDK 1.6 */ public int addTrainRecordBatch(List<TrainRecord> trainRecordList){ return this.insert("addTrainRecordBatch", trainRecordList); } // hilangkan metode yang tersisa} Kemudian, secara langsung hubungi metode AddTrainRecordBatch di TrainRecorddao dan Anda dapat memasukkannya ke dalam batch.
Terutama dicatat bahwa saya mengalami kesalahan yang tidak bisa berkata -kata ketika saya mencobanya, dan butuh waktu hampir satu jam untuk menyelesaikannya. Ketika saya mendefinisikan metode penyisipan di mapper.xml, saya biasanya menggunakan tag <! [CDATA []]> untuk melampirkan pernyataan SQL secara default, seperti yang ditunjukkan di bawah ini:
<! [Cdata [pilih * dari t_train_record t di mana t.activity_id =#{ActivityId}]]> Ini terutama karena dalam elemen XML, "<" dan "&" adalah ilegal. "<" menghasilkan kesalahan karena parser menafsirkan karakter sebagai awal dari elemen baru. "&" juga menghasilkan kesalahan karena parser menafsirkan karakter sebagai awal dari entitas karakter. Karakter "<" atau "&" mungkin ada dalam pernyataan SQL atau pernyataan skrip. Untuk menghindari kesalahan, pernyataan SQL dapat didefinisikan sebagai CDATA. Segala sesuatu di bagian CDATA diabaikan oleh parser.
Pada saat itu, saya juga menggunakan penggunaan ini dalam metode AddTrainRecordBatch:
<! [Cdata [INSERT INTO T_TRAIN_RECORD (add_time, emp_id, Activity_id, flag) Nilai <foreach collection = "list" item = "item" index = "index" pemisah = ","> (#{item.addtime},#{item.empid},#{item.activity},#{foreach {foreach {foreach {foreach {foreach {foreach {foreach {foreach {foreach>Akibatnya, program selalu melaporkan kesalahan saat mengeksekusi: com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception. Saat melihat pesan kesalahan, parameter yang dilewati adalah nol. Setelah waktu yang lama kebingungan, saya menyadari bahwa <! [Cdaata []]> menyertakan tag <teach> dalam XML dan secara langsung memproses tag sebagai string. Setelah menghapus bagian luar <! [Cdata []]>, itu dapat dieksekusi secara normal.