โดยทั่วไปทุกคนรู้วิธีใช้ mybatis เพื่อดำเนินการ SQL โดยพลการ วิธีการใช้งานง่ายมากตัวอย่างเช่นใน xxmapper.xml:
<select id = "executesQl" resultType = "map"> $ {_ พารามิเตอร์} </select>คุณสามารถเรียกได้ว่าดังนี้:
sqlsession.selectList ("ExecutesQl", "เลือก * จาก sysuser ที่เปิดใช้งาน = 1");หรือคุณสามารถกำหนดวิธีการต่อไปนี้ในอินเตอร์เฟส xxmapper.java:
รายการ <AP> EXECUTESQL (String SQL);
จากนั้นใช้อินเทอร์เฟซเพื่อเรียกวิธีการ:
xxmapper.executesql ("เลือก * จาก sysuser ที่เปิดใช้งาน = 1");เนื้อหาทั้งหมดข้างต้นอาจเป็นและต่อไปนี้มีความซับซ้อนมากขึ้นเล็กน้อยตามสิ่งนี้
หากคุณต้องการส่งผ่านค่าโดยใช้เมธอดพารามิเตอร์ใน SQL ด้านบนนั่นคือเขียนเป็น enabled = #{enabled} หากคุณไม่ได้พบกับความต้องการดังกล่าวคุณอาจไม่เข้าใจว่าทำไมคุณควรเขียนแบบนี้ ตัวอย่างเช่นในการใช้แบบสอบถามแบบไดนามิกคุณสามารถกำหนดค่า SQL ในเบื้องหน้าและจัดเตรียมเงื่อนไขการสืบค้นบางอย่างเพื่อรับรู้ฟังก์ชั่นของการสืบค้น (เพื่อความปลอดภัยการกำหนดค่าเหล่านี้จะต้องได้รับการพัฒนาหรือนำไปใช้และเป็นไปไม่ได้ที่ผู้ใช้จะใช้ฐานข้อมูลโดยตรง)
สำหรับคุณสมบัตินี้มันค่อนข้างง่ายที่จะนำไปใช้กับ mybatis การกำหนดค่า SQL จะต้องดำเนินการ SQL สามารถดำเนินการในวิธีที่กล่าวถึงข้างต้น จะให้พารามิเตอร์ได้อย่างไร? พารามิเตอร์คือชิ้นส่วน #{enabled} ใน enabled = #{enabled} หากมีเงื่อนไขมากขึ้น SQL ที่กำหนดค่าไว้มีดังนี้:
เลือก * จาก sysuser ที่ enabled = #{enabled} และชื่อผู้ใช้เช่น concat ('%', #{ชื่อผู้ใช้}, '%')ในกรณีนี้ฉันจะใช้ mybatis เพื่อใช้งานได้อย่างไร
ก่อนอื่น XML ได้รับการแก้ไขดังนี้:
<select id = "ExecutesQl" resultType = "MAP"> $ {SQL} </Select>วิธีการในอินเทอร์เฟซได้รับการแก้ไขเป็น:
รายการ <AP> EXECUTESQL (แผนที่แผนที่);
จากนั้นเรียกวิธีการ:
แผนที่ = ใหม่ hashmap (); // sql ที่นี่สอดคล้องกับ $ {sql} map.put ("sql", "เลือก * จาก sysuser"+ "ที่เปิดใช้งาน =#{enabled}"+ " 1); //#{ชื่อผู้ใช้} map.put ("ชื่อผู้ใช้", "admin"); // แทรกรายการโทร <map> list = xxmapper.executesql (แผนที่); // เมธอด sqlsession เรียก sqlsession.selectList ("ExecutesQl", แผนที่);ด้วย SQL นี้คุณสามารถให้ชื่อและชื่อผู้ใช้เป็นเงื่อนไขให้กับผู้ใช้ เห็นได้ชัดว่าทั้งสองเงื่อนไขนี้จำเป็น ถ้าเป็นทางเลือกฉันจะเขียนได้อย่างไร?
อาจมีใครบางคนคิดว่าเป็นไปได้หรือไม่ที่จะใช้ SQL แบบไดนามิกใน mybatis ใช้ <if> แท็ก ฯลฯ ?
ก่อนที่จะตอบคำถามนี้ลองดูที่รหัสใน DynamicsQlSource ที่จัดการ SQL แบบไดนามิก:
@Override Public BoundSQL getBoundSQL (พารามิเตอร์วัตถุ) {DynamicContext Context = ใหม่ DynamicContext (การกำหนดค่าพารามิเตอร์); rootsqlNode.Apply (บริบท); SQLSourceBuilder SQLSourceParser = new SQLSourceBuilder Object.class: ParameterObject.getClass (); SQLSource SQLSource = SQLSourceParser.Parse (context.getSql (), parameterType, context.getBindings ()); boundsql boundsql = sqlsource.getBoundSql (พารามิเตอร์); สำหรับ (map.entry <String, Object> รายการ: context.getBindings (). entrySet ()) {boundsql.setAdditionalParameter (entry.getKey (), entry.getValue ());} ส่งคืน BoundSQL;}เมื่อ MyBatis จัดการ SQL แบบไดนามิกแท็ก SQL แบบไดนามิกทั้งหมดจะถูกประมวลผลเป็นวัตถุ SQLNode (RootsQlNode ที่นี่) และผู้ที่มี $ {} จะถูกประมวลผลเป็นวัตถุ TextSqlNode ในสองบรรทัดแรกของวิธีข้างต้นคือที่ mybatis จัดการ SQL แบบไดนามิก
ดังนั้นหากเนื้อหาของเราอยู่ใน $ {SQL} มีแท็กซ้อนกันเช่น $ {} และ <ficive>, <โดยที่> และแท็กอื่น ๆ เมื่อ mybatis แยกวิเคราะห์ xml ไปยังวัตถุ sqlnode องค์ประกอบ xml <elect> มีเพียง $ {sql} และเพียง $ {sql} เท่านั้น ที่รันไทม์สตริงพารามิเตอร์นี้อาจมีแท็กเช่น $ {} และ <fife>, <here>, ฯลฯ แต่สิ่งนี้เกิดขึ้นหลังจากการแยกวิเคราะห์ mybatis ดังนั้นเมื่อเนื้อหาเหล่านี้ปรากฏเป็นส่วนหนึ่งของสตริงพวกเขาจะไม่ถูกประมวลผลเป็นพิเศษ พวกเขาเป็นเพียงส่วนหนึ่งของ SQL และเป็นเพียงเอาต์พุตตามที่เป็นอยู่ (เนื่องจากฐานข้อมูลไม่รู้จักมันจะรายงานข้อผิดพลาด) และไม่สามารถประมวลผลได้ ดังนั้นจึงไม่สามารถเขียน SQL แบบไดนามิกผ่านวิธีที่มาพร้อมกับ mybatis
คำใบ้
ในรหัสข้างต้น:
sqlsourceparser.parse (context.getsql (), parametertype, context.getBindings ());
รหัสชิ้นนี้จัดการพารามิเตอร์แบบไดนามิก (#{}) หลังจากการประมวลผล SQL แบบไดนามิกดังนั้นพารามิเตอร์ประเภทนี้สามารถใช้ใน SQL
เนื่องจากคุณไม่สามารถใช้วิธี MyBatis Dynamic SQL ได้อย่างไรจึงจะใช้ SQL แบบไดนามิกได้อย่างไร
นี่คือความคิดง่ายๆ ใช้ภาษามาร์กอัปแม่แบบใน SQL เพื่อใช้ SQL แบบไดนามิก (เช่น freemarker) ก่อนที่ SQL จะถูกส่งไปยัง MyBatis เพื่อดำเนินการให้ใช้เทมเพลตเพื่อประมวลผล SQL เพื่อสร้าง SQL ที่ดำเนินการขั้นสุดท้าย (จำเป็นต้องหลีกเลี่ยงการประมวลผลพารามิเตอร์ #{} พารามิเตอร์) และส่ง SQL นี้ไปยัง MyBatis เพื่อดำเนินการ
ยกตัวอย่างของเทมเพลต freemarker และยังคง SQL ข้างต้นขึ้นอยู่กับ:
เลือก * จาก sysuser โดยที่ 1 = 1 <#ถ้าเปิดใช้งาน ??> enabled =#{enabled} </#ถ้า> <#ถ้าชื่อผู้ใช้ ?? && ชื่อผู้ใช้! = ''> และชื่อผู้ใช้เช่น concat ('%',#{ชื่อผู้ใช้}, '%') </#ถ้า>โปรดทราบว่า <#if> นี่คือองค์ประกอบของ Freemarker โดยไม่คำนึงถึงการฉีด SQL SQL ข้างต้นสามารถเขียนเป็น::
เลือก * จาก sysuser โดยที่ 1 = 1 <#ถ้าเปิดใช้งาน ??> enabled =#{enabled} </#ถ้า> <#ถ้าชื่อผู้ใช้ ?? && ชื่อผู้ใช้! = ''> และชื่อผู้ใช้เช่น '%$ {ชื่อผู้ใช้}%' </#ถ้า>ความแตกต่างคือ '%$ {ชื่อผู้ใช้}%' เนื่องจาก Freemarker จะประมวลผล $ {ชื่อผู้ใช้} และจะแทนที่พารามิเตอร์ที่นี่ด้วยค่าจริง
ในรหัสที่เรียกก่อนหน้านี้การดัดแปลงมีดังนี้:
//#{enabled}map.put("enabled ", 1); //#{ชื่อผู้ใช้} map.put (" ชื่อผู้ใช้ "," admin "); // SQL ที่นี่สอดคล้องกับสตริง $ {SQL} ใน XML SQL =" หนึ่งในสองคอมเพล็กซ์ SQLS แผนที่); // ใส่ SQL ที่ประมวลผลในแผนที่แผนที่ ("SQL", "เลือก * จาก sysuser"+ "โดยที่ enabled = #{enabled}"+ "และชื่อผู้ใช้เช่น concat ('%', #{ชื่อผู้ใช้}, '%')"); //หมายเหตุ: วิธี ProcessSQLBYFREEMARKER คือการประมวลผลสตริง SQL ตามข้อมูลในแผนที่และวิธีการใช้งานสามารถค้นหาได้ด้วยตัวเอง
ณ จุดนี้ฟังก์ชั่น SQL แบบไดนามิกที่ไม่ซับซ้อนมากถูกนำมาใช้
ฉันสงสัยว่ามีคนโลภมากขึ้นหรือไม่ คุณคิดว่าค่าที่ส่งคืนด้านบนเป็นรายการทั้งหมด <ap> ประเภท คุณสามารถส่งคืนคลาสเอนทิตีที่ฉันระบุได้หรือไม่?
ตัวอย่างเช่นในแผนที่:
map.put ("คลาส", "tk.mybatis.model.sysuser");ฉันสามารถทำให้ค่าคืนได้กลายเป็นประเภท Sysuser ด้วยวิธีนี้ได้หรือไม่? เนื่องจากบทความนี้ใช้เวลานานเกินไปฉันจะให้วิธีแก้ปัญหาที่นี่ไม่ใช่เชิงลึก
คุณสามารถใช้ interceptor เพื่อใช้งานได้ หลังจากได้รับ MappedStatement แล้วให้คัดลอกแล้วแก้ไขแอตทริบิวต์ประเภทของผลลัพธ์ใน ResultMaps เพื่อระบุประเภทคลาสสำหรับคุณ มันง่ายที่จะพูด แต่ในการดำเนินการจริงคุณสามารถมีปลั๊กอิน PageHelper Paging ประมาณ 1/10
เนื่องจากบทความนี้เขียนขึ้นตามคำร้องขอของภรรยาของฉันหากภรรยาของฉันมีความต้องการครั้งสุดท้ายนี้ฉันจะช่วยให้ภรรยาของฉันใช้ปลั๊กอินนี้แล้วแบ่งปัน
หมายเหตุ: หากเป็นการอัปเดตแบบไดนามิก, แทรก, ลบคำสั่งคุณสามารถเปลี่ยน <elect> ข้างต้นเพื่ออัปเดต (ไม่จำเป็นต้องใช้ <Elete> และ <แทรก>) และใช้ Int สำหรับค่าคืนซึ่งง่ายกว่าเลือกมาก
ข้างต้นเป็นคำอธิบายโดยละเอียดเกี่ยวกับคำสั่ง MyBatis Execution Dynamic SQL ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!