ในความเป็นจริงหนึ่งในคุณสมบัติที่ทรงพลังของ mybatis มักจะเป็นความสามารถของ SQL แบบไดนามิก หากคุณมีประสบการณ์ในการใช้ JDBC หรือเฟรมเวิร์กอื่น ๆ ที่คล้ายกันคุณเข้าใจว่ามันมีความยุ่งเหยิงมากที่จะเชื่อมโยงสตริง SQL ที่ต่อกันแบบไดนามิกเข้าด้วยกันตรวจสอบให้แน่ใจว่าคุณไม่ลืมช่องว่าง SQL แบบไดนามิกใน MyBatis สามารถจัดการกับความเจ็บปวดนี้ได้อย่างละเอียด สำหรับ SQL แบบไดนามิกวิธีที่ง่ายที่สุดคือให้เราตัดสินพฤติกรรมแบบไดนามิกที่หลากหลายเมื่อมีรหัสยาก ใน MyBatis ภาษา SQL แบบไดนามิกที่ทรงพลังใช้เพื่อปรับปรุงสถานการณ์นี้ซึ่งสามารถใช้ในการทำแผนที่ของคำสั่ง SQL ใด ๆ องค์ประกอบ SQL แบบไดนามิกนั้นคล้ายคลึงกับการใช้ JSTL หรือโปรเซสเซอร์ข้อความ XML ที่คล้ายกันอื่น ๆ MyBatis ใช้การแสดงออกที่ใช้ OGNL ที่ทรงพลังเพื่อกำจัดองค์ประกอบอื่น ๆ
องค์ประกอบโหนดหลายอย่างที่เราใช้โดยทั่วไปรวมถึงถ้าเลือก (เมื่อมิฉะนั้น), ตัดแต่ง (โดยที่, ถ้า) และ foreach ฉันรู้สึกเหมือนการใช้ XSLT (ฉันจะพูดถึงในภายหลังในบทความ ~)
(1) การใช้งาน IF
ในการกำหนดค่าการปนเปื้อนของ ViisitMapper หาก PageIndex> -1 และ Pagesize> -1 จะเพิ่ม SQL pagination ที่สอดคล้องกันมิฉะนั้นจะไม่ถูกเพิ่ม (ค่าเริ่มต้นถูกนำมาทั้งหมด) ดังนี้:
<select id = "getListByPagenate" parameterType = "pagenateArgs" resultType = "ผู้เยี่ยมชม"> เลือก * จาก (<รวม refid = "getListSql" /> <รวม refid = "orderbysql" />>) t <!- #{} test = "pagestart> -1 และ pagesize> -1"> ขีด จำกัด #{pagestart}, #{pagesize} </if> </select> <sql id = "getListSql"> เลือก * จากผู้เข้าชมที่สถานะ> 0 </sql>เนื่องจากพารามิเตอร์ของเรา PageIndex และ Pagesize เป็นทั้งค่า int เราจึงสามารถตัดสินโดยตรงเช่นนี้ หากเป็นอินสแตนซ์ของวัตถุเราสามารถใช้การตัดสินโมฆะเพื่อควบคุมตรรกะแบบไดนามิกบางอย่าง การพัฒนาเฉพาะขึ้นอยู่กับความต้องการทางธุรกิจ ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะต้องทราบที่นี่ว่ามันไม่ใช่เรื่องง่ายที่จะเขียน && สิ่งนี้จะไม่ได้รับการยอมรับในการกำหนดค่า ~
(2) การใช้งานทางเลือก (เมื่อมิฉะนั้น)
เลือกเมื่อใช้เป็นหลักในสถานการณ์แอปพลิเคชันที่ตรงตามเงื่อนไขใดข้อหนึ่งภายใต้เงื่อนไขหลายเงื่อนไข ตัวอย่างเช่นนี่คือเงื่อนไขการสืบค้นรหัสผ่านชื่อและ createTime ตามลำดับ สมมติว่าเมื่อเราสอบถามตารางผู้เยี่ยมชมหากผู้เข้าชมมีค่าให้ใช้การสืบค้น ID และหากการเยี่ยมชมมีค่าให้ใช้แบบสอบถาม VisitName ดังต่อไปนี้เพิ่มรายการ <ผู้เข้าชม> getListChoosewhendemo (BasicQueryArgs args) วิธี David.mybatis.demo.ivisitoroperation คลาสอินเตอร์เฟส เพิ่มการกำหนดค่าโหนด Select ที่สอดคล้องกันใน VisitorMapper:
แพ็คเกจ david.mybatis.demo; นำเข้า java.util.list; นำเข้า david.mybatis.model.basicQueryargs; นำเข้า david.mybatis.model.pagenateargs; นำเข้า david.mybatis.model.visitor; ผู้เข้าชม*/ Public Int Add (ผู้เยี่ยมชมผู้เยี่ยมชม); /** ลบผู้เยี่ยมชม*/ การลบ INT สาธารณะ (ID int); /** อัปเดตผู้เข้าชม*/ การอัปเดต INT สาธารณะ (ผู้เยี่ยมชมผู้เยี่ยมชม); /** ผู้เยี่ยมชมแบบสอบถาม*/ Query ผู้เยี่ยมชมสาธารณะ (ID int); / * * รายการสอบถาม */ รายการสาธารณะ <ผู้เยี่ยมชม> getList (); / * * รายการข้อความค้นหาการแบ่งหน้า */ รายการสาธารณะ <ผู้เยี่ยมชม> getListByPagenate (pagenateargs args); / * * รายการสืบค้น pagination (รวมถึง rownum) */ รายการสาธารณะ <ผู้เยี่ยมชม> getListBypagenateWithRn (pagenateargs args); /** แบบสอบถามพื้นฐาน*/ ผู้เยี่ยมชมสาธารณะ BasicQuery (ID int); / * * แบบสอบถามเงื่อนไขแบบไดนามิก (เลือกเมื่อ) อินสแตนซ์ */ รายการสาธารณะ <ผู้เยี่ยมชม> getListChoosewHendemo (BasicQueryArgs args); / * * แบบสอบถามเงื่อนไขแบบไดนามิก (โดยที่) อินสแตนซ์ */ รายการสาธารณะ <ผู้เยี่ยมชม> getListweredemo (BasicQueryArgs args); / * * อินสแตนซ์แบบสอบถามแบบไดนามิก (foreach) */ รายการสาธารณะ <ผู้เยี่ยมชม> getlistforeachDemo (รายการ <teger> ids); -
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <! doctype mapper สาธารณะ "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd namespace = "david.mybatis.demo.ivisitoroperation"> <resultmap type = "ผู้เยี่ยมชม" id = "visitorrs"> <id column = "id" คุณสมบัติ = "id" /> <result column = "name" property = "name" /> <result column = "อีเมล" </resultmap> <sql id = "getlistsqlconditions"> เลือก * จากผู้เยี่ยมชม </sql> <!-เลือกเมื่อพบกับเงื่อนไขข้อใดข้อหนึ่ง-> <select id = "getListChoosewhendemo" parametrispe = "basicquereargs" test = "querystatus> 0"> status = #{querystatus} </ถ้า> <เลือก> <เมื่อทดสอบ = "queryId! = 0"> และ id = #{queryId} </เมื่อ> <เมื่อทดสอบ = "queryName! = null"> </phere> </select> </mapper>(3) การใช้งานที่ (ตัดแต่ง)
ข้อได้เปรียบของคำหลักคือหากมีเงื่อนไขตัวกรองที่สอดคล้องกันจะรู้ว่าจะแทรกคำหลักในเวลาที่เหมาะสม และยังรู้ว่าเมื่อใดควรลบตัวเชื่อมต่อที่เกี่ยวข้องและหรือหรือตัวเชื่อมต่อส่วนใหญ่จะจัดการกับสถานการณ์ต่อไปนี้
<select id = "findActiveBloglike" resultType = "blog"> เลือก * จากบล็อกโดยที่ <ถ้า test = "state! = null"> state = #{state} </ถ้า> <ถ้า test = "title! = null"> และชื่อเช่น #}มันจะไม่เป็นผลมาจากความล้มเหลวของเงื่อนไขทั้งหมด
<เลือก id = "findActiveBloglike" resultType = "บล็อก"> เลือก * จากบล็อกโดยที่ </select>
หรือเนื่องจากเงื่อนไขแรกไม่เป็นไปตามเงื่อนไขที่ตามมาจะเป็นไปตามเท่านั้น
<select id = "findActiveBloglike" resultType = "blog"> เลือก * จากบล็อกที่และชื่อเช่น 'someitle' </select>
ดังนั้นสำหรับสิ่งนี้เราสามารถสร้างตัวเลือกเมื่อตัวอย่างเงื่อนไขและเพิ่มวิธีการที่สอดคล้องกันรายการสาธารณะ <ผู้เยี่ยมชม> getListweredemo (BasicQueryArgs args) ลงในคลาสอินเตอร์เฟส ivisitoroperation
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <! doctype mapper สาธารณะ "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd namespace = "david.mybatis.demo.ivisitoroperation"> <sql id = "getlistsqlconditions"> เลือก * จากผู้เยี่ยมชม </sql> <!-เพิ่มการดำเนินการหากพบเงื่อนไข-> <select id = refid = "getlistsqlconditions"/> <โดยที่> <ถ้า test = "querystatus> 0"> สถานะ> 0 </ถ้า> <ถ้า test = "queryId> 0"> และ id =#{queryId} </if> <if test = "queryName! = null" createTime> =#{querytime} </if> </where> <!- <trim prefix = "โดยที่" prefixoverrides = "และ | หรือ"> <ถ้า test = "querystatus> 0"> สถานะ> 0 </if> <if test = "queryId> 0"> like =#{queryName} </if> <ถ้า test = "querytime! = null"> และ createTime> =#{querytime} </if> </trim> -> </select> </mapper>(4) การใช้ foreach
ใน Dynamic SQL ที่ใช้กันทั่วไปเรามีสถานการณ์ทางธุรกิจที่ ID ใน ids จำนวนมาก ในกรณีนี้เราสามารถใช้ foreach โดยไม่ต้องทำงานหนักเพื่อแยกสตริง ID ขั้นตอนเดียวกันคือการเพิ่มวิธีการที่สอดคล้องกันใน IVISitorOperation Interface Class Public Public List <ผู้เข้าชม> GetListForEachDemo (รายการ <teger> ids) จากนั้นกำหนดค่าข้อมูลองค์ประกอบโหนดที่สอดคล้องกันในไฟล์แผนที่ที่สอดคล้องกันดังนี้:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <! doctype mapper สาธารณะ "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd namespace = "david.mybatis.demo.ivisitoroperation"> <sql id = "getlistsqlconditions"> เลือก * จากผู้เยี่ยมชม </sql> <! collection = "list" item = "item" index = "index" open = "(" separator = "," close = ")"> $ {item}ในที่สุดคุณจะต้องสร้างวิธีการทดสอบที่สอดคล้องกันใน Demorun และ SQL แบบไดนามิกใน mybatis จะเสร็จสมบูรณ์ วิธี Demorun ที่ใช้สำหรับการทดสอบด้านล่าง
/** อินสแตนซ์การสืบค้นแบบไดนามิก*/ โมฆะคงที่สาธารณะ getListforeachDemo (รายการ <teger> ids) {เซสชัน sqlsession = myBatisutils.getSqlSession (); ivisitoroperation voperation = session.getMapper (ivisitoroperation.class); รายการ <ผู้เยี่ยมชม> ls = voperation.getListForeachDemo (ID); สำหรับ (ผู้เยี่ยมชมผู้เยี่ยมชม: LS) {System.out.println (ผู้เยี่ยมชม); }} /** แบบสอบถามแบบไดนามิกที่ถ้าอินสแตนซ์* / โมฆะคงที่สาธารณะ getListWherEcondition (ID int, ชื่อสตริง, วันที่ createTime) {name = name == ""? NULL: ชื่อ; sqlsession session = myBatisutils.getSqlSession (); BasicQueryArgs args = ใหม่ basicQueryArgs (id, ชื่อ, createTime); ivisitoroperation voperation = session.getMapper (ivisitoroperation.class); รายการ <ผู้เยี่ยมชม> ls = vOperation.getListWeredemo (args); if (ls.size () == 0) system.out.println ("ไม่ตรวจสอบไม่ตรงกัน!"); else {สำหรับ (ผู้เยี่ยมชมผู้เยี่ยมชม: ls) {system.out.println (ผู้เยี่ยมชม); }}} /** แบบสอบถามแบบไดนามิกเลือกเมื่ออินสแตนซ์* / โมฆะคงที่สาธารณะ getListChoosewHendemo (int id, ชื่อสตริง, วันที่ createTime) {name == == ""? NULL: ชื่อ; sqlsession session = myBatisutils.getSqlSession (); BasicQueryArgs args = ใหม่ basicQueryArgs (id, ชื่อ, createTime); ivisitoroperation voperation = session.getMapper (ivisitoroperation.class); รายการ <ผู้เยี่ยมชม> ls = voperation.getListChoosewhendemo (args); if (ls.size () == 0) system.out.println ("ไม่ตรวจสอบไม่ตรงกัน!"); else {สำหรับ (ผู้เยี่ยมชมผู้เยี่ยมชม: ls) {system.out.println (ผู้เยี่ยมชม); -
PS: เกี่ยวกับ ognl
OGNL เป็นตัวย่อของภาษานำทางวัตถุกราฟ จากมุมมองภาษา: เป็นภาษานิพจน์ที่ทรงพลังที่ใช้ในการรับและตั้งค่าคุณสมบัติของวัตถุ Java มันมีจุดมุ่งหมายเพื่อให้ไวยากรณ์ที่เป็นนามธรรมสูงขึ้นเพื่อนำทางกราฟวัตถุ Java OGNL มีแอปพลิเคชันในหลาย ๆ ที่เช่น:
ภาษาที่มีผลผูกพันเป็นองค์ประกอบ GUI (textfield, combobox ฯลฯ ) กับโมเดลวัตถุ
ตารางฐานข้อมูลไปยังภาษาแหล่งข้อมูลของ Tablemodel ของ Swing
ภาษาที่มีผลผูกพันสำหรับส่วนประกอบของเว็บและวัตถุโมเดลพื้นหลัง (webognl, Tapestry, webwork, webobjects)
เป็นทางเลือกที่แสดงออกมากขึ้นสำหรับ Jakarata Commons Beanutils หรือ JSTL Expression Language
นอกจากนี้ยังมีหลายสิ่งที่สามารถทำได้ใน Java ซึ่งสามารถทำได้โดยใช้ OGNL เช่นการแมปรายการและการเลือก สำหรับนักพัฒนาโดยใช้ OGNL คุณสามารถใช้ไวยากรณ์ที่กระชับเพื่อนำทางวัตถุ Java ให้เสร็จสมบูรณ์ โดยทั่วไปแล้วการนำทางของข้อมูลวัตถุจะเสร็จสมบูรณ์ผ่าน "เส้นทาง" "เส้นทาง" นี้สามารถเป็นแอตทริบิวต์ของถั่วชวาวัตถุที่จัดทำดัชนีในคอลเลกชัน ฯลฯ แทนที่จะใช้วิธีการรับหรือชุดโดยตรง