ฉันเพิ่งใช้ mybatis เมื่อเร็ว ๆ นี้ ฉันเคยใช้ Ibatis มาก่อน โดยรวมแล้วมันคล้ายกัน แต่ฉันก็ยังพบปัญหามากมาย ฉันจะบันทึกอีกครั้ง
ตัวอย่างเช่นความแตกต่างระหว่างการใช้การส่งพารามิเตอร์ #{} และ $ {}
ใช้ # เพื่อส่งผ่านพารามิเตอร์และการแยกวิเคราะห์คำสั่ง SQL จะเพิ่ม "" ตัวอย่างเช่นเลือก * จากตารางที่ name = # {ชื่อ} ชื่อที่ผ่านคือ Xiao Li จากนั้นการพิมพ์ครั้งสุดท้ายคือ
เลือก * จากตารางที่ name = 'xiao li' มันจะถูกแยกวิเคราะห์เป็นสตริง เห็นได้ชัดว่าดีกว่า $ พารามิเตอร์ #{} ผ่านสามารถป้องกันการฉีด SQL หากพารามิเตอร์ที่คุณส่งผ่านเป็นคำพูดเดียว 'ถ้าคุณใช้ $ {} วิธีนี้จะรายงานข้อผิดพลาด
อีกสถานการณ์คือถ้าคุณต้องการทำการเรียงลำดับแบบไดนามิกเช่นการสั่งซื้อตามคอลัมน์ให้แน่ใจว่าใช้ $ {} ในเวลานี้เพราะถ้าคุณใช้ #{}
เลือก * จากคำสั่งซื้อตารางโดย 'ชื่อ' นี่คือไร้ประโยชน์
ในปัจจุบันหากคุณสามารถใช้ #อย่าใช้ $
ความแตกต่างระหว่าง # และ $ ใน mybatis
1. # ปฏิบัติต่อข้อมูลที่เข้ามาทั้งหมดเป็นสตริงและเพิ่มคำพูดสองครั้งลงในข้อมูลขาเข้าโดยอัตโนมัติ ตัวอย่างเช่น: สั่งซื้อโดย #user_id #หากค่าที่ส่งผ่านคือ 111 จากนั้นค่าเมื่อการแยกวิเคราะห์เป็น SQL เป็นคำสั่งซื้อโดย "111" หากค่าที่ส่งผ่านคือ ID การแยกวิเคราะห์เป็น SQL จะเป็นคำสั่งซื้อโดย "ID"
2. $ แสดงข้อมูลที่ผ่านโดยตรงและสร้างใน SQL ตัวอย่างเช่น: สั่งซื้อโดย $ user_id $ หากค่าที่ส่งผ่านคือ 111 จากนั้นค่าเมื่อแยกวิเคราะห์ลงใน SQL เป็นคำสั่งซื้อโดย user_id หากค่าที่ส่งผ่านคือ ID การแยกวิเคราะห์เป็น SQL จะเป็นคำสั่งซื้อตาม ID
3. วิธี # สามารถป้องกันการฉีด SQL ได้อย่างมาก
4. วิธี $ ไม่สามารถป้องกันการฉีด SQL
5. โดยทั่วไปวิธี $ จะใช้ในการส่งผ่านในวัตถุฐานข้อมูลเช่นการส่งผ่านในชื่อตาราง
6. โดยทั่วไปถ้าคุณสามารถใช้ #อย่าใช้ $
เมื่อใช้คำสั่งซื้อโดยพารามิเตอร์แบบไดนามิกเมื่อเรียงลำดับ mybatis คุณต้องให้ความสนใจกับการใช้ $ แทน #
เปลี่ยนสตริง
โดยค่าเริ่มต้นการใช้ไวยากรณ์รูปแบบ #{} ทำให้ MyBatis สร้างคุณสมบัติคำสั่งที่ประมวลผลล่วงหน้าและตั้งค่าความปลอดภัยด้วยเป็นพื้นหลัง (เช่น?) สิ่งนี้ปลอดภัยและรวดเร็วและบางครั้งคุณก็ต้องการแทรกสตริงที่ไม่เปลี่ยนเป็นคำสั่ง SQL โดยตรง ตัวอย่างเช่นการสั่งซื้อโดยคุณสามารถใช้เช่นนี้:
สั่งซื้อโดย $ {columnName}
ที่นี่ mybatis จะไม่แก้ไขหรือหลบหนีสตริง
สำคัญ: ไม่ปลอดภัยที่จะรับเอาต์พุตเนื้อหาจากผู้ใช้และมอบให้กับสตริงที่ไม่เปลี่ยนแปลงในคำสั่ง สิ่งนี้สามารถนำไปสู่การโจมตีการฉีด SQL ที่มีศักยภาพดังนั้นคุณไม่ควรอนุญาตให้ผู้ใช้เข้าสู่ฟิลด์เหล่านี้หรือมักจะหลบหนีและตรวจสอบด้วยตัวเอง
สรุปสั้น ๆ เกี่ยวกับความแตกต่างระหว่าง $ และ # ใน mybatis
ไม่นานมานี้มีคนมาที่ บริษัท ของเราเพื่อสัมภาษณ์ ผู้จัดการของเราถามคำถามนี้ ฉันมีความเข้าใจเพียงเล็กน้อยดังนั้นฉันจึงไปที่ Baidu
ในความเป็นจริงความแตกต่างนั้นง่ายมาก คุณจะเข้าใจด้วยตัวอย่าง เขียนประโยค SQL-ตัวอย่าง: เลือก * จาก user_role โดยที่ user_code = "100";
ในประโยคนี้จะต้องเขียนเป็นเลือก * จาก $ {tablename} โดยที่ user_code = #{userCode}
ดังนั้นอักขระ $ จะถูกสะกดลงใน SQL โดยตรงในขณะที่อักขระ # จะถูกสะกดด้วย SQL ในรูปแบบของสตริง