บทนำ: mybatis คืออะไร?
(เดิมคือ Ibatis) MyBatis เป็นกรอบการคงอยู่ของเลเยอร์ที่สามารถปรับแต่ง SQL ขั้นตอนที่เก็บไว้และการแมปขั้นสูง MyBatis กำจัดการตั้งค่าด้วยตนเองของรหัส JDBC เกือบทั้งหมดและพารามิเตอร์และการดึงชุดผลลัพธ์ MyBatis สามารถใช้ XML อย่างง่ายหรือคำอธิบายประกอบสำหรับการกำหนดค่าและการแมปดั้งเดิมการแมปอินเทอร์เฟซและ pojos ของ Java (วัตถุ Java เก่าธรรมดา) ลงในบันทึกในฐานข้อมูล
1. พารามิเตอร์เลเยอร์ Mapper เป็นแผนที่และชั้นบริการมีหน้าที่รับผิดชอบในการโอเวอร์โหลด
เนื่องจากปัญหากลไกแผนที่ไม่สามารถบรรทุกเกินพิกัดได้ โดยทั่วไปพารามิเตอร์จะถูกตั้งค่าเป็นแผนที่ แต่จะทำให้พารามิเตอร์เบลอ หากคุณต้องการทำให้รหัสชัดเจนคุณสามารถบรรลุวัตถุประสงค์ของการโอเวอร์โหลดผ่านเลเยอร์บริการ เลเยอร์บริการที่มีให้กับภายนอกนั้นมากเกินไป แต่วิธีการบริการที่โอเวอร์โหลดเหล่านี้จริง ๆ แล้วเพื่อปรับแต่งแผนที่เดียวกัน แต่พารามิเตอร์ที่สอดคล้องกันนั้นไม่สอดคล้องกัน
บางทีบางคนอาจสงสัยว่าทำไมไม่ตั้งค่าให้ทำแผนที่ในชั้นบริการ? โดยส่วนตัวแล้วฉันไม่แนะนำสิ่งนี้ แม้ว่าฉันจะใช้วิธีนี้ในโครงการก่อนหน้านี้เพื่อความสะดวก แต่ก็จะทำให้เกิดปัญหากับงานบำรุงรักษาในอนาคต เพราะการทำเช่นนี้จะทำให้ MVC ทั้งหมดของคุณพึ่งพาโมเดลแผนที่ แบบจำลองนี้ดีมากและสะดวกในการสร้างเฟรมเวิร์ก แต่มีปัญหา: เพียงแค่ดูลายเซ็นวิธีการคุณไม่ทราบหมายเลขประเภทและความหมายของพารามิเตอร์แต่ละตัวที่แสดงโดยแผนที่
แค่คิดว่าถ้าคุณเปลี่ยนเลเยอร์บริการหรือเลเยอร์ DAO เท่านั้นคุณจะต้องชัดเจนเกี่ยวกับพารามิเตอร์ที่ส่งผ่านโดยแผนที่ในกระบวนการทั้งหมด เว้นแต่คุณจะแสดงความคิดเห็นหรือมีเอกสารที่ดีคุณต้องเข้าใจรหัสของแต่ละเลเยอร์อย่างชัดเจนก่อนที่คุณจะรู้ว่าพารามิเตอร์ใดจะผ่าน สำหรับ MVC อย่างง่ายนั่นไม่เป็นไร แต่ถ้าระดับซับซ้อนรหัสจะซับซ้อนมากและถ้าฉันเพิ่มพารามิเตอร์ฉันต้องเพิ่มความคิดเห็นสำหรับแต่ละเลเยอร์ เมื่อเทียบกับความคิดเห็นมันเป็นไปได้มากขึ้นที่จะใช้ลายเซ็นวิธีการเพื่อให้แน่ใจว่าการควบคุมรหัสนี้เนื่องจากความคิดเห็นอาจล้าสมัย แต่ลายเซ็นวิธีการโดยทั่วไปไม่น่าจะค้าง
2. พยายามใช้ถ้าตัวเลือกและข้อความอื่น ๆ น้อยที่สุดเท่าที่จะทำได้เพื่อลดความยากลำบากในการบำรุงรักษา
เมื่อกำหนดค่า SQL ใน MyBatis ให้ลองใช้ป้ายกำกับน้อยลงเช่นถ้าเลือก หาก SQL สามารถใช้เพื่อกำหนดคำพิพากษาให้ลองใช้ SQL (กรณีเมื่อ, ถอดรหัส ฯลฯ ) สำหรับการบำรุงรักษาในภายหลัง มิฉะนั้นเมื่อ sql bloats มันเป็นคลื่นไส้สุด ๆ หากคุณต้องการดีบัก SQL ใน MyBatis คุณต้องลบคำพิพากษาจำนวนมากซึ่งเป็นปัญหามาก ในทางกลับกันการตัดสินจำนวนมากจะทำให้ SQL ที่สร้างขึ้นมีพื้นที่จำนวนมากซึ่งจะเพิ่มเวลาการส่งเครือข่ายซึ่งไม่เป็นที่ต้องการ
ยิ่งไปกว่านั้นจำนวนมากหากเลือกคำสั่งอย่างหลีกเลี่ยงไม่ได้ SQL ที่สร้างขึ้นจะไม่สอดคล้องกันในแต่ละครั้งซึ่งจะนำไปสู่การแยกวิเคราะห์ Oracle จำนวนมากซึ่งไม่แนะนำ
มาดู SQL แบบนี้กันเถอะ:
<code style = "padding: 0.5em; margin: 0px; display: block; สี: RGB (101,123,131); Overflow-x: auto; พื้นหลัง: RGB (253,246,227)"> <span style = "padding: 0px; สี: RGB (133,153,0) "> Select </span> * <span style =" padding: 0px; style = "padding: 0px; margin: 0px; สี: rgb (42,161,152)"> 1 </span> = <span style = "การเติม: 0px; ระยะขอบ: 0px; สี: rgb (42,161,152)"> 1 </span> < สี: RGB (133,153,0) "> 1 </span> <<span style =" padding: 0px; style = "padding: 0px; margin: 0px; สี: rgb (42,161,152)"> "startdate! = null และ startdate! = '' และ enddate! #{startDate} <span style = "padding: 0px; มาร์จิ้น: 0px; สี: RGB (133,153,0) "> และ </span> publishTime <= #{enddate} </ <span style =" padding: 0px; มาร์จิ้น: 0px; สี: RGB (133,153,0) "> ถ้า </span> <อย่างอื่น> <span style =" การตอบสนอง: 0px; มาร์จิ้น: 0px; สี: RGB (133,153,0) "> และ </span> publishTime> = <span style =" การเติม: 0px; มาร์จิ้น: 0px; สี: RGB (133,153,0) "> sysdate </span> - <span style =" การตอบสนอง: 0px; มาร์จิ้น: 0px; สี: RGB (42,161,152) "> 7 </span> <span style =" การตอบสนอง: 0px; มาร์จิ้น: 0px; สี: RGB (133,153,0) "> และ </span> publishTime <= <span style =" การเติม: 0px; มาร์จิ้น: 0px; สี: RGB (133,153,0) "> sysdate </span> </อย่างอื่น> </<span style =" การเติม: 0px; มาร์จิ้น: 0px; สี: RGB (133,153,0) "> sysdate </span> </อย่างอื่น> </<span style =" การเติม: 0px; มาร์จิ้น: 0px; สี: RGB (133,153,0) "> เลือก </span>> </span>หากการตัดสินนั้นไม่จำเป็นอย่างแท้จริง เราสามารถใช้ถอดรหัสเพื่อแก้ปัญหาค่าเริ่มต้น:
<code style = "padding: 0.5em; margin: 0px; display: block; สี: RGB (101,123,131); Overflow-x: auto; พื้นหลัง: RGB (253,246,227)"> <span style = "padding: 0px; สี: RGB (133,153,0) "> Select </span> * <span style =" padding: 0px; <span style = "padding: 0px; margin: 0px; color: rgb (133,153,0)"> decode </span> (#{startdate}, <span style = "การเติม: 0px; margin: 0px"> null </span> สี: RGB (133,153,0) "> sysdate </span>-<span style =" padding: 0px; สี: RGB (133,153,0) "> และ </span> publishTime <= <span style =" การเติม: 0px; มาร์จิ้น: 0px "> null </span>, <span style =" padding: 0px; มาร์จิ้น: 0px; มาร์จิ้น: 0px; สี: RGB (133,153,0) "> sysdate </span>,#{enddate}) </span> </code>แน่นอนว่าบางคนอาจคิดว่าการแนะนำกรณีเมื่อใดและถอดรหัสจะต้องใช้การแยกฟังก์ชั่นของ Oracle ซึ่งจะชะลอเวลาในการดำเนินการ SQL นักเรียนที่สนใจสามารถย้อนกลับและทำการทดสอบเพื่อดูว่าจะมีผลกระทบอย่างมากหรือไม่ เท่าที่เกี่ยวข้องกับประสบการณ์ส่วนตัวฉันไม่พบการชะลอตัวของ SQL เนื่องจากการแยกฟังก์ชั่น โดยทั่วไปการดำเนินงานเช่นการเข้าร่วมการสั่งซื้อโดยที่แตกต่างการปาร์ตี้โดย ฯลฯ ซึ่งโดยทั่วไปเกี่ยวข้องอย่างใกล้ชิดกับการออกแบบโครงสร้างตาราง เมื่อเทียบกับระดับของผลกระทบด้านประสิทธิภาพของสิ่งเหล่านี้ผลกระทบของการแยกฟังก์ชันการวิเคราะห์ความเร็วต่อความเร็วในการดำเนินการ SQL ควรเล็กน้อย
อีกประเด็นหนึ่งคือสำหรับการกำหนดค่าเริ่มต้นบางอย่างเช่น SQL ด้านบนค่าเริ่มต้นไปยังวันที่ปัจจุบัน ฯลฯ คุณสามารถพูดถึงเลเยอร์บริการหรือเลเยอร์คอนโทรลเลอร์อย่างสมบูรณ์สำหรับการประมวลผล การตัดสินเหล่านี้ควรใช้น้อยลงใน mybatis เพราะในกรณีนี้มันยากที่จะประมวลผลแคช หาก startdate ว่างเปล่าและใช้ dynamic sysdate บน SQL มันเป็นไปไม่ได้ที่จะกำหนดว่าคีย์ของวันที่เริ่มต้นแคชควรเป็นอย่างไร ดังนั้นจึงเป็นการดีที่สุดที่จะจัดการกับพารามิเตอร์ก่อนที่จะถูกส่งไปยัง mybatis เพื่อให้เลเยอร์ mybatis สามารถลดบางอย่างหากเลือกคำสั่งและมันก็สะดวกสำหรับการประมวลผลแคช
แน่นอนว่าไม่สามารถใช้งานได้อย่างสมบูรณ์หากเลือก บางครั้งเพื่อเพิ่มประสิทธิภาพ SQL หากต้องได้รับการแก้ไขเช่นคำสั่ง แน่นอนว่าไม่แนะนำโดยทั่วไป อย่างไรก็ตามหากมีสถานการณ์สำหรับใช้ให้ลบเช่นเมื่อใดก็ตามที่คุณไม่จำเป็นต้องใช้เช่นการสอบถามชื่อบทความเพื่อปรับปรุงประสิทธิภาพการสืบค้น วิธีที่ดีที่สุดคือการใช้เครื่องมือค้นหาเช่น Lucence เพื่อแก้ปัญหาการจัดทำดัชนีข้อความเต็มรูปแบบนี้
โดยทั่วไปถ้าและเลือกที่จะตัดสินสาขานั้นเป็นไปไม่ได้ที่จะลบออกอย่างสมบูรณ์ แต่ขอแนะนำให้ใช้วิธีการของ SQL Native เพื่อแก้ปัญหาแบบไดนามิกบางอย่างแทนที่จะพึ่งพา Mybatis ทั้งหมดเพื่อให้การตัดสินของสาขาไดนามิกสมบูรณ์เพราะสาขาการตัดสินนั้นซับซ้อนเกินไปและยากที่จะรักษา
3. แทนที่ความคิดเห็น SQL ด้วยความคิดเห็น XML
พยายามอย่าเก็บความคิดเห็นของ MyBatis Central SQL ความคิดเห็นจะทำให้เกิดปัญหาบางอย่าง หากคุณต้องการใช้ความคิดเห็นคุณสามารถใช้ <!--> ใน XML เพื่อเพิ่มความคิดเห็นเพื่อให้แน่ใจว่าจะไม่มีคำอธิบายประกอบ SQL ใน SQL ที่สร้างขึ้นซึ่งจะช่วยลดความเป็นไปได้ของปัญหา ข้อดีอีกอย่างของการทำเช่นนี้ก็คือมันสามารถแยกแยะความแตกต่างอย่างชัดเจนจาก SQL ใน IDE
ทีนี้มาพูดถึงปัญหาที่เกิดจากความคิดเห็น ในโครงการที่ฉันกำลังดำเนินการส่วนประกอบการแบ่งหน้าจะขึ้นอยู่กับ mybatis มันจะใส่เลเยอร์อีกชั้นของการเลือกจำนวน (*) rownum_ จาก (...... ) นอกสคริปต์ SQL ที่คุณเขียนเพื่อคำนวณจำนวนระเบียนทั้งหมด ในขณะเดียวกันก็มี Select * จาก (... ) ที่ Rownum> 10 และ Ronnum <10 * 2 สร้างข้อมูลเพจ หากมีความคิดเห็นในบรรทัดสุดท้ายในสคริปต์ของคุณส่วนที่เพิ่มจะกลายเป็นส่วนหนึ่งของความคิดเห็นและจะมีการรายงานข้อผิดพลาด นอกจากนี้เงื่อนไขบางอย่างอาจทำให้เงื่อนไขบางอย่างถูกละเว้นเช่นต่อไปนี้:
<code style = "padding: 0.5em; margin: 0px; display: block; color: RGB (101,123,131); Overflow-x: auto; พื้นหลัง: RGB (253,246,227)"> <span style = "padding: 0px; style = "padding: 0px; margin: 0px; สี: rgb (133,153,0)"> จาก </span> ทดสอบ <span style = "padding: 0px; margin: 0px; สี: RGB (133,153,0)" สี: RGB (42,161,152) "> 1 </span> - นี่คือความคิดเห็น << สแปนสไตล์ =" การเติม: 0px; a! = '' "span >> <span style =" padding: 0px; '' </span >> <span style = "padding: 0px; มาร์จิ้น: 0px "> ถ้า </span >> </span> </code>
แม้ว่าจะมีพารามิเตอร์ที่สอดคล้องกันในพารามิเตอร์ที่ผ่านมา แต่ก็ไม่มีผลในความเป็นจริงเนื่องจากเนื้อหาต่อไปนี้มีความคิดเห็นอย่างสมบูรณ์ ข้อผิดพลาดประเภทนี้ยากที่จะตรวจจับโดยไม่ต้องทดสอบอย่างเข้มงวด โดยทั่วไปแล้วความคิดเห็นของ XML สามารถแทนที่ความคิดเห็น SQL ได้อย่างสมบูรณ์ดังนั้นพฤติกรรมนี้ควรถูกห้าม
4. ใช้ #{} เมื่อเป็นไปได้ไม่ใช่ $ {}
พยายามอย่าใช้ $ {} ใน mybatis สะดวกมากที่จะทำเช่นนี้ อย่างไรก็ตามมีปัญหาว่าการใช้งานจำนวนมากจะทำให้เกิดการแยกวิเคราะห์ของ Oracle อย่างหนักทำให้ประสิทธิภาพของฐานข้อมูลช้าลง ยิ่งประสิทธิภาพของฐานข้อมูลนานขึ้นเท่าใดประสิทธิภาพของฐานข้อมูลก็ยิ่งแย่ลงเท่านั้น สำหรับการประมวลผลทั่วไปของหลายสตริง INS คุณสามารถอ้างถึงวิธีการแก้ปัญหาต่อไปนี้: http://www.myexception.cn/sql/849573.html ซึ่งสามารถแก้ปัญหาส่วนใหญ่ของ $ {} ได้
เกี่ยวกับ $ {} การใช้ในทางที่ผิดอื่นเป็นเช่นนั้น ฉันมีอีกกรณีที่นี่: ตัวอย่างเช่นเมนูต้นไม้บางส่วนโหนดจะได้รับการออกแบบเป็น '01', '0101' และโหนดสองบิตจะใช้เพื่อแยกแยะลำดับชั้น ในเวลานี้หากคุณต้องการสอบถามโหนดทั้งหมดภายใต้โหนด 01 SQL ที่ง่ายที่สุดคือ: เลือก * จากต้นไม้ที่ ID เช่น '01%' SQL ชนิดนี้เป็นที่เข้าใจได้จริงเพราะมันสามารถใช้ดัชนีได้ดังนั้นจึงไม่จำเป็นต้องใช้การประมวลผลพิเศษเพียงแค่ใช้โดยตรง แต่ถ้าเป็นชื่อของบทความคุณต้องให้ความสนใจเป็นพิเศษ: เลือก * จาก t_news_text โดยที่ชื่อเช่น '%osc%' นี่ไม่ใช่วิธีที่จะใช้การจัดทำดัชนี ดังที่ได้กล่าวไว้ข้างต้นควรใช้การค้นหาข้อความแบบเต็ม แต่ถ้าคุณไม่สามารถทำได้โดยไม่ชอบคุณต้องใส่ใจกับวิธีการใช้งาน: id เช่น #{id} || '%' แทนที่จะเป็น id เช่น '$ {id}%' เพื่อลดความเป็นไปได้ของการแยกวิเคราะห์อย่างหนัก
บางคนคิดว่าใช้ || จะเพิ่มเวลาสำหรับการประมวลผล Oracle ฉันคิดว่าอย่าใช้ Oracle โง่เกินไป แม้ว่าบางครั้งมันจะโง่จริงๆคุณสามารถสรุปความโง่และไม่ทิ้งขยะเมื่อคุณมีเวลา แต่หลังจากการทดสอบเล็กน้อยคุณจะรู้ว่าวิธีการเชื่อมต่อนี้ควรจะบางมากสำหรับการแยกวิเคราะห์และการดำเนินการของ SQL ทั้งหมด
แน่นอนว่ามีบางกรณีพิเศษที่ไม่สามารถจัดการได้เช่นการฉีดชื่อคอลัมน์ชื่อตาราง ฯลฯ สำหรับสถานการณ์เหล่านี้มันเป็นเรื่องยากและไม่พบวิธีที่สะดวกอีกต่อไป เนื่องจากสถานการณ์นี้มีโอกาสน้อยที่จะเกิดขึ้นการใช้ $ {} จะไม่มีผลกระทบใหญ่ แน่นอนถ้าคุณมีการเจ็บป่วยของรหัสคุณสามารถใช้กลไกการดำเนินการ SQL แบบไดนามิกของ Oracle ดำเนินการทันทีเพื่อให้คุณสามารถหลีกเลี่ยงความเป็นไปได้ของ $ {} สิ่งนี้จะแนะนำโมเดลที่ซับซ้อนมากขึ้นและในเวลานี้คุณต้องตัดสินใจเลือก
ในการตอบสนองต่อปัญหาที่เกิดจาก SQL แบบไดนามิกข้างต้นวิธีที่รุนแรงที่สุดคือการใช้ขั้นตอนที่เก็บไว้และแก้ปัญหาในฐานข้อมูลพื้นเมืองเพื่ออำนวยความสะดวกในการพัฒนาและการดีบัก แน่นอนว่ามันจะนำปัญหา: จะมีข้อกำหนดที่สูงขึ้นสำหรับนักพัฒนาการจัดการขั้นตอนที่เก็บไว้ ฯลฯ โครงการของฉันไม่ได้ใช้วิธีนี้ดังนั้นฉันจะไม่ขยายที่นี่มากขึ้น
5. การใช้ mybatis ง่ายๆ
ฟังก์ชั่นของ MyBatis ค่อนข้างอ่อนแอและไม่มีไลบรารีเสริมที่จำเป็นจำนวนมากการประมวลผลสตริง ฯลฯ และมันก็ยากที่จะขยายดังนั้นโดยทั่วไปจึงเป็นไปได้ที่จะประมวลผลผลตอบแทนบางอย่าง ดังนั้นจึงเป็นการดีที่สุดที่จะใช้เป็นไฟล์การกำหนดค่า SQL อย่างง่ายและเฟรมเวิร์ก ORM ที่เรียบง่าย อย่าพยายามทำ SQL แบบไดนามิกมากเกินไปใน mybatis มิฉะนั้นมันจะทำให้การบำรุงรักษาที่ตามมานั้นน่าขยะแขยงมาก
ข้างต้นเป็นบทสรุปการเรียนรู้ mybatis ที่บรรณาธิการแนะนำให้คุณรู้จัก ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!