1. การเชื่อมโยงแบบตัวต่อตัว
1.1. เสนอข้อกำหนด
ข้อมูลชั้นเรียนแบบสอบถามตาม ID คลาส (ข้อมูลกับครู)
1.2. สร้างตารางและข้อมูล
สร้างตารางครูและตารางชั้นเรียน ที่นี่เราคิดว่าครูมีความรับผิดชอบในการสอนชั้นเรียนเดียวเท่านั้นดังนั้นความสัมพันธ์ระหว่างครูและชั้นเรียนจึงเป็นความสัมพันธ์แบบตัวต่อตัว
สร้าง Table Teacher (t_id int คีย์หลัก auto_increment, t_name varchar ()); สร้างคลาสตาราง (c_id int คีย์หลัก auto_increment, c_name varchar (), teacher_id int); เปลี่ยนคลาสตารางเพิ่มข้อ จำกัด FK_TEACHER_ID คีย์ต่างประเทศ (Teacher_ID) การอ้างอิงครู (T_ID); แทรกเข้าไปในค่าครู (t_name) ('ครู'); แทรกเข้าไปในค่าครู (t_name) ('ครู'); แทรกลงในคลาส (c_name, ค่าครู _id) ('class_a',); แทรกลงในคลาส (c_name, ค่าครู _id) ('class_b', 2); ความสัมพันธ์ระหว่างตารางมีดังนี้:
1.3. กำหนดคลาสเอนทิตี
1. ชั้นเรียนครูชั้นเรียนครูเป็นชั้นเรียนที่สอดคล้องกับตารางครู
แพ็คเกจ me.gacl.domain; /*** @author GACL* กำหนดคลาสเอนทิตีที่สอดคล้องกับตารางครู*/ครูชั้นเรียนสาธารณะ {// กำหนดคุณลักษณะของคลาสเอนทิตีซึ่งสอดคล้องกับฟิลด์ในตารางครู // id ===> ชื่อสตริงส่วนตัว t_id; // name ===> t_name สาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } @Override สตริงสาธารณะ toString () {return "ครู [id =" + id + ", name =" + name + "]"; -2. คลาสคลาสคลาสคลาสคือคลาสเอนทิตีที่สอดคล้องกับตารางคลาส
แพ็คเกจ me.gacl.domain; /*** @Author GACL* กำหนดคลาสเอนทิตีที่สอดคล้องกับตารางคลาส*/คลาสคลาสสาธารณะ {// กำหนดคุณลักษณะของคลาสเอนทิตีซึ่งสอดคล้องกับฟิลด์ในตารางคลาส ID ID ส่วนตัว // id ===> ชื่อสตริงส่วนตัว c_id; // name ===> c_name /** * มีฟิลด์ Teacher_id ในตารางชั้นเรียนดังนั้นแอตทริบิวต์ของครูจึงถูกกำหนดไว้ในคลาสคลาส * ใช้เพื่อรักษาความสัมพันธ์แบบหนึ่งต่อหนึ่งระหว่างครูและชั้นเรียน ผ่านคุณลักษณะของครูนี้คุณสามารถรู้ได้ว่าครูคนไหนที่รับผิดชอบในชั้นเรียนนี้*/ ครูสอนเอกชน สาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } ครูสาธารณะ getTeacher () {ครูกลับ; } โมฆะสาธารณะ setTeacher (ครูครู) {this.Teacher = ครู; } @Override สตริงสาธารณะ toString () {return "คลาส [id =" + id + ", name =" + name + ", ครู =" + ครู + "]"; - 1.4. กำหนดไฟล์ mapl mapl classmapper.xml
<? xml version = "." การเข้ารหัส = "utf-"?> <! doctype mapper สาธารณะ "-// mybatis.org//dtd mapper .//en" "http://mybatis.org/dtd/mybatis--mapper.dtd"> <! ค่าของเนมสเปซถูกตั้งค่าตามปกติเป็นชื่อแพ็คเกจ + ชื่อไฟล์การแมป SQL เพื่อให้ค่าของเนมสเปซสามารถรับประกันได้ว่าจะไม่ซ้ำกัน ตัวอย่างเช่น namespace = "me.gacl.mapping.classmapper" คือ me.gacl.mapping (ชื่อแพ็คเกจ) + classmapper (classmapper.xml คำต่อท้ายลบไฟล์)-> <mapper namespace = "me.gacl.mapping.classmapper"> < การสืบค้นตารางร่วมเลือก * จากคลาส C, ครู t โดยที่ c.teacher_id = t.t_id และ c.c_id =; - เรียกใช้การสืบค้นสองแบบเลือก * จากคลาสที่ c_id =; // teacher_id = เลือก * จากครูโดยที่ t_id =; // ใช้ teacher_id ที่ได้รับข้างต้น-> <!-วิธีที่ 1: ผลลัพธ์ที่ซ้อนกัน: ใช้แผนที่ผลลัพธ์ซ้อนกันเพื่อประมวลผลชุดย่อยของผลลัพธ์ร่วมที่ซ้ำกัน resultMap = "classResultMap"> เลือก * จากคลาส C, ครู t โดยที่ c.teacher_id = t.t_id และ c.c_id =#{id} </select> <!-ใช้ผลลัพธ์ map การติดต่อแบบหนึ่งต่อหนึ่งระหว่างคลาสและคลาส " column = "c_id"/> <result property = "name" column = "c_name"/> <Association property = "ครู" javatype = "me.gacl.domain.teacher"> <id property = "id" คอลัมน์ = "t_id"/> คำสั่งการแมป SQL เลือก * จากคลาสที่ c_id =; เลือก * จากครูโดยที่ t_id = // เป็นค่าของครูที่ได้รับจากแบบสอบถามก่อนหน้า-> <select id = "getClass" parameterType = "int" resultmap = "classResultMap"> เลือก * จากคลาสที่ c_id =#{id} </select> <! type = "me.gacl.domain.classes" id = "classResultMap"> <id property = "id" คอลัมน์ = "c_id"/> <result property = "name" คอลัมน์ = "c_name"/> <Association Property = "Teacher" Column = "Teacher_id" เลือก = "getTeacher"/> resultType = "me.gacl.domain.teacher"> เลือก t_id id, ชื่อ t_name จากครูโดยที่ t_id =#{id} </select> </mapper> ลงทะเบียน classmapper.xml ในไฟล์ conf.xml
<mappers> <!- ลงทะเบียนไฟล์ classmapper.xml classmapper.xml อยู่ในแพ็คเกจ me.gacl.mapping ดังนั้นทรัพยากรจึงถูกเขียนเป็น ME/GACL/Mapping/classmapper.xml-> <mapper Resource = "ME/GACL/Mapping/classmapper.xml"/> </mappers>
1.5. เขียนรหัสทดสอบหน่วย
แพ็คเกจ me.gacl.test; นำเข้า me.gacl.domain.classes; นำเข้า me.gacl.util.mybatisutil; นำเข้า org.apache.ibatis.session.sqlsession; นำเข้า org.junit.test; การทดสอบคลาสสาธารณะ {@Test โมฆะสาธารณะ TestGetClass () {SQLSession SQLSession = MyBatisUtil.getSqlSession (); /** * แผนที่สตริงการระบุ SQL, * me.gacl.mapping.classmapper เป็นค่าของแอตทริบิวต์เนมสเปซของแท็ก Mapper ในไฟล์ classmapper.xml, * getClass เป็นแอตทริบิวต์ ID ของแท็ก SELECT SQL ที่จะดำเนินการสามารถพบได้ผ่านค่าแอตทริบิวต์ ID ของคำสั่ง SELECT TAG */String = "Me.gacl.mapping.classmapper.getClass"; // การแมปสตริงการระบุตัวตนของ SQL // ดำเนินการสืบค้น ตาราง // หลังจากดำเนินการ SQL โดยใช้ sqlsession sqlsession.close (); System.out.println (clazz); // ผลการพิมพ์: คลาส [id =, name = class_a, ครู = ครู [id =, name = teacher]]} @Test โมฆะสาธารณะ TestGetClass () {SQLSession SQLSESSION = MyBatisUtil.GetSqlSession (); /** * แผนที่สตริงการระบุ SQL, * me.gacl.mapping.classmapper เป็นค่าของแอตทริบิวต์เนมสเปซของแท็ก Mapper ในไฟล์ classmapper.xml, * getClass เป็นแอตทริบิวต์ ID ของแท็ก SELECT SQL ที่จะดำเนินการสามารถพบได้ผ่านค่าแอตทริบิวต์ ID ของคำสั่ง SELECT TAG */String = "Me.gacl.mapping.classmapper.getClass"; // การแมปสตริงการระบุตัวตนของ SQL // ดำเนินการแบบสอบถาม/การใช้งาน/การใช้งาน SQLSession เพื่อดำเนินการ SQL คุณต้องปิด sqlsession sqlsession.close (); System.out.println (clazz); // ผลการพิมพ์: คลาส [id =, name = class_a, ครู = ครู [id =, name = teacher]]}} 1.6. บทสรุปของการสืบค้นสมาคมแบบตัวต่อตัว
MyBatis ใช้แท็กการเชื่อมโยงเพื่อแก้ปัญหาการเชื่อมโยงแบบหนึ่งต่อหนึ่ง คุณสมบัติที่มีอยู่ในแท็กสมาคมมีดังนี้:
•คุณสมบัติ: ชื่อของคุณสมบัติวัตถุ
• Javatype: ประเภทของแอตทริบิวต์วัตถุ
•คอลัมน์: ชื่อฟิลด์คีย์ต่างประเทศที่เกี่ยวข้อง
•เลือก: ใช้แบบสอบถามอื่นเพื่อห่อหุ้มผลลัพธ์
2. สมาคมหนึ่งถึงหลายคน
2.1. เสนอข้อกำหนด
สอบถามข้อมูลชั้นเรียนที่สอดคล้องกันตาม ClassID รวมถึงนักเรียนและครู
2.2. สร้างตารางและข้อมูล
ในการสาธิตการสืบค้นความสัมพันธ์แบบหนึ่งต่อหนึ่งด้านบนเราได้สร้างตารางชั้นเรียนและตารางครูดังนั้นที่นี่เราสร้างตารางนักเรียนอื่น
สร้าง Table Student (S_ID Int Key Auto_increment, S_name Varchar (20), class_id int); แทรกลงในนักเรียน (s_name, class_id) ค่า ('student_a', 1); แทรกนักเรียน (s_name, class_id) ค่า ('student_b', 1); ค่า class_id) ('student_d', 2); แทรกลงในนักเรียน (s_name, class_id) ค่า ('student_e', 2); แทรกลงในนักเรียน (s_name, class_id) ค่า ('student_f', 2); 2.3. กำหนดคลาสเอนทิตี
1. ชั้นเรียนนักเรียน
แพ็คเกจ me.gacl.domain; /*** @author GACL* กำหนดคลาสเอนทิตีที่สอดคล้องกับตารางนักเรียน*/นักเรียนชั้นเรียนสาธารณะ {// กำหนดคุณลักษณะที่สอดคล้องกับฟิลด์ในตารางนักเรียน ID ส่วนตัว // id ===> ชื่อสตริงส่วนตัว S_ID; // name ===> s_name สาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } @Override สตริงสาธารณะ toString () {return "นักเรียน [id =" + id + ", name =" + name + "]"; - 2. แก้ไขชั้นเรียนชั้นเรียนเพิ่มรายการ <student> แอตทริบิวต์นักเรียนและใช้แอตทริบิวต์รายการ <student> การรวบรวมเพื่อเป็นตัวแทนของนักเรียนที่ชั้นเรียนดังต่อไปนี้:
แพ็คเกจ me.gacl.domain; นำเข้า java.util.list; /*** @Author GACL* กำหนดคลาสเอนทิตีที่สอดคล้องกับตารางคลาส*/คลาสคลาสสาธารณะ {// กำหนดคุณลักษณะของคลาสเอนทิตีซึ่งสอดคล้องกับฟิลด์ในตารางคลาส ID ID ส่วนตัว // id ===> ชื่อสตริงส่วนตัว c_id; // name ===> c_name /** * มีฟิลด์ Teacher_id ในตารางชั้นเรียนดังนั้นแอตทริบิวต์ของครูจึงถูกกำหนดไว้ในคลาสคลาส * ใช้เพื่อรักษาความสัมพันธ์แบบหนึ่งต่อหนึ่งระหว่างครูและชั้นเรียน ผ่านคุณลักษณะของครูนี้คุณสามารถรู้ได้ว่าครูคนไหนที่รับผิดชอบในชั้นเรียนนี้*/ ครูสอนเอกชน // ใช้รายการ <student> คุณลักษณะการรวบรวมเพื่อเป็นตัวแทนของนักเรียนที่เป็นเจ้าของโดยรายการส่วนตัวชั้นเรียน <Tudent> นักเรียน; สาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } ครูสาธารณะ getTeacher () {ครูกลับ; } โมฆะสาธารณะ setTeacher (ครูครู) {this.Teacher = ครู; } โมฆะสาธารณะ setTeacher (ครูครู) {this.Teacher = ครู; } รายการสาธารณะ <student> getStudents () {ส่งคืนนักเรียน; } โมฆะสาธารณะ setstudents (รายการ <student> นักเรียน) {this.students = นักเรียน; } @Override สตริงสาธารณะ toString () {return "คลาส [id =" + id + ", name =" + name + ", ครู =" + ครู + ", นักเรียน =" + นักเรียน + "]"; - 2.4. แก้ไขไฟล์การแมป SQL classmapper.xml
เพิ่มข้อมูลการแมป SQL ต่อไปนี้
<!-สอบถามข้อมูลชั้นเรียนที่สอดคล้องกันตาม ClassID รวมถึงนักเรียนและครู-> <!-วิธีการที่ 1: ผลลัพธ์ที่ซ้อนกัน: ใช้แผนที่ผลลัพธ์ซ้อนกันเพื่อประมวลผลชุดย่อยของผลลัพธ์ร่วมกันซ้ำเลือก * จากคลาส C, ครู T, นักเรียนที่ c.teacher_id = t.t_id และ c.c_id = s.class_id และ c.c_id =-> resultmap = "classResultMap"> เลือก * จากคลาส C, ครู T, นักเรียน s โดยที่ c.teacher_id = t.t_id และ c.c_id = s.class_id และ c.c_id =#{id} </select> <resultmap type = "me.gacl.domain.classes" id = "classResultMap" column = "c_id"/> <result property = "name" column = "c_name"/> <Association property = "ครู" คอลัมน์ = "teacher_id" javatype = "me.gacl.domain.teacher"> <id property = "id" column = "t_id"/> < <collection property = "นักเรียน" OFType = "me.gacl.domain.student"> <id property = "id" คอลัมน์ = "s_id"/> <result property = "name" คอลัมน์ = "s_name"/> </collection> </resultmap> <! เลือก * จากครูโดยที่ t_id = // เป็นค่าของ teacher_id ที่ได้รับจากแบบสอบถามก่อนหน้าเลือก * จากนักเรียนที่ class_id = // เป็นค่าของฟิลด์ c_id ที่ได้รับจากการสืบค้นแรก -> <select id = "getClass" parameterType = "int" type = "me.gacl.domain.classes" id = "classResultMap"> <id property = "id" คอลัมน์ = "c_id"/> <result property = "name" คอลัมน์ = "c_name"/> <Association Property = "Teacher" Column = "Teacher_id" Javatype = "me.gacl.domain.teacher OFType = "me.gacl.domain.student" คอลัมน์ = "c_id" select = "getStudent"> </collection> </resultmap> <select id = "getTeacher" parameterType = "int" resultType = "me.gacl.domain.teacher" id = "getStudent" parameterType = "int" resultSpe = "me.gacl.domain.student"> เลือก S_ID ID ชื่อ s_name จากนักเรียนที่ class_id =#{id} </select> 2.5. เขียนรหัสทดสอบหน่วย
แพ็คเกจ me.gacl.test; นำเข้า me.gacl.domain.classes; นำเข้า me.gacl.util.mybatisutil; นำเข้า org.apache.ibatis.session.sqlsession; นำเข้า org.junit.test; การทดสอบคลาสสาธารณะ {@Test โมฆะสาธารณะ TestGetClass () {SQLSession SQLSession = MyBatisUtil.getSqlSession (); /** * แผนที่สตริงการระบุ SQL, * me.gacl.mapping.classmapper เป็นค่าของแอตทริบิวต์เนมสเปซของแท็ก Mapper ในไฟล์ classmapper.xml, * getClass เป็นแอตทริบิวต์ ID ของแท็ก SELECT SQL ที่จะดำเนินการสามารถพบได้ผ่านค่าแอตทริบิวต์ ID ของคำสั่ง SELECT TAG */String = "Me.gacl.mapping.classmapper.getClass"; // การแมปสตริงการระบุตัวตนของ SQL // ดำเนินการสืบค้น ตาราง // หลังจากดำเนินการ SQL โดยใช้ sqlsession sqlsession.close (); // พิมพ์ผลลัพธ์: คลาส [id =, name = class_a, ครู = ครู [id =, name = teacher], นักเรียน = [นักเรียน [id =, name = student_a], นักเรียน [id =, name = student_b], นักเรียน [id =, name = student_c]]] system.out.println (clazz); } @Test โมฆะสาธารณะ TestGetClass () {SQLSession SQLSession = MyBatisUtil.GetSqlSession (); /** * แผนที่สตริงการระบุ SQL, * me.gacl.mapping.classmapper เป็นค่าของแอตทริบิวต์เนมสเปซของแท็ก Mapper ในไฟล์ classmapper.xml, * getClass เป็นแอตทริบิวต์ ID ของแท็ก SELECT SQL ที่จะดำเนินการสามารถพบได้ผ่านค่าแอตทริบิวต์ ID ของคำสั่ง SELECT TAG */String = "Me.gacl.mapping.classmapper.getClass"; // การแมปสตริงการระบุตัวตนของ SQL // ดำเนินการสืบค้น ตาราง // หลังจากดำเนินการ SQL โดยใช้ sqlsession sqlsession.close (); // พิมพ์ผลลัพธ์: คลาส [id =, name = class_a, ครู = ครู [id =, name = teacher], นักเรียน = [นักเรียน [id =, name = student_a], นักเรียน [id =, name = student_b], นักเรียน [id =, name = student_c]]] system.out.println (clazz); - 2.6. บทสรุปของการสืบค้นสมาคมแบบหนึ่งต่อหลายคน
MyBatis ใช้แท็กคอลเลกชันเพื่อแก้ปัญหาการเชื่อมโยงการเชื่อมโยงแบบหนึ่งถึงหลายครั้งและแอตทริบิวต์ของ Tetype ระบุประเภทขององค์ประกอบขององค์ประกอบในคอลเลกชัน
เกี่ยวกับ MyBatis Learning Tutorial (V) - ฉันจะแนะนำคุณมากมายเกี่ยวกับการใช้การสืบค้นตารางสมาคมฉันหวังว่ามันจะเป็นประโยชน์กับคุณ!