วัตถุรวบรวมรายการจะถูกห่อหุ้มในโปรแกรมจากนั้นเอนทิตีในคอลเลกชันจะต้องแทรกลงในฐานข้อมูล เนื่องจากโครงการใช้การกำหนดค่า Spring+MyBatis จึงมีการวางแผนที่จะใช้การแทรกชุด MyBatis เนื่องจากยังไม่เคยมีการแทรกแบบแบทช์มาก่อนในที่สุดฉันก็นำไปใช้หลังจากค้นหาข้อมูลบางอย่างบนอินเทอร์เน็ตและโพสต์กระบวนการโดยละเอียด
โครงสร้าง TrainRecord ระดับเอนทิตีมีดังนี้:
Public Class TrainRecord ดำเนินการ serializable {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = -1206960462117924923L; ID ยาวส่วนตัว; กิจกรรมยาวส่วนตัว empid ส่วนตัวยาว; ธง int ส่วนตัว; addtime สตริงส่วนตัว; // setter และ getter} mapper.xml ที่เกี่ยวข้องถูกกำหนดดังนี้:
<resultmap type = "trainRecord" id = "trainRecordResultMap"> <id column = "id" คุณสมบัติ = "id" jdbctype = "bigint" /> <result column = "add_time" คุณสมบัติ = "addtime" jdbctype = "varchar" /> column = "activity_id" property = "activityid" jdbctype = "bigint" /> <result column = "activity_id" property = "activityId" jdbctype = "bigint" /> <result column = "flag" property = "สถานะ" jdbctype = "varchar" />
คำจำกัดความของวิธีการแทรกแบทช์ใน mapper.xml มีดังนี้:
<insert id = "addTrainRecordBatch" useGeneratedKeys = "true" parameterType = "java.util.list"> <selectKey resultSpe = "ยาว" keyProperty = "id" order = "หลังจาก"> select_insert_id) collection = "list" item = "item" index = "index" separator = ","> (#{item.addtime},#{item.empid},#{item.activityId},#{item.flag})คำอธิบายของแท็ก foreach อ้างอิงข้อมูลออนไลน์ดังนี้:
Foreach ส่วนใหญ่จะใช้ในการสร้างในสภาพมันสามารถวนซ้ำผ่านคอลเลกชันในงบ SQL แอตทริบิวต์ขององค์ประกอบ foreach ส่วนใหญ่รวมถึงรายการ, ดัชนี, คอลเลกชัน, เปิด, ตัวคั่นและปิด รายการแสดงถึงนามแฝงเมื่อแต่ละองค์ประกอบในคอลเลกชันซ้ำ ดัชนีระบุชื่อเพื่อแสดงตำแหน่งที่การวนซ้ำแต่ละครั้งถึงระหว่างกระบวนการวนซ้ำ Open แสดงถึงสิ่งที่เริ่มต้นด้วยคำสั่งตัวคั่นแสดงว่าสัญลักษณ์ใดที่ใช้เป็นตัวคั่นระหว่างการวนซ้ำแต่ละครั้งและปิดแสดงถึงสิ่งที่จบลงด้วย สิ่งที่สำคัญที่สุดและผิดพลาดมากที่สุดเมื่อใช้ foreach คือแอตทริบิวต์การรวบรวม คุณลักษณะนี้จะต้องระบุ แต่ในกรณีที่แตกต่างกันค่าของแอตทริบิวต์จะแตกต่างกัน มีสามสถานการณ์หลัก:
1. หากผ่านในพารามิเตอร์เดียวและประเภทพารามิเตอร์คือรายการค่าแอตทริบิวต์การรวบรวมคือรายการ
2. หากส่งผ่านในพารามิเตอร์เดียวและประเภทพารามิเตอร์คืออาร์เรย์ค่าคุณสมบัติของคอลเลกชันคืออาร์เรย์
3. หากมีพารามิเตอร์หลายพารามิเตอร์ที่ผ่านมาเราต้องห่อหุ้มไว้ในแผนที่ แน่นอนพารามิเตอร์เดียวสามารถห่อหุ้มลงในแผนที่
ฉันจะไม่แสดงตัวอย่างเฉพาะเกี่ยวกับ foreach ที่นี่ ฉันสามารถยกตัวอย่างของแต่ละสถานการณ์ได้หากฉันมีโอกาสในอนาคต
mysqlbasedao:
คลาสสาธารณะ MySqlbasedao ขยาย SQLSessionDaosupport { /*** แทรก: แทรกการทำงาน <br/> * * @author chenzhou * @param เมธอดเมธอดชื่อของการดำเนินการแทรก * @param เอนทิตีพารามิเตอร์พารามิเตอร์หรือคลาสเอนทิตี * @return ส่งคืนจำนวนแถวที่ได้รับผลกระทบ * @since JDK 1.6 */ INT INT สาธารณะ } // วิธีอื่นถูกละเว้น} TrainRecorddao ที่สอดคล้องกับคลาสเอนทิตีของ TrainRecord นั้นถูกกำหนดดังนี้:
Public Class TrainRecorddao ขยาย MySqlbasedao { /*** addTrainRecordBatch: บันทึกการฝึกอบรมแบทช์ <br/> * * @author chenzhou * @param trainrecordlist บันทึกรายการบันทึกรายการ * @return จำนวนแถวที่ได้รับผลกระทบ * @since jdk 1.6 */ public int addtrainrecordbatch (รายการ <trainrecord> trainrecordlist) {ส่งคืนสิ่งนี้ } // ละเว้นวิธีการที่เหลือ} จากนั้นเรียกใช้วิธี addTrainRecordBatch โดยตรงใน TrainRecorddao และคุณสามารถแทรกเป็นแบทช์
เป็นที่สังเกตโดยเฉพาะอย่างยิ่งว่าฉันพบความผิดพลาดที่ไม่พูดอะไรเมื่อฉันลองและใช้เวลาเกือบหนึ่งชั่วโมงในการแก้ปัญหา เมื่อฉันกำหนดวิธีการแทรกใน mapper.xml ฉันมักจะใช้แท็ก <! [cdata []]> tag เพื่อใส่คำสั่ง SQL ตามค่าเริ่มต้นดังแสดงด้านล่าง:
<! [cdata [เลือก * จาก t_train_record t โดยที่ t.activity_id =#{activityid}]>> นี่เป็นเพราะองค์ประกอบ XML "<" และ "&" เป็นสิ่งผิดกฎหมาย "<" สร้างข้อผิดพลาดเนื่องจากตัวแยกวิเคราะห์ตีความตัวละครเป็นจุดเริ่มต้นขององค์ประกอบใหม่ "&" ยังสร้างข้อผิดพลาดเพราะตัวแยกวิเคราะห์ตีความตัวละครเป็นจุดเริ่มต้นของเอนทิตีอักขระ อักขระ "<" หรือ "&" อาจมีอยู่ในคำสั่ง SQL หรือคำสั่งสคริปต์ เพื่อหลีกเลี่ยงข้อผิดพลาดคำสั่ง SQL สามารถกำหนดเป็น CDATA ทุกอย่างในส่วน CDATA จะถูกละเว้นโดยตัวแยกวิเคราะห์
ในเวลานั้นฉันยังใช้การใช้งานนี้ในวิธี AddTrainRecordBatch:
<! [cdata [แทรกลงใน t_train_record (add_time, emp_id, activity_id, ค่าสถานะ) <foreach collection = "list" item = "item" index = "ดัชนี" ตัวคั่น = ","> (#{item.addtime},#{item.empid},#{item.activity}เป็นผลให้โปรแกรมรายงานข้อผิดพลาดเสมอเมื่อดำเนินการ: com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerRorexception เมื่อดูข้อความแสดงข้อผิดพลาดพารามิเตอร์ที่ส่งผ่านเป็นโมฆะ หลังจากความสับสนเป็นเวลานานฉันรู้ว่า <! [cdata []]> รวมแท็ก <foreach> ใน XML และประมวลผลแท็กเป็นสตริงโดยตรง หลังจากลบภายนอก <! [cdata []]> มันสามารถดำเนินการได้ตามปกติ