1. ดำเนินการค้นหา SQL โดยตรง:
1. ข้อความที่ตัดตอนมาจากไฟล์ Mappers
<resultmap id = "acmodelResultMap" type = "com.izumi.instancemodel"> <result column = "instance" property = "instanceid" jdbctype = "varchar" /> <result column = "Instancename" resultType = "com.izumi.instancemodel"> $ {paramsql} </select>2. ข้อความที่ตัดตอนมาจาก Dao
อินเทอร์เฟซสาธารณะ somedao {list <instancemodel> getInstancemodel (@param ("paramsql") string sql);}3. สิ่งที่ควรทราบ
3.1: พารามิเตอร์ของวิธีการที่ผ่านจะต้องทำตามข้อกำหนดต่อไปนี้ "เลือก XXX เป็นอินสแตนซ์, xxx เป็น instancename ..... " มิฉะนั้น mybatis ไม่สามารถเปลี่ยนผลลัพธ์การสืบค้นโดยอัตโนมัติเป็นวัตถุ Java
3.2: ความแตกต่างระหว่าง #{} ไวยากรณ์และ $ {} ไวยากรณ์ในไฟล์ Mappers:
โดยค่าเริ่มต้นไวยากรณ์ #{} ทำให้ MyBatis สร้างคุณสมบัติ PreparedStatement และใช้พารามิเตอร์ PreparedStatement (=?) เพื่อตั้งค่า หากคุณต้องการแทนที่สตริงที่ไม่เปลี่ยนแปลงโดยตรงเป็น SQL คุณสามารถใช้ $ {}
กล่าวอีกนัยหนึ่งเมื่อ MyBatis เห็น #{} มันจะคิดว่าคุณกำลังกำหนดค่าให้กับตัวแปรใน SQL เช่นเดียวกับในการเขียนโปรแกรม JDBC เพื่อกำหนดค่าให้กับเครื่องหมายคำถาม (ตัวอย่างเช่น MyBatis จะตัดสินประเภทของมันและเพิ่มใบเสนอราคาเดี่ยวโดยอัตโนมัติก่อนและหลัง) เมื่อ MyBatis เห็น $ {} มันจะแทนที่โดยตรงด้วยค่าของตัวแปรโดยไม่ต้องทำการประมวลผลใด ๆ
ดังนั้นเมื่อใช้ $ {} คุณไม่จำเป็นต้องเขียนแอตทริบิวต์เช่น "jdbctype = varchar" เช่น #{}
3.3: ResultType และผลลัพธ์ Map
ตามวิธีการเขียนใน 1 ส่วน <resultmap> สามารถลบได้โดยไม่ต้องใช้เพราะใน <Select> ถัดไปจะไม่ใช้ผลลัพธ์ที่กำหนดไว้ แต่ใช้ผลลัพธ์
ดังนั้นเราจะเห็นได้ว่ามีสองวิธีในการเขียนคำจำกัดความของค่าส่งคืนของ <elect> หนึ่งคือการกำหนดผลลัพธ์ที่ได้จากนั้นอ้างถึงผลลัพธ์นี้ อีกอย่างคือการใช้ผลลัพธ์โดยตรงเพื่อระบุเส้นทางของคลาส
2. การแทรกแบทช์ข้อมูล
1. ประสบการณ์บอกเราว่าการใช้การแทรกลงในค่า XXX (XX) (XXX) (XXX) นั้นมีประสิทธิภาพมากกว่าการใช้แทรกลงในค่า XXX (XX), แทรกลงในค่า XXX (XXX), แทรกลงในค่า XXX (XXX)
2. การใช้งานใน mybatis
2.1. ข้อความที่ตัดตอนมาจากไฟล์ Mappers
<insert id = "InsertBatch"> แทรกลงในนักเรียน (<รวม refid = "base_column_list" />) ค่า <foreach collection = "itt" item = "item" index = "index" separator = ","> (null,#{item.name},#item.sex} </foreach> </insert>2.2. ข้อความที่ตัดตอนมาจาก Dao
ส่วนต่อประสานสาธารณะ somedao {โมฆะสาธารณะ InsertBatch (@param ("รายการ") รายการ <student> นักเรียน); -คำอธิบายโดยละเอียดเกี่ยวกับข้อมูลการแทรกชุด MyBatis
ก่อนอื่นให้ดูที่ไฟล์ batch mapper.xml
<insert id = "insertBatch" parameterType = "java.util.list"> <selectKey keyProperty = "fetchTime" order = "ก่อน" resultType = "java.lang.string"> select_timestamp () หน่วย, approval_certificate, ผู้ผลิต, ตลาด, vipprice, เว็บไซต์, fetch_time, productdesc) ค่า <foreach collection = "list" item = "item" index = "ดัชนี" ตัวคั่น = ","> ( #{item.depart1}, #item.depart2} #{item.img}, #{item.productspecification}, #{item.unit}, #{item.approvalcertificate}, #{item.manufacturer}, #{item.marketprice}, #item.vipprice}, # ) </foreach> </insert>ในการประมวลผลแบบแบตช์ฉันพบว่ามีหลายประเด็นที่ต้องการความสนใจ
1. รับคีย์หลักโดยอัตโนมัติ เพิ่ม useGeneratedKeys =” true” keyProperty =” id” ในแทรก คุณสมบัติทั้งสองของคุณสมบัติทั้งสองนั้นไม่ถูกต้องและอาจขัดจังหวะการแทรกข้อมูล หาก ID เป็นฐานข้อมูลการเพิ่มขึ้นของตัวเองคุณไม่สามารถเขียนอะไรได้ ลบแอตทริบิวต์คีย์หลักในคำสั่งแทรกและใช้
<selectKey keyProperty = "id" order = "ก่อน" resulttype = "java.lang.integer"> เลือก last_insert_id () </selectkey>
หมายเหตุ: แท็ก <SelectKey> สามารถมีอยู่ใน INSERT เท่านั้น ไม่เหมาะที่จะใช้ <SelectKey> ในระหว่างการประมวลผลแบบแบตช์ เป็นการดีที่สุดที่จะเพิ่มคีย์หลักเองหรือระบุ
2. การรับเวลาแทรกจะแสดงด้านบน ฉันใช้ mysql ตราบใดที่มันเป็นฟังก์ชั่น MySQL ก็สามารถใช้งานได้ เวลาแทรกและคีย์หลักเป็นหนึ่งในฟังก์ชั่น MySQL - -