ในการพัฒนาโครงการเรามักจะพบกับสถานการณ์ที่ชื่อฟิลด์ในตารางและชื่อแอตทริบิวต์ของคลาสเอนทิตีที่สอดคล้องกันของตารางอาจไม่เหมือนกันอย่างแน่นอน ตัวแก้ไขต่อไปนี้จะแสดงให้คุณเห็นถึงวิธีการแก้ปัญหาความขัดแย้งของชื่อฟิลด์ที่แตกต่างกันและคลาสเอนทิตีในกรณีนี้ เพื่อนที่สนใจจะเรียนรู้ร่วมกัน
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 (), 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 version = "." การเข้ารหัส = "utf-"?> <! doctype mapper สาธารณะ "-// mybatis.org//dtd mapper .//en" "http://mybatis.org/dtd/mybatis--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" resultSpe = "me.gacl.domain.order"> เลือก * จากคำสั่งซื้อที่ order_id =#{id} </select> <!-! วัตถุคำสั่งซื้อได้มาจากการสืบค้น ID การใช้แบบสอบถามนี้เราสามารถสอบถามผลลัพธ์ที่เราต้องการได้โดยปกติ
นี่เป็นเพราะเราจะให้นามแฝงแบบสอบถามที่มีชื่อแอตทริบิวต์เดียวกันกับชื่อแอตทริบิวต์คลาสเอนทิตีเพื่อให้ชื่อแอตทริบิวต์ของคลาสเอนทิตีและชื่อฟิลด์ในผลลัพธ์การสืบค้นสามารถติดต่อได้หนึ่งต่อหนึ่ง
-> <select id = "selectorder" parameterType = "int" resultSpe = "me.gacl.domain.order"> เลือก order_id id, order_no orderno, ราคา order_price จากคำสั่งซื้อที่ order_id =#{id} </select> <!-! ตามการสืบค้น ID เราสามารถรับวัตถุคำสั่งซื้อได้ การใช้แบบสอบถามนี้เราสามารถสอบถามผลลัพธ์ที่เราต้องการได้ตามปกติ นี่เป็นเพราะเราแมปการติดต่อแบบตัวต่อตัวระหว่างชื่อแอตทริบิวต์คลาสเอนทิตีและชื่อฟิลด์ของตารางผ่าน <resultmap>->
<select id = "selectorderResultMap" parameterType = "int" resultmap = "orderResultMap"> เลือก * จากคำสั่งซื้อที่ order_id =#{id} </select> <! ฟิลด์โดยใช้คุณสมบัติ id-> <id property = "id" คอลัมน์ = "order_id"/> <!-การแมปฟิลด์คีย์ที่ไม่ใช่เบื้องต้นโดยใช้คุณสมบัติผลลัพธ์-> <property result = "orderno" คอลัมน์ = "order_no"/> <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 // ดำเนินการค้นหาและ ecapsulate การดำเนินการ SQL โดยใช้ SQLSession คุณต้องปิด SQLSessionsQlSession.close (); System.out.println (คำสั่งซื้อ); // ผลการพิมพ์: null นั่นคือไม่พบระเบียนที่สอดคล้องกัน} @testpublic void testgetOrderByIdid () {sqlsession sqlsession = mybatisutil.getsqlsession () maptibute of that ไฟล์ ordermapper.xml, * SelectOrder เป็นค่าแอตทริบิวต์ ID ของแท็กเลือก ผ่านค่าแอตทริบิวต์ ID ของแท็ก SELECT คุณสามารถค้นหา SQL ที่จะดำเนินการได้ */stress statement = "me.gacl.mapping.ordermapper.selectorder"; // แผนที่การระบุ SQL String // ดำเนินการค้นหาแบบสอบถามและสรุปผลลัพธ์การสืบค้นโดยอัตโนมัติลงในวัตถุคำสั่งซื้อและส่งคืนลำดับ = sqlsession.selectone (คำสั่ง) sqlsessionsqlsession.close (); System.out.println (คำสั่งซื้อ); // ผลการพิมพ์: คำสั่งซื้อ [id =, orderno = aaaa, ราคา =.]}@testpublic void testgetOrderByid () {sqlsession sqlsession = mybatisutil.getSqlSession () แท็ก Mapper ในไฟล์ ordermapper.xml * SelectOrdResultMap เป็นค่าแอตทริบิวต์ ID ของแท็ก SELECT ผ่านค่าแอตทริบิวต์ ID ของแท็ก SELECT คุณสามารถค้นหา SQL ที่จะดำเนินการได้ */stress statement = "me.gacl.mapping.ordermapper.selectorderResultMap"; // การแมปสตริงการระบุตัวตน SQL // ดำเนินการค้นหาแบบสอบถามและห่อหุ้มผลลัพธ์การสืบค้นโดยอัตโนมัติ sqlsessionsqlsession.close (); System.out.println (คำสั่งซื้อ); // ผลการพิมพ์: สั่งซื้อ [id =, orderno = aaaa, ราคา =.]}} ผลลัพธ์ของการดำเนินการทดสอบหน่วย:
1. วิธี TestGetOrderById ส่งคืนค่าว่างหลังจากดำเนินการสืบค้น
2. หลังจากวิธี TestGetOrderById2 และวิธี TestGetOrderById3 จะดำเนินการค้นหาคุณสามารถรับผลลัพธ์ที่ต้องการได้ตามปกติ
4. สรุป
รหัสทดสอบข้างต้นแสดงให้เห็นถึงปัญหาที่เมื่อชื่อแอตทริบิวต์ในคลาสเอนทิตีและชื่อฟิลด์ในตารางไม่สอดคล้องกันผลลัพธ์ที่สอดคล้องกันไม่สามารถสอบถามได้เมื่อใช้ mybatis สำหรับการดำเนินการแบบสอบถามและสองวิธีจะนำมาใช้สำหรับปัญหา:
วิธีแก้ปัญหาที่ 1: กำหนดนามแฝงของชื่อฟิลด์ในคำสั่ง Query SQL เพื่อให้นามแฝงของชื่อฟิลด์สอดคล้องกับชื่อแอตทริบิวต์ของคลาสเอนทิตีเพื่อให้ชื่อฟิลด์ของตารางสามารถสอดคล้องกันทีละหนึ่งชื่อแอตทริบิวต์ของคลาสเอนทิตี วิธีนี้แก้ความสัมพันธ์การแมประหว่างชื่อฟิลด์และชื่อแอตทริบิวต์โดยการกำหนดนามแฝงในคำสั่ง SQL
โซลูชันที่ 2: แมปการติดต่อแบบหนึ่งต่อหนึ่งระหว่างชื่อฟิลด์และชื่อแอตทริบิวต์คลาสเอนทิตีผ่าน <resultmap> วิธีนี้ใช้โซลูชันที่จัดทำโดย MyBatis เพื่อแก้ไขความสัมพันธ์การแมประหว่างชื่อฟิลด์และชื่อแอตทริบิวต์
ข้างต้นเป็นบทช่วยสอนการเรียนรู้ MyBatis ที่แนะนำโดย Editor (IV) - วิธีแก้ไขความขัดแย้งระหว่างชื่อฟิลด์และชื่อแอตทริบิวต์เอนทิตี ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!