รู้เบื้องต้นเกี่ยวกับ mybatis
MyBatis เป็นเฟรมเวิร์กเลเยอร์การคงอยู่ที่ยอดเยี่ยมที่รองรับการสืบค้น SQL แบบธรรมดาขั้นตอนที่เก็บไว้และการทำแผนที่ขั้นสูง MyBatis กำจัดการตั้งค่าด้วยตนเองของรหัส JDBC เกือบทั้งหมดและพารามิเตอร์และการค้นหาการห่อหุ้มของชุดผลลัพธ์ MyBatis สามารถใช้ XML อย่างง่ายหรือคำอธิบายประกอบสำหรับการกำหนดค่าและการแมปดั้งเดิมการแมปอินเทอร์เฟซและ pojos ของ Java (วัตถุ Java เก่าธรรมดา) ลงในบันทึกในฐานข้อมูล
สถาปัตยกรรมการทำงานของ MyBatis แบ่งออกเป็นสามชั้น (รูปภาพถูกยืมมาจากสารานุกรม Baidu):
1) เลเยอร์อินเทอร์เฟซ API: จัดเตรียม API อินเตอร์เฟสสำหรับการใช้งานภายนอกซึ่งนักพัฒนาจัดการฐานข้อมูล เมื่อเลเยอร์อินเตอร์เฟสได้รับคำขอการโทรจะเรียกเลเยอร์การประมวลผลข้อมูลเพื่อทำการประมวลผลข้อมูลเฉพาะให้เสร็จสิ้น
2) เลเยอร์การประมวลผลข้อมูล: รับผิดชอบการค้นหา SQL ที่เฉพาะเจาะจงการแยกวิเคราะห์ SQL การดำเนินการ SQL และการประมวลผลการแมปผลการดำเนินการ ฯลฯ วัตถุประสงค์หลักคือการดำเนินการฐานข้อมูลให้เสร็จสมบูรณ์ตามคำขอของการโทร
3) เลเยอร์การสนับสนุนพื้นฐาน: รับผิดชอบการสนับสนุนการทำงานขั้นพื้นฐานที่สุดรวมถึงการจัดการการเชื่อมต่อการจัดการธุรกรรมการโหลดการกำหนดค่าและการประมวลผลแคช สิ่งเหล่านี้เป็นสิ่งที่พบได้ทั่วไปโดยแยกพวกมันออกเป็นองค์ประกอบพื้นฐานที่สุด ให้การสนับสนุนขั้นพื้นฐานที่สุดสำหรับชั้นบนของเลเยอร์การประมวลผลข้อมูล
เมื่อเลือกการแมปใน mybatis ประเภทการส่งคืนสามารถใช้กับผลลัพธ์หรือผลลัพธ์ได้ ResultType แสดงถึงประเภทการส่งคืนโดยตรงในขณะที่ ResultMap เป็นข้อมูลอ้างอิงถึงผลลัพธ์ภายนอก แต่ ResultType และผลลัพธ์ไม่สามารถมีอยู่ในเวลาเดียวกัน เมื่อ MyBatis กำลังค้นหาการแมปในความเป็นจริงแต่ละแอตทริบิวต์แบบสอบถามจะถูกวางไว้ในแผนที่ที่สอดคล้องกันซึ่งคีย์คือชื่อแอตทริบิวต์และค่าคือค่าที่สอดคล้องกัน เมื่อแอตทริบิวต์ประเภท Return ที่ให้มาคือ ResultType, MyBatis จะนำคู่ค่าคีย์ออกมาในแผนที่และกำหนดให้กับแอตทริบิวต์ที่สอดคล้องกันของวัตถุที่ระบุโดย ResultType ดังนั้นในความเป็นจริงประเภทการกลับมาของแผนที่แบบสอบถามแต่ละตัวของ mybatis เป็นผลลัพธ์ที่ได้ อย่างไรก็ตามเมื่อแอตทริบิวต์ Type Return เรามีให้คือ ResultType, MyBatis จะกำหนดค่าที่สอดคล้องกันโดยอัตโนมัติไปยังแอตทริบิวต์ของวัตถุที่ระบุโดย ResultType เมื่อประเภทการส่งคืนที่เราให้คือผลลัพธ์ที่ได้เนื่องจากแผนที่ไม่สามารถแสดงโมเดลโดเมนได้ดีเราจำเป็นต้องแปลงมันเป็นวัตถุที่เกี่ยวข้องเองซึ่งมักจะมีประโยชน์มากในการสืบค้นที่ซับซ้อน
มีไฟล์ blog.java
นำเข้า java.util.list; บล็อกระดับสาธารณะ {ID ส่วนตัว ID; ชื่อสตริงส่วนตัว; เนื้อหาสตริงส่วนตัว; เจ้าของสตริงส่วนตัว; รายการส่วนตัว <ความคิดเห็น> ความคิดเห็น; public int getId () {return id;} โมฆะสาธารณะ setId (int id) {this.id = id;} สตริงสาธารณะ {return content;} โมฆะสาธารณะ setContent (เนื้อหาสตริง) {this.content = content;} สตริงสาธารณะ getOwner () {return เจ้าของ;} โมฆะสาธารณะ setowner (เจ้าของสตริง) {this.Owner = เจ้าของ;} รายการสาธารณะ <ความคิดเห็น> getComments () toString() {return " ----------------博客-----------------/n id: " + id + "/n title: " + title + "/n content: " + content+ "/n owner: " + owner;}}ตารางฐานข้อมูลที่เกี่ยวข้องมี ID, ชื่อเรื่องเนื้อหาและแอตทริบิวต์เจ้าของ เมื่อเราทำการแมปแบบสอบถามต่อไปนี้
<typealias alias = "blog" type = "com.tiantian.mybatis.model.blog"/> <!-ไฟล์การกำหนดค่าจาก mybatis mybatis_config.xml-> <select id = "selectblog" parameterType = "int" blogmapper.xml->
MyBatis จะสร้างวัตถุ MAP โดยอัตโนมัติจากนั้นห่อหุ้มคู่ค่าคีย์ตามชื่อแอตทริบิวต์ที่พบ จากนั้นคุณจะเห็นว่าประเภทการส่งคืนเป็นวัตถุบล็อกจากนั้นนำคู่ค่าคีย์ออกมาซึ่งสอดคล้องกับวัตถุบล็อกจาก ResultMap และกำหนด
นอกจากนี้ยังมีประโยชน์มากเมื่อประเภทการส่งคืนเป็นผลลัพธ์โดยตรงซึ่งส่วนใหญ่ใช้สำหรับการสืบค้นข้อต่อที่ซับซ้อนเนื่องจากไม่จำเป็นต้องดำเนินการสืบค้นง่าย ๆ ก่อนอื่นลองดูที่สืบค้นง่าย ๆ ที่มีผลลัพธ์ประเภทส่งคืนจากนั้นดูการใช้การสืบค้นที่ซับซ้อน
วิธีการเขียนแบบสอบถามง่ายๆ
<resultmap type = "blog" id = "blogresult"> <id column = "id" คุณสมบัติ = "id"/> <result column = "title" คุณสมบัติ = "title"/> <result column = "เนื้อหา" คุณสมบัติ = "เนื้อหา"/> <result column = "เจ้าของ" เจ้าของ = "เจ้าของ"/> < คุณสมบัติ = "เจ้าของ"/> <</resultmap> <select id = "selectblog" parameterType = "int" resultmap = "blogresult"> เลือก * จาก t_blog โดยที่ id = #{id} </select>ค่าของผลลัพธ์ที่ได้ในแผนที่เลือกคือ ID ของผลลัพธ์ภายนอกซึ่งระบุว่าผลลัพธ์ใดที่แมปไปยัง แอตทริบิวต์ประเภทของผลลัพธ์ภายนอกหมายถึงประเภทผลลัพธ์ของผลลัพธ์ของผลลัพธ์คืออะไร นี่คือประเภทบล็อกดังนั้น mybatis จะนำมันออกเป็นวัตถุบล็อก ID โหนดลูกของโหนดผลลัพธ์ที่ใช้ในการระบุ ID ของวัตถุในขณะที่โหนดลูกผลลัพธ์จะใช้เพื่อระบุคุณสมบัติง่าย ๆ บางอย่าง คุณสมบัติคอลัมน์แสดงถึงแอตทริบิวต์ที่สอบถามจากฐานข้อมูลและคุณสมบัติแสดงถึงคุณสมบัติใดที่คุณสมบัติที่สอดคล้องกันของคุณสมบัติการสืบค้นถูกกำหนดให้กับวัตถุเอนทิตี นี่คือวิธีการเขียนผลลัพธ์สำหรับการสืบค้นง่าย ๆ จากนั้นมาดูการสืบค้นที่ซับซ้อนมากขึ้น
มีคลาสความคิดเห็นซึ่งมีการอ้างอิงบล็อกซึ่งระบุว่าบล็อกใดมีไว้สำหรับ เมื่อสอบถามความคิดเห็นเราจะต้องค้นหาบล็อกที่เกี่ยวข้องและกำหนดให้กับแอตทริบิวต์บล็อก
นำเข้า java.util.date; ความคิดเห็นระดับสาธารณะ {ID ส่วนตัว ID; เนื้อหาสตริงส่วนตัว; วันที่ส่วนตัวความคิดเห็นวันที่ = วันที่ใหม่ (); บล็อกสาธารณะบล็อก; public int getId () {return id;} โมฆะสาธารณะ setId (int id) {this.id = id;} public String getContent () {return commentDate;} โมฆะสาธารณะ setCommentDate (วันที่แสดงความคิดเห็น) {this.commentDate = commentDate;} บล็อกสาธารณะ getBlog () {return blog;} โมฆะสาธารณะ setBlog (บล็อกบล็อก) {this.blog = บล็อก;} สตริงสาธารณะ "/n commentDate:" + commentDate;}}มันเขียนแบบนี้
<!-จาก commentMapper.xml ไฟล์-> <resultmap type = "ความคิดเห็น" id = "commentResult"> <Association property = "blog" select = "selectblog" คอลัมน์ = "blog" javatype = "blog"/> </resultmap> <select id = "selectcomment" #{id} </select> <select id = "selectblog" parameterType = "int" resultType = "blog"> เลือก * จาก t_comment โดยที่ id = #} </select> <select id = "selectBlog" parameterType = "int"สถานการณ์การเข้าถึงเป็นเช่นนี้ ก่อนอื่นคุณขอแผนที่เลือกด้วย ID ของ SelectComment จากนั้นคุณจะได้รับวัตถุ ResultMap ด้วย ID ของ CommentResult เราจะเห็นได้ว่าประเภทการส่งคืนของผลลัพธ์ที่สอดคล้องกันคือวัตถุความคิดเห็นซึ่งมีเพียงหนึ่งโหนดการเชื่อมโยงและไม่มี ID และผลลัพธ์โหนดลูกที่สอดคล้องกับแบบสอบถามง่าย ๆ ที่กล่าวถึงข้างต้น แต่มันจะยังคงกำหนด ID ที่เกี่ยวข้องและแอตทริบิวต์อื่น ๆ ให้กับวัตถุความคิดเห็น นี่คือสิ่งที่ MYB กล่าวถึงก่อนหน้านี้ ATIS มีฟังก์ชั่นการห่อหุ้มอัตโนมัติ ตราบใดที่คุณให้ประเภทการส่งคืน MyBatis จะใช้ผลลัพธ์การสืบค้นเพื่อห่อหุ้มวัตถุที่เกี่ยวข้องตามการตัดสินของตัวเอง ดังนั้นในแบบสอบถามง่าย ๆ ด้านบนหากคุณไม่ได้ระบุว่าฟิลด์ใดที่สอดคล้องกับ ID และฟิลด์ใดที่สอดคล้องกับชื่อเรื่องในผลลัพธ์ MyBatis จะห่อหุ้มมันตามการตัดสินของตัวเอง การตัดสินของ MyBatis คือการเปรียบเทียบฟิลด์ของการสืบค้นหรือนามแฝงที่สอดคล้องกันกับคุณลักษณะของวัตถุส่งคืน ถ้ามันเข้ากันและประเภทก็ตรงกับ MyBatis จะกำหนด แอตทริบิวต์บล็อกมีความเกี่ยวข้องในผลลัพธ์ที่สอดคล้องกันด้านบนและประเภท Java ที่สอดคล้องกันคือบล็อก ในวิธีการเขียนข้างต้นวัตถุที่เกี่ยวข้องนั้นเกี่ยวข้องกับการคาดการณ์ย่อยและแน่นอนว่ามันยังสามารถเชื่อมโยงโดยตรงผ่านการสืบค้นสมาคม ในโหนด Association Association ข้างต้นแอตทริบิวต์คุณสมบัติระบุว่าคุณสมบัติใดที่เกี่ยวข้องคือประเภทผลตอบแทนผลลัพธ์ สำหรับตัวอย่างข้างต้นแอตทริบิวต์บล็อกที่จัดการโดยความคิดเห็น; เลือกระบุว่าเลือกแผนที่ใดเพื่อทำแผนที่แอตทริบิวต์ที่เกี่ยวข้องที่เกี่ยวข้องนั่นคือจะขอแผนที่เลือกด้วยค่าที่สอดคล้องกันเพื่อเลือกเพื่อค้นหาวัตถุแอตทริบิวต์ที่เกี่ยวข้อง คอลัมน์ระบุคู่คีย์-ค่าที่สอดคล้องกับผลลัพธ์ที่มี ID commentResult คู่คีย์-ค่านี้จะถูกใช้เป็นพารามิเตอร์สำหรับคำถามย่อยของวัตถุที่เกี่ยวข้องนั่นคือค่าของการสืบค้นแอตทริบิวต์บล็อกใน SelectComment จะถูกส่งผ่านเป็นพารามิเตอร์ไปยังคำถามย่อยของบล็อกวัตถุที่เกี่ยวข้องกับคำถามย่อยของบล็อกวัตถุที่เกี่ยวข้อง Javatype ระบุประเภทของวัตถุที่เกี่ยวข้องในปัจจุบันที่อยู่ใน Java
ข้างต้นแนะนำการสืบค้นของความสัมพันธ์แบบหนึ่งต่อหนึ่งหรือหนึ่งต่อหนึ่งกับฝ่ายเดียวในกรณีของหนึ่งถึงหลายคน ในแอปพลิเคชันจริงมีแอปพลิเคชันอื่นที่ใช้บ่อยขึ้น มีความจำเป็นที่จะต้องค้นหาฝ่ายที่เกี่ยวข้องมากขึ้นผ่านฝ่ายใดฝ่ายหนึ่ง เมื่อออกไปงานปาร์ตี้มากขึ้นฝ่ายหนึ่งจะต้องเชื่อมโยงกับฝ่ายหนึ่งด้วย นั่นคือในตัวอย่างข้างต้นเมื่อนำวัตถุบล็อกออกมาความคิดเห็นที่เกี่ยวข้องทั้งหมดจะถูกนำออกมา เมื่อนำความคิดเห็นออกมาก็ยังต้องนำบล็อกที่เกี่ยวข้องออกมา สิ่งนี้ถูกนำออกมาผ่านคำขอใน Java วิธีการเขียนมีดังนี้:
<!-จาก blogmapper.xml ไฟล์-> <resultmap type = "blog" id = "blogresult"> <id column = "id" property = "id"/> <collection property = "ความคิดเห็น" select = "selectcommentsbyblog" column = "id" ของ type = "ความคิดเห็น" javatype = "blog" column = "blog" select = "selectblog"/> </resultmap> <select id = "selectblog" parameterType = "int" resultmap = "blogresult"> เลือก * จาก t_blog โดยที่ id = #{id} </select> <! resultmap = "commentResult"> เลือก * จาก t_comment โดยที่ blog = #{blogid} </select>รายการของคำขอด้านบนคือแผนที่เลือกด้วย ID SelectBlog และผลลัพธ์การส่งคืนเป็นผลลัพธ์ที่มี ID blogresult ประเภทของ ID blogresult คือบล็อกซึ่งระบุคุณสมบัติและฟิลด์ของ ID การระบุ ID จะมีผลอย่างมากต่อการก่อสร้างภายในของ mybatis มันเกี่ยวข้องกับวัตถุความคิดเห็น เนื่องจากบล็อกสามารถมีความคิดเห็นมากมายซึ่งเป็นคอลเลกชันดังนั้นจึงถูกแมปกับคอลเลกชันคอลเลกชัน SELECT ยังคงระบุว่าคำถามย่อยใดที่ดำเนินการเพื่อสอบถามความคิดเห็นที่เกี่ยวข้อง คอลัมน์หมายถึงค่าฟิลด์ที่พบด้านบนจะถูกส่งผ่านไปยังคำถามย่อยเป็นพารามิเตอร์ OfType ยังแสดงถึงประเภทการส่งคืน ประเภทการส่งคืนที่นี่เป็นประเภทภายในคอลเลกชัน เหตุผลที่มีการใช้ ttype แทนประเภทคือมันถูกใช้ภายใน mybatis เพื่อแยกความแตกต่างจากสมาคมสมาคม
รหัสทดสอบ:
@TestPublic Void SelectcommentsByBlogTest () {SQLSession Session = UTIL.GETSQLSessionFactory (). OpenSession (); commentMapper commentMapper = session.getMapper ความคิดเห็น) System.out.println (ความคิดเห็น); session.close ();}/*** สอบถามบันทึกเดียว*/@testpublic void testselectone () {sqlsession session = util.getsqlsessionfactory () opensession (); blogmapper blogmapper = session.getmapper (blogmapper.class) blogmapper.selectblog (6); รายการ <ความคิดเห็น> ความคิดเห็น = blog.getcomments (); ถ้า (ความคิดเห็น! = null) {system.out.println ("-------------- ความคิดเห็น ------------" + comments.size ());ข้างต้นเป็นภาพรวมโดยย่อของผลลัพธ์ใน MyBatis ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!