บทความนี้เป็นความรู้เกี่ยวกับระดับเอนทิตีและปัญหาการทำแผนที่ตารางใน MyBatis นำมาให้คุณโดยบรรณาธิการ การเรียนรู้บทช่วยสอนนี้สามารถช่วยเราแก้ปัญหาความขัดแย้งของชื่อฟิลด์ที่แตกต่างกันและชื่อแอตทริบิวต์คลาสเอนทิตี เพื่อนที่ต้องการมาดูกันเถอะ!
1. เตรียมตารางและข้อมูลที่จะใช้สำหรับการสาธิต
สร้างคำสั่งซื้อตาราง (ORDER_ID int คีย์หลัก auto_increment, order_no varchar (20), order_price ลอย); แทรกลงในคำสั่ง (order_no, order_price) ค่า ('aaaa', 23); แทรกลงในคำสั่งซื้อ (order_no, order_price) 22);2. กำหนดคลาสเอนทิตี
แพ็คเกจ me.gacl.domain;/*** @author gacl*กำหนดคลาสเอนทิตีที่สอดคล้องกับตารางคำสั่งซื้อ*/ลำดับระดับสาธารณะ {/*** สร้างคำสั่งซื้อตาราง (order_id int หลักคีย์หลัก auto_increment, order_no varchar (20), order_price float);*/// // id ===> order_idprivate string orderno; // orderno ===> order_noprivate ราคาลอย; // price ===> order_pricepublic int getid () {return id;} โมฆะสาธารณะ setId (int id) {this.id = id;} สตริงสาธารณะ getOrderNo () {return orderno;} public void setOrderNo {this.price = price;}@overridepublic String toString () {return "order [id =" + id + ", orderno =" + orderno + ", price =" + price + "]";}}}}3. เขียนรหัสทดสอบ
3.1. เขียนไฟล์การแมป SQL XML
1. สร้างไฟล์ ordermapper.xml เนื้อหาของ ordermapper.xml มีดังนี้:
<? xml เวอร์ชัน = "1.0" การเข้ารหัส = "utf-8"?> <! doctype mapper สาธารณะ "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd ค่าของเนมสเปซถูกตั้งค่าตามปกติเป็นชื่อแพ็คเกจ + ชื่อไฟล์การแมป SQL เพื่อให้ค่าของเนมสเปซสามารถรับประกันได้ว่าไม่ซ้ำกัน
ตัวอย่างเช่น namespace = "me.gacl.mapping.ordermapper" คือ me.gacl.mapping (ชื่อแพ็คเกจ) + ordermapper (ไฟล์ ordermapper.xml เพื่อลบคำต่อท้าย)
-> <mapper namespace = "me.gacl.mapping.ordermapper"> <!-รับวัตถุการสั่งซื้อตามแบบสอบถาม ID การใช้แบบสอบถามนี้ไม่สามารถสอบถามผลลัพธ์ที่เราต้องการได้ นี่เป็นส่วนใหญ่เป็นเพราะชื่อแอตทริบิวต์ของคลาสเอนทิตีไม่สอดคล้องกับชื่อฟิลด์ของฐานข้อมูลดังนั้นบันทึกที่สอดคล้องกันไม่สามารถสอบถามได้-> <select id = "getOrderById" พารามิเตอร์ "parameterType =" int "resultType =" me.gacl.domain.order " การใช้แบบสอบถามนี้เราสามารถสอบถามผลลัพธ์ที่เราต้องการได้โดยปกติ นี่เป็นเพราะเราจะให้นามแฝงแบบสอบถามที่มีนามแฝงเช่นเดียวกับชื่อแอตทริบิวต์คลาสเอนทิตีเพื่อให้ชื่อแอตทริบิวต์ของคลาสเอนทิตีและชื่อฟิลด์ในผลลัพธ์การสืบค้นสามารถติดต่อได้ทีละหนึ่ง-> <select id = "selectorder" พารามิเตอร์ order_id order, orderfrice order_id =#{id} </select> <!- รับวัตถุสั่งซื้อตามแบบสอบถาม ID การใช้แบบสอบถามนี้เราสามารถสอบถามผลลัพธ์ที่เราต้องการได้ตามปกติ นี่เป็นเพราะเราแมปการติดต่อแบบหนึ่งต่อหนึ่งระหว่างชื่อแอตทริบิวต์คลาสเอนทิตีและชื่อฟิลด์ของตารางผ่าน <resultmap> ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - คอลัมน์ = "order_id"/> <!-ใช้แอตทริบิวต์ผลลัพธ์เพื่อแมปฟิลด์คีย์ที่ไม่ได้ดำเนินการ-> <property result = "orderno" คอลัมน์ = "order_no"/> <result property = "price" คอลัมน์ = "order_price"/> <result property = "price"2. ลงทะเบียนไฟล์การแมป ordermapper.xml ในไฟล์ conf.xml
<mappers> <!- ลงทะเบียนไฟล์ ordermapper.xml ordermapper.xml อยู่ในแพ็คเกจ me.gacl.mapping ดังนั้นทรัพยากรจึงถูกเขียนเป็น ME/GACL/Mapping/OrderMapper.xml-> <mapper Resource = "ME/GACL/Mapping/OrderMapper.xml"/> </mappers>
3.2. เขียนรหัสทดสอบหน่วย
แพ็คเกจ me.gacl.test; นำเข้า me.gacl.domain.order; นำเข้า Me.gacl.util.mybatisutil; นำเข้า org.apache.ibatis.session.sqlsession; นำเข้า org.junit.test; MyBatisutil.getSqlSession ();/*** สตริงการระบุสำหรับการแมป SQL,* me.gacl.mapping.ordermapper เป็นค่าของแอตทริบิวต์เนมสเปซของแท็ก mapper ในไฟล์ ordermapper.xml ผ่านค่าแอตทริบิวต์ ID ของแท็กที่เลือกคุณสามารถค้นหา SQL ที่จะดำเนินการ*/string statement = "me.gacl.mapping.ordermapper.getOrderById"; // การแมปสตริงการระบุ SQL // ดำเนินการแบบสอบถาม ตาราง // หลังจากใช้ SQLSession Execute SQL คุณต้องปิด SQLSessionsQlSession.close (); System.out.println (คำสั่งซื้อ); // ผลการพิมพ์: null, นั่นคือไม่พบบันทึกที่สอดคล้องกัน} @testpublic void testgetOrderByidByid2 () {sqlsession sqlsession = mybatisutil.getSqlSession ()/*** แผนที่ ไฟล์ ordermapper.xml, * SelectOrder เป็นค่าแอตทริบิวต์ ID ของแท็กเลือก ผ่านค่าแอตทริบิวต์ ID ของแท็กที่เลือกคุณสามารถค้นหา SQL ที่จะดำเนินการโดยใช้ค่าแอตทริบิวต์ ID ของคำสั่ง Select Tag*/String = "Me.gacl.mapping.ordermapper.selectorder"; // การแมป SQL Identity String // บันทึกด้วย ID 1 ในตารางคำสั่งซื้อ // หลังจากดำเนินการ SQL โดยใช้ SQLSession คุณต้องปิด sqlsessionsqlsession.close (); System.out.println (คำสั่งซื้อ); // ผลการพิมพ์: คำสั่งซื้อ [id = 1, orderno = aaaa, ราคา = 23.0]}@testpublic โมฆะ testgetOrderByid3 () {sqlsession sqlsession = mybatisutil.getsqlsession () แอตทริบิวต์ของแท็ก mapper ในไฟล์ ordermapper.xml, * SelectorderResultMap เป็นค่าแอตทริบิวต์ ID ของแท็ก SELECT ผ่านค่าแอตทริบิวต์ id ของแท็กที่เลือก SQL ที่จะดำเนินการสามารถพบได้*/string statement = "me.gacl.mapping.ordermapper.selectorderResultMap"; // การแมปสตริง SQL Identity // การดำเนินการสืบค้น 1 คำสั่งซื้อตาราง // หลังจากใช้ sqlsession เพื่อดำเนินการ SQL คุณต้องปิด sqlsessionsqlsession.close (); System.out.println (คำสั่งซื้อ); // ผลการพิมพ์: สั่งซื้อ [id = 1, orderno = aaaa, ราคา = 23.0]}}ผลลัพธ์ของการดำเนินการทดสอบหน่วย:
1. วิธี TestGetOrderById ส่งคืนค่าว่างหลังจากดำเนินการสืบค้น
2. หลังจากวิธี TestGetOrderById2 และวิธี TestGetOrderById3 จะดำเนินการค้นหาคุณสามารถรับผลลัพธ์ที่ต้องการได้ตามปกติ
4. สรุป
รหัสทดสอบข้างต้นแสดงให้เห็นถึงปัญหาที่เมื่อชื่อแอตทริบิวต์ในคลาสเอนทิตีและชื่อฟิลด์ในตารางไม่สอดคล้องกันผลลัพธ์ที่สอดคล้องกันไม่สามารถสอบถามได้เมื่อใช้ mybatis สำหรับการดำเนินการแบบสอบถามและสองวิธีจะนำมาใช้สำหรับปัญหา:
วิธีแก้ปัญหาที่ 1: กำหนดนามแฝงของชื่อฟิลด์ในคำสั่ง Query SQL เพื่อให้นามแฝงของชื่อฟิลด์สอดคล้องกับชื่อแอตทริบิวต์ของคลาสเอนทิตีเพื่อให้ชื่อฟิลด์ของตารางสามารถสอดคล้องกันทีละหนึ่งชื่อแอตทริบิวต์ของคลาสเอนทิตี วิธีนี้แก้ความสัมพันธ์การแมประหว่างชื่อฟิลด์และชื่อแอตทริบิวต์โดยการกำหนดนามแฝงในคำสั่ง SQL
โซลูชันที่ 2: แมปการติดต่อแบบหนึ่งต่อหนึ่งระหว่างชื่อฟิลด์และชื่อแอตทริบิวต์คลาสเอนทิตีโดยการแมป วิธีนี้ใช้โซลูชันที่จัดทำโดย MyBatis เพื่อแก้ไขความสัมพันธ์การแมประหว่างชื่อฟิลด์และชื่อแอตทริบิวต์