1. resultmap
ไฟล์ XML ที่แมป SQL เป็นที่ที่คำสั่ง SQL ทั้งหมดถูกวางไว้ คุณต้องกำหนดพื้นที่ทำงานซึ่งโดยทั่วไปจะถูกกำหนดให้เป็นเส้นทางของคลาสอินเตอร์เฟสที่เกี่ยวข้อง หลังจากเขียนไฟล์การแมปคำสั่ง SQL คุณต้องอ้างอิงในแท็ก MyBatis Configuration File Mappers Tag ตัวอย่างเช่น:
<mapper resource = "com/liming/manager/data/mappers/usermapper.xml"/> <mapper resource = "com/liming/manager/data/mappers/studentmapper.xml"/> <mapper resource = "com/liming/manager/data/mappers/classmapper.xml"/> /> < /mappers>
เมื่ออินเทอร์เฟซ Java อยู่ในเส้นทางสัมพัทธ์กับไฟล์ XML จะไม่สามารถประกาศได้ในการแมปของไฟล์การกำหนดค่า MyBatis
SQL แมปองค์ประกอบเบื้องต้นบางอย่างของไฟล์ XML:
(1). แคชกำหนดค่าแคชสำหรับรูปแบบที่กำหนด (2) Cache-Ref หมายถึงแคชจากรูปแบบอื่น (3) ResultSmap นี่เป็นองค์ประกอบที่ซับซ้อนที่สุด แต่ทรงพลังที่สุดซึ่งอธิบายถึงวิธีการโหลดวัตถุจากชุดผลลัพธ์ (4) SQL A บล็อก SQL ที่สามารถมัลติเพล็กซ์โดยข้อความอื่น ๆ (5) แทรกคำสั่งแทรกแผนที่ (6) อัปเดตคำสั่ง UPDATE MAP (7) ลบคำสั่ง DELEETE (8) เลือก - แผนที่เลือกคำสั่ง
1.1 ผลลัพธ์
MAP ผลลัพธ์เป็นองค์ประกอบที่สำคัญและทรงพลังที่สุดใน mybatis คุณสามารถประหยัดได้ 90% ของรหัสของคุณมากกว่าการโทรชุดผลลัพธ์ด้วย JDBC หรือคุณสามารถทำสิ่งต่าง ๆ มากมายที่ JDBC ไม่รองรับ ในความเป็นจริงอาจต้องใช้รหัสหลายพันบรรทัดในการเขียนคำสั่งที่ซับซ้อนเทียบเท่ากับการทำแผนที่คล้ายกับการโต้ตอบ จุดประสงค์ของผลลัพธ์ของ Maps เป็นคำสั่งง่ายๆโดยไม่ต้องทำแผนที่ผลลัพธ์ที่ไม่จำเป็น ข้อความที่ซับซ้อนมากขึ้นไม่จำเป็นต้องมีอื่นใดนอกจากข้อความที่จำเป็นบางอย่างเพื่ออธิบายความสัมพันธ์
แอตทริบิวต์ผลลัพธ์: ประเภทคือคลาสเอนทิตี Java; ID เป็นตัวระบุของผลลัพธ์นี้
การแม็พที่สามารถตั้งค่าได้:
(1). ตัวสร้างถูกใช้เพื่อสะท้อนผลลัพธ์ไปยังตัวสร้างคลาสอินสแตนซ์
a) พารามิเตอร์ IDARG ID; ทำเครื่องหมายชุดผลลัพธ์เป็น ID เพื่ออำนวยความสะดวกในการโทรทั่วโลก
b) การสะท้อนเฉลี่ยของตัวสร้าง
(2). ผลลัพธ์ ID ID ทำเครื่องหมายชุดผลลัพธ์เป็น ID เพื่ออำนวยความสะดวกในการโทรทั่วโลก
(3). ผลลัพธ์สะท้อนให้เห็นถึงผลลัพธ์ปกติต่อคุณสมบัติ Javabean
(4). เชื่อมโยงการรวมกันของประเภทที่ซับซ้อน; ประเภทของการสังเคราะห์ผลลัพธ์หลายรายการ
a) การแมปผลลัพธ์ซ้อนกันแมปผลลัพธ์หลายแผนที่สมาคมซ้อนกันเองและยังสามารถอ้างอิงได้อีกกลุ่มหนึ่ง
(5). คอลเลกชันคอลเลกชันประเภทที่ซับซ้อน
(6). คอลเลกชันการแมปผลที่ซ้อนกันสามารถอ้างอิงได้อีกรายการ
(7). Discriminator ใช้ค่าผลลัพธ์ในการตัดสินใจว่าจะใช้ผลลัพธ์ใด
A) กรณีกรณีกรณีของแผนที่ผลลัพธ์ของค่าพื้นฐานบางอย่าง
ฉัน. การแมปผลลัพธ์ซ้อนกันสถานการณ์กรณีเป็นแผนที่ผลลัพธ์ดังนั้นจึงสามารถรวมองค์ประกอบเดียวกันบางส่วนหรืออ้างอิงถึงผลลัพธ์ภายนอก
1.1.1 ID ผลลัพธ์
ID และผลลัพธ์คือการแมปที่ง่ายที่สุด ID คือการแมปคีย์หลัก แผนที่ผลลัพธ์จากฟิลด์ตารางฐานข้อมูลพื้นฐานอื่น ๆ ไปยังแอตทริบิวต์คลาสเอนทิตี
ตัวอย่างที่ง่ายที่สุด:
<resultmap type = "liming.student.manager.data.model.studententity" id = "studentResultMap"> <id property = "studentId" คอลัมน์ = "student_id" javatype = "string" jdbctype = "varchar"/> jdBcType = "varchar"/> <result property = "studentsex" คอลัมน์ = "student_sex" javatype = "int" jdbctype = "จำนวนเต็ม"/> <ผลพร็อพเพอร์ตี้ = "studentbirthday" คอลัมน์นักเรียน = "javatype =" javatype = "byte []" jdbctype = "blob" typehandler = "org.apache.ibatis.type.blobtypehandler" /> < /resultmap>
รายละเอียดของการกำหนดค่า ID และคุณสมบัติคำสั่งผลลัพธ์:
คุณสมบัติ | อธิบาย | |
คุณสมบัติ | ชื่อแอตทริบิวต์ที่ต้องแมปกับ Javabean | |
คอลัมน์ | ชื่อคอลัมน์หรือนามแฝงฉลากของตารางข้อมูล | |
จาวาปิ | ชื่อคลาสที่สมบูรณ์หรือนามแฝงประเภท หากคุณจับคู่ Javabean MyBatis มักจะตรวจจับด้วยตัวเอง จากนั้นหากคุณกำลังทำแผนที่กับ HashMap คุณต้องระบุจุดประสงค์ที่จะบรรลุโดย Javatype | |
jdbctype | รายการประเภทที่รองรับโดยตารางข้อมูล คุณสมบัตินี้มีประโยชน์สำหรับคอลัมน์ที่อนุญาตให้ว่างเปล่าเมื่อแทรกอัปเดตหรือลบ JDBC ต้องการสิ่งนี้ แต่ mybatis ไม่ได้ หากคุณกำลังเข้ารหัสโดยตรงสำหรับ JDBC และมีคอลัมน์ที่อนุญาตให้ว่างเปล่าคุณต้องการระบุรายการนี้ | |
คนประเภท | ใช้คุณสมบัตินี้เพื่อแทนที่โปรเซสเซอร์ประเภท ค่านี้สามารถเป็นชื่อคลาสที่สมบูรณ์หรือนามแฝงประเภท |
<resultMap type = "studentEntity" id = "studentResultMap"> <คอนสตรัคเตอร์> <idarg javatype = "String" คอลัมน์ = "student_id"/> <arg javatype = "String" คอลัมน์ = "student_name"/> </constructor> </resultmap>
แน่นอนเราจำเป็นต้องกำหนดวิธีการสร้างของคลาสเอนทิตีของนักเรียน:
Public StudentEntity (String StudentId, String studentName, String StudentSex, Date studentbirthday) {this.studentId = studentId; this.studentName = studentName; this.studentSex = StudentSex; this.studentbirthday = studentbirthday; - 1.1.3 สมาคม
องค์ประกอบสหภาพใช้เพื่อจัดการกับความสัมพันธ์ "แบบตัวต่อตัว" คุณต้องระบุคุณสมบัติของคลาส Java Entity ที่แมปและ Javatype ของแอตทริบิวต์ (โดยปกติแล้ว mybatis จะจดจำด้วยตัวคุณเอง) ชื่อคอลัมน์ของตารางฐานข้อมูลที่เกี่ยวข้อง หากคุณต้องการแทนที่ให้ส่งคืนค่าผลลัพธ์คุณต้องระบุ typeHandler
สถานการณ์ต่าง ๆ จำเป็นต้องบอก mybatis ว่าจะโหลดสหภาพได้อย่างไร MyBatis สามารถโหลดได้สองวิธี:
(1). เลือก: เรียกใช้คำสั่ง SQL การแมปอื่น ๆ เพื่อส่งคืนประเภทเอนทิตี Java ยืดหยุ่นมากขึ้น
(2). ResultsMap: ใช้แผนที่ผลลัพธ์ที่ซ้อนกันเพื่อประมวลผลชุดผลลัพธ์ผ่านการเข้าร่วมและทำแผนที่กับประเภทเอนทิตี Java
ตัวอย่างเช่นชั้นเรียนสอดคล้องกับครูชั้นเรียน
ก่อนอื่นกำหนดคุณลักษณะของครูชั้นเรียนในชั้นเรียน:
ครูสอนเอกชน
1.1.3.1 ใช้เลือกเพื่อใช้สหภาพ
ตัวอย่าง: มีคุณลักษณะของครูชั้นเรียนในหมวดหมู่เอนทิตีชั้นเรียน เมื่อได้รับเอนทิตีชั้นเรียนผ่านความพยายามร่วมกันนิติบุคคลครูจะถูกแมปในเวลาเดียวกัน
สิ่งนี้สามารถนำคำสั่ง SELECT ที่กำหนดไว้ในไฟล์ TeacherMapper.xml โดยตรงสำหรับการสอบถามครูตาม ID และคุณไม่จำเป็นต้องแก้ไขคำสั่ง SQL ที่เป็นลายลักษณ์อักษรคุณเพียงแค่ต้องแก้ไขผลลัพธ์ที่ได้โดยตรง
ส่วนหนึ่งของเนื้อหาของไฟล์ classmapper.xml:
<resultmap type = "classEntity" id = "classResultMap"> <id property = "classId" คอลัมน์ = "class_id" /> <property result = "classname" คอลัมน์ = "class_name" /> <result property = "classyear" = "class_year" /> < id = "getClassById" parameterType = "string" resultmap = "classResultMap"> เลือก * จาก class_tbl ct โดยที่ ct.class_id = #{classid}; </เลือก>ส่วนหนึ่งของไฟล์ teachermapper.xml:
<resultmap type = "TeacherEntity" id = "TeacherResultMap"> <id property = "teacherId" คอลัมน์ = "teacher_id" /> <property result = "TeacherName" คอลัมน์ = "Teacher_name" /> <result property = "Teacherex" Column = "Teacher_sex" /> <result property = "workdate" คอลัมน์ = "work_date"/> <property result = "professional" คอลัมน์ = "professional"/> </resultmap> <select id = "getTeacher" parameterType = "String" resultMap = "TeacherResultMap"
1.1.3.2 ใช้ Map Results เพื่อให้บรรลุสหภาพ
ฟังก์ชั่นเดียวกับข้างต้นคือการสืบค้นชั้นเรียนและสอบถามครูชั้นเรียน คุณต้องเพิ่ม ResultMap (กำหนดไว้ในไฟล์ XML ของครู) ในสมาคมเขียน SQL ใหม่ (Query ตารางเรียนซ้ายเข้าร่วมตารางครู) และไม่จำเป็นต้องเลือกครู
แก้ไขเนื้อหาของไฟล์ classmapper.xml:
<resultmap type = "classEntity" id = "classResultMap"> <id property = "classId" คอลัมน์ = "class_id" /> <property result = "classname" คอลัมน์ = "class_name" /> <property result = "classyear" = "class_year" /> < id = "getClassandTeacher" parameterType = "string" resultmap = "classResultMap"> เลือก * จาก class_tbl ct ซ้ายเข้าร่วม teacher_tbl tt บน ct.teacher_id = tt.teacher_id โดยที่ ct.class_id = #{classid}; </เลือก>สำหรับ TeacherResultMap โปรดดูเนื้อหาข้างต้นในไฟล์ TeacherMapper.xml
1.1.4 คอลเลกชัน
องค์ประกอบการรวมใช้เพื่อจัดการกับความสัมพันธ์ "แบบหนึ่งต่อหลายคน" คุณต้องระบุคุณลักษณะของคลาส Java Entity, Javatype ของแอตทริบิวต์ (มักจะเป็น ArrayList); ประเภทของวัตถุในรายการของวัตถุ (คลาสเอนทิตี Java); ชื่อคอลัมน์ของตารางฐานข้อมูลที่เกี่ยวข้อง
สถานการณ์ต่าง ๆ จำเป็นต้องบอก MyBatis ถึงวิธีการโหลดการรวม MyBatis สามารถโหลดได้สองวิธี:
(1). เลือก: เรียกใช้คำสั่ง SQL การแมปอื่น ๆ เพื่อส่งคืนประเภทเอนทิตี Java ยืดหยุ่นมากขึ้น
(2). ResultsMap: ใช้แผนที่ผลลัพธ์ที่ซ้อนกันเพื่อประมวลผลชุดผลลัพธ์ผ่านการเข้าร่วมและทำแผนที่กับประเภทเอนทิตี Java
ตัวอย่างเช่นชั้นเรียนมีนักเรียนหลายคน
ก่อนกำหนดคุณลักษณะรายการนักเรียนในชั้นเรียน:
รายการส่วนตัว <Tudententity> รายการนักเรียน;
1.1.4.1 ใช้เลือกเพื่อใช้งานการรวม
การใช้งานคล้ายกับสหภาพมากความแตกต่างคือนี่คือหนึ่งถึงหลายคนดังนั้นโดยทั่วไปแล้วรายการที่แมปจะแสดงรายการ ดังนั้นที่นี่คุณต้องกำหนด Javatype เป็น ArrayList คุณต้องกำหนดประเภทของวัตถุในรายการและชื่อคำสั่งของการเลือกที่ต้องตั้งค่า (ควรสังเกตว่าเงื่อนไขคำสั่ง SELECT สำหรับนักเรียนแบบสอบถามที่นี่
ส่วนหนึ่งของเนื้อหาของไฟล์ classmapper.xml:
<resultmap type = "classEntity" id = "classResultMap"> <id property = "classId" คอลัมน์ = "class_id" /> <result property = "classname" คอลัมน์ = "class_name" /> <property = "classyear" = "class_year" /> < column = "class_id" javatype = "arraylist" OfType = "studentEntity" select = "getStudentByClassId"/> </resultmap> <select id = "getClassById" parameterType = "String" resultMap = "classResultMap" </เลือก>
ส่วนหนึ่งของไฟล์ studentmapper.xml:
<!-คุณสมบัติ java, คำจำกัดความการแมประหว่างฟิลด์ตารางฐานข้อมูล-> <resultmap type = "studententity" id = "studentResultMap"> <id property = "studentId" คอลัมน์ = "student_id" /> <property = "studentName" studentName " column = "student_birthday" /> < /resultmap> <!-สอบถามรายชื่อนักเรียนตาม ID คลาส-> <select id = "getStudentByClassId" parameterType = "String" resultMap = "StudentResultMap"> <รวม refid = "SelectStudentAll" />>
1.1.4.2 การใช้ Map Results เพื่อให้ได้การรวม
การใช้ ResultSmap คุณต้องเขียน SQL ใหม่และเข้าร่วมตารางนักเรียน
<resultmap type = "classEntity" id = "classResultMap"> <id property = "classid" คอลัมน์ = "class_id" /> <result property = "classname" คอลัมน์ = "class_name" /> <property result = "classyear" column " column = "class_id" javatype = "arraylist" OfType = "studentEntity" resultmap = "studentResultMap"/> </resultmap> <select id = "getClassandTeacherStudent" jointing chotling stath -ct teacher_tbl tt บน ct.teacher_id = tt.teacher_id โดยที่ ct.class_id = #{classid}; </เลือก>
สำหรับ TeacherResultMap โปรดดูเนื้อหาข้างต้นในไฟล์ TeacherMapper.xml โปรดดู StudentResultMap ในส่วนด้านบนของไฟล์ studentmapper.xml
1.1.5discriminator discriminator <br /> บางครั้งการสืบค้นฐานข้อมูลแยกต่างหากอาจส่งคืนชุดผลลัพธ์ของประเภทข้อมูลที่แตกต่างกัน (แต่หวังว่าจะมีความสัมพันธ์บางอย่าง) องค์ประกอบ discriminator ได้รับการออกแบบมาเพื่อจัดการกับสถานการณ์นี้รวมถึงลำดับชั้นการสืบทอดของชั้นเรียน discriminator นั้นง่ายมากที่จะเข้าใจเพราะมันทำงานเหมือนคำสั่งสวิตช์ใน Java
คำจำกัดความ discriminator ระบุคอลัมน์และคุณสมบัติ Javatype คอลัมน์เป็นที่ที่ mybatis ค้นหาค่าเปรียบเทียบ Javatype เป็นประเภทที่เหมาะสมที่จะใช้เพื่อให้แน่ใจว่าการทดสอบที่เทียบเท่า (แม้ว่าสตริงจะมีประโยชน์ในหลายกรณี)
ตัวอย่างต่อไปนี้คือเมื่อ ClassID คือ 20000001 แอตทริบิวต์ ClassID จะถูกแมป
<resultmap type = "liming.student.manager.data.model.studententity" id = "resultmap_studententity_discriminator"> <id property = "studentId" คอลัมน์ = "student_id" javatype = "string" jdbctype = "Varame jdBcType = "varchar"/> <result property = "studentsex" คอลัมน์ = "student_sex" javatype = "int" jdbctype = "จำนวนเต็ม"/> <ผลพร็อพเพอร์ตี้ = "studentbirthday" คอลัมน์นักเรียน = "javatype =" javatype = "byte []" jdbcType = "blob" typeHandler = "org.apache.ibatis.type.blobtypehandler" /> <result property = "placeid" คอลัมน์ = "place_id" javatype = "string" jdbctype = jdbcType = "varchar"> <case value = "20000001" resultType = "liming.student.manager.data.model.studententity"> <property result = "classid" คอลัมน์ = "class_id" javatype = "string" jdbcType = "varchar"
2. เพิ่ม, ลบ, แก้ไขและตรวจสอบ, พารามิเตอร์และแคช
2.1 เลือก
องค์ประกอบที่เลือกนั้นง่ายมาก ตัวอย่างเช่น:
<!-สอบถามนักเรียนตาม ID-> <select id = "getStudent" parameterType = "String" resultMap = "StudentResultMap"> เลือก St.Student_id, St.Student_name, St.Student_sex, St.Student_Birthday, St.Class_ID
คำสั่งนี้เรียกว่า 'GetStudent มีพารามิเตอร์สตริงและส่งคืนวัตถุประเภทของนักเรียน
โปรดทราบว่าการระบุพารามิเตอร์คือ: #{studentId}
เลือกรายละเอียดการกำหนดค่าแอตทริบิวต์คำสั่ง:
| คุณสมบัติ | อธิบาย | รับค่า | ค่าเริ่มต้น |
| รหัสประจำตัว | ในโหมดนี้ตัวระบุที่ไม่ซ้ำกันสามารถอ้างอิงได้โดยข้อความอื่น ๆ | ||
| พารามิเตอร์ | ชื่อคลาสเต็มหรือนามแฝงสำหรับพารามิเตอร์ที่ส่งไปยังคำสั่งนี้ | ||
| ผลการแข่งขัน | คำสั่งส่งคืนชื่อคลาสทั้งหมดหรือนามแฝงของประเภทค่า โปรดทราบว่าหากเป็นคอลเลกชันแล้วชื่อคลาสทั้งหมดหรือนามแฝงของรายการในคอลเลกชันจะถูกกรอกข้อมูลที่นี่แทนที่จะเป็นชื่อคลาสของคอลเลกชันเอง (ไม่สามารถใช้ ResultType และ ResultMap ร่วมกันได้) | ||
| MAP ผลลัพธ์ | ชื่อแผนที่ผลลัพธ์ภายนอกที่อ้างอิง การทำแผนที่ชุดผลลัพธ์เป็นคุณสมบัติที่ทรงพลังที่สุดใน mybatis การแมปที่ซับซ้อนจำนวนมากสามารถแก้ไขได้ง่าย (ไม่สามารถใช้ ResultType และ ResultMap ร่วมกันได้) | ||
| flushcache | หากตั้งค่าเป็นจริงแคชจะถูกล้างทุกครั้งที่มีการเรียกคำสั่ง คำสั่ง SELECT ถูกตั้งค่าเป็น FALSE โดยค่าเริ่มต้น | จริง | เท็จ | เท็จ |
| usecache | หากตั้งค่าเป็นจริงชุดผลลัพธ์ของคำสั่งจะถูกแคช คำสั่ง SELECT ถูกตั้งค่าเป็น FALSE โดยค่าเริ่มต้นจริง | FALSE FALSE การหมดเวลาตั้งค่าเวลาสูงสุดที่ไดรฟ์รอการตอบกลับก่อนที่จะทำการยกเว้น ค่าเริ่มต้นคือไม่มีค่าและไดรฟ์ตัดสินใจตัวเอง | จริง | เท็จ | เท็จ |
| การหมดเวลา | ตั้งค่าเวลาสูงสุดที่ไดรฟ์รอการตอบกลับก่อนที่จะโยนข้อยกเว้น ค่าเริ่มต้นจะถูกตั้งค่าโดยไม่มีค่าและไดรฟ์เองก็ตัดสินใจ | จำนวนเต็มบวก | ไม่ได้ตั้งค่า |
| การดึง | หลังจากตั้งค่าค่าไดรฟ์จะตื่นเต้นที่จะส่งคืนหลังจากจำนวนชุดผลลัพธ์ถึงค่านี้ ไม่ได้ตั้งค่าเริ่มต้นและไดรฟ์ตัดสินใจเอง | จำนวนเต็มบวก | ขับเคลื่อนการตัดสินใจ |
| คำแถลง attementtype | คำสั่ง, คำสั่งที่เตรียมไว้, คำสั่ง callable งบที่เตรียมไว้ข้อความเรียกเก็บเงินได้ | คำแถลง เตรียมไว้ ซึ่งเรียกได้ | เตรียมไว้ |
| ผลลัพธ์ | forward_only, scroll_sensitive, scroll_insensitive การส่งต่อเท่านั้นการเลื่อนการเลื่อนที่ละเอียดอ่อนและไม่รู้สึกตัว | ไปข้างหน้า _only Scroll_sensitive Scroll_insensitive | ขับเคลื่อนการตัดสินใจ |
2.2 แทรก
คำสั่งแทรกง่าย:
<!-แทรกนักเรียน-> <แทรก id = "insertStudent" parameterType = "studentEntity"> แทรกลงใน Student_tbl (student_id, student_name, student_sex, student_birthday, class_id) ค่า ( #{studentid}, #{นักเรียน} </แทรก>INSERT สามารถใช้นโยบายคีย์หลักอัตโนมัติที่รองรับโดยฐานข้อมูลตั้งค่า useGeneratedKeys = "true" จากนั้นตั้งค่า keyProperty เป็นคอลัมน์ที่เกี่ยวข้องและทำเสร็จแล้ว ตัวอย่างเช่น StudentEntity ด้านบนใช้การสร้างอัตโนมัติเพื่อสร้างคีย์หลักสำหรับคอลัมน์ ID คุณยังสามารถใช้องค์ประกอบ SelectKey ตัวอย่างต่อไปนี้ใช้ฐานข้อมูล MySQL NextVal ('Student') เป็นฟังก์ชั่นที่กำหนดเองเพื่อสร้างคีย์
<!-ใส่คีย์หลักของนักเรียนโดยอัตโนมัติ-> <insert id = "InsertStudentAutokey" parameterType = "StudentEntity"> <selectKey keyProperty = "studentId" resultType = "String" order = "ก่อน"> selectval ('นักเรียน') </selectkey ( #{studentId}, #{studentName}, #{studentsex}, #{studentbirthday}, #{classEntity.classId}) </insert>| คุณสมบัติ | อธิบาย | รับค่า | ค่าเริ่มต้น |
| รหัสประจำตัว | ในโหมดนี้ตัวระบุที่ไม่ซ้ำกันสามารถอ้างอิงได้โดยข้อความอื่น ๆ | ||
| พารามิเตอร์ | ชื่อคลาสเต็มหรือนามแฝงสำหรับพารามิเตอร์ที่ส่งไปยังคำสั่งนี้ | ||
| flushcache | หากตั้งค่าเป็นจริงแคชจะถูกล้างทุกครั้งที่มีการเรียกคำสั่ง คำสั่ง SELECT ถูกตั้งค่าเป็น FALSE โดยค่าเริ่มต้น | จริง | เท็จ | เท็จ |
| usecache | หากตั้งค่าเป็นจริงชุดผลลัพธ์ของคำสั่งจะถูกแคช คำสั่ง SELECT ถูกตั้งค่าเป็น FALSE โดยค่าเริ่มต้นจริง | FALSE FALSE การหมดเวลาตั้งค่าเวลาสูงสุดที่ไดรฟ์รอการตอบกลับก่อนที่จะทำการยกเว้น ค่าเริ่มต้นคือไม่มีค่าและไดรฟ์ตัดสินใจตัวเอง | จริง | เท็จ | เท็จ |
| การหมดเวลา | ตั้งค่าเวลาสูงสุดที่ไดรฟ์รอการตอบกลับก่อนที่จะโยนข้อยกเว้น ค่าเริ่มต้นจะถูกตั้งค่าโดยไม่มีค่าและไดรฟ์เองก็ตัดสินใจ | จำนวนเต็มบวก | ไม่ได้ตั้งค่า |
| การดึง | หลังจากตั้งค่าค่าไดรฟ์จะตื่นเต้นที่จะส่งคืนหลังจากจำนวนชุดผลลัพธ์ถึงค่านี้ ไม่ได้ตั้งค่าเริ่มต้นและไดรฟ์ตัดสินใจเอง | จำนวนเต็มบวก | ขับเคลื่อนการตัดสินใจ |
| คำแถลง attementtype | คำสั่ง, คำสั่งที่เตรียมไว้, คำสั่ง callable งบที่เตรียมไว้ข้อความเรียกเก็บเงินได้ | คำแถลง เตรียมไว้ ซึ่งเรียกได้ | เตรียมไว้ |
| useGeneratedKeys | บอกให้ MyBatis ใช้วิธี GetGeneratedKeys ของ JDBC เพื่อรับคีย์หลักที่สร้างโดยฐานข้อมูล (MySQL, SQLServer ฯลฯ ฐานข้อมูลเชิงสัมพันธ์จะมีฟิลด์ที่สร้างขึ้นโดยอัตโนมัติ) ค่าเริ่มต้น: FALSE | จริง | เท็จ | เท็จ |
| คีย์ไพรซ์ | ระบุค่าที่จะส่งคืนโดยคีย์ที่ตั้งค่าเป็น mybatis เป็น getGeneratedKeys หรือใช้ SelectKey สำหรับคำสั่งแทรก องค์ประกอบย่อย |
| คุณสมบัติ | อธิบาย | รับค่า |
| คีย์ไพรซ์ | แอตทริบิวต์ที่ต้องตั้งค่าสำหรับผลลัพธ์ที่สร้างโดยคำสั่ง SelectKey | |
| ผลการแข่งขัน | สร้างประเภทผลลัพธ์ MyBatis อนุญาตให้ใช้ประเภทข้อมูลพื้นฐานรวมถึงประเภทสตริงและ int | |
| คำสั่ง | สามารถตั้งค่าเป็นก่อนหรือหลัง หากตั้งค่าไว้ก่อนหน้านี้จะเลือกคีย์หลักก่อนจากนั้นตั้งค่า keyProperty จากนั้นเรียกใช้คำสั่งแทรก; หากถูกตั้งค่าเป็นหลังจากนั้นจะเรียกใช้คำสั่งแทรกก่อนจากนั้นเรียกใช้คำสั่ง SelectKey ซึ่งมักจะเป็นกลไกลำดับที่ฝังอยู่ในคำสั่งแทรกในฐานข้อมูลการโทรภายใน (เช่น Oracle) | ก่อน หลังจาก |
| คำแถลง attementtype | ดังกล่าวข้างต้น MyBatis สนับสนุนคำสั่งที่เตรียมไว้และแบบฟอร์มคำสั่ง callable ซึ่งสอดคล้องกับคำสั่งการตอบสนองที่เตรียมไว้และการตอบสนอง callablestatement | คำแถลง เตรียมไว้ ซึ่งเรียกได้ |
2.3 อัปเดตลบ
การอัปเดตอย่างง่าย:
<!-อัปเดตข้อมูลนักเรียน-> <update id = "updatestudent" parameterType = "studentEntity"> อัปเดต student_tbl set student_tbl.student_name = #{studentName}, student_tbl.student_sex = #{studentsex} studentstudent_tbl.student_birthday #{classEntity.classId} โดยที่ student_tbl.student_id = #{studentId}; </update>การลบอย่างง่าย:
<!-ลบนักเรียน-> <ลบ id = "ลบ" พารามิเตอร์ "parameterType =" studentEntity "> ลบจาก Student_tbl โดยที่ student_id = #{studentId} </relete>
อัปเดตและลบคำสั่งแอตทริบิวต์รายละเอียดการกำหนดค่า:
| คุณสมบัติ | อธิบาย | รับค่า | ค่าเริ่มต้น |
| รหัสประจำตัว | ในโหมดนี้ตัวระบุที่ไม่ซ้ำกันสามารถอ้างอิงได้โดยข้อความอื่น ๆ | ||
| พารามิเตอร์ | ชื่อคลาสเต็มหรือนามแฝงสำหรับพารามิเตอร์ที่ส่งไปยังคำสั่งนี้ | ||
| flushcache | หากตั้งค่าเป็นจริงแคชจะถูกล้างทุกครั้งที่มีการเรียกคำสั่ง คำสั่ง SELECT ถูกตั้งค่าเป็น FALSE โดยค่าเริ่มต้น | จริง | เท็จ | เท็จ |
| usecache | หากตั้งค่าเป็นจริงชุดผลลัพธ์ของคำสั่งจะถูกแคช คำสั่ง SELECT ถูกตั้งค่าเป็น FALSE โดยค่าเริ่มต้นจริง | FALSE FALSE การหมดเวลาตั้งค่าเวลาสูงสุดที่ไดรฟ์รอการตอบกลับก่อนที่จะทำการยกเว้น ค่าเริ่มต้นคือไม่มีค่าและไดรฟ์ตัดสินใจตัวเอง | จริง | เท็จ | เท็จ |
| การหมดเวลา | ตั้งค่าเวลาสูงสุดที่ไดรฟ์รอการตอบกลับก่อนที่จะโยนข้อยกเว้น ค่าเริ่มต้นจะถูกตั้งค่าโดยไม่มีค่าและไดรฟ์เองก็ตัดสินใจ | จำนวนเต็มบวก | ไม่ได้ตั้งค่า |
| การดึง | หลังจากตั้งค่าค่าไดรฟ์จะตื่นเต้นที่จะส่งคืนหลังจากจำนวนชุดผลลัพธ์ถึงค่านี้ ไม่ได้ตั้งค่าเริ่มต้นและไดรฟ์ตัดสินใจเอง | จำนวนเต็มบวก | ขับเคลื่อนการตัดสินใจ |
| คำแถลง attementtype | คำสั่ง, คำสั่งที่เตรียมไว้, คำสั่ง callable งบที่เตรียมไว้ข้อความเรียกเก็บเงินได้ | คำแถลง เตรียมไว้ ซึ่งเรียกได้ | เตรียมไว้ |
<!-คำสั่ง SQL Multiplex เพื่อสอบถามฟิลด์ทั้งหมดของตารางนักเรียน-> <sql id = "SelectStudentall"> เลือก St.Student_id, St.Student_name, St.Student_sex, St.Student_Birthday, St.Class_id
ด้วยวิธีนี้คุณสามารถอ้างอิงโดยตรงและใช้ในคำสั่ง SELECT เปลี่ยนคำสั่ง SELECT ด้านบนเป็น:
<!-สอบถามนักเรียนตาม ID-> <select id = "getStudent" parameterType = "String" resultMap = "StudentResultMap"> <รวม refid = "SelectStudentAll"/> โดยที่ St.Student_id = #{studentId} 2.5 พารามิเตอร์
มีการใช้พารามิเตอร์ในหลาย ๆ ที่ด้านบนเช่นการสืบค้นการปรับเปลี่ยนเงื่อนไขการลบการแทรกข้อมูลที่แก้ไข ฯลฯ ชนิดข้อมูลพื้นฐานที่ MyBatis สามารถใช้และชนิดข้อมูลที่ซับซ้อนของ Java
ชนิดข้อมูลพื้นฐาน, สตริง, int, วันที่, ฯลฯ
อย่างไรก็ตามการใช้ประเภทข้อมูลพื้นฐานสามารถให้พารามิเตอร์เดียวเท่านั้นดังนั้นคุณต้องใช้คลาส Java Entity หรือประเภทแผนที่เป็นประเภทพารามิเตอร์ คุณลักษณะของมันสามารถรับได้โดยตรงผ่าน #{}
2.5.1 พารามิเตอร์ประเภทพื้นฐาน
ค้นหารายชื่อนักเรียนตามเวลารับสมัคร:
<!-สอบถามรายชื่อนักเรียนตามเวลารับสมัคร-> <select id = "getStudentListByDate" parameterType = "วันที่" resultmap = "StudentResultMap"> เลือก * จาก Student_tbl st Let Light เข้าร่วม class_tbl CT บน St.Class_id = ct.class_id </เลือก>
รายการ <TudentEntity> StudentList = StudentMapper.GetStudentListByClassYear (StringUtil.Parse ("2007-9-1")); สำหรับ (StudentEntity EntityTemp: StudentList) {System.out.println (EntityTemp.ToString ()); - 2.5.2 พารามิเตอร์ประเภทเอนทิตี Java
ค้นหารายชื่อนักเรียนตามชื่อและเพศ ใช้คลาสเอนทิตีเป็นพารามิเตอร์:
<!-รายการนักเรียนแบบสอบถามเช่นชื่อ = เพศประเภทเอนทิตีพารามิเตอร์-> <select id = "getStudentListIntity" parameterType = "studentEntity" resultmap = "StudentResultMap"> เลือก * จาก Student_tbl st St.Student_name #{studentsex} </electe> Entity Studententity = New Studententity (); entity.setStudentName ("li"); entity.setstudentsex ("ชาย"); รายการ <TudentEntity> studentList = StudentMapper.GetStudentListListInity (เอนทิตี); สำหรับ (StudentEntity EntityTemp: StudentList) {System.out.println (EntityTemp.ToString ()); - 2.5.3MAP พารามิเตอร์
ค้นหารายชื่อนักเรียนตามชื่อและเพศ ใช้แผนที่เป็นพารามิเตอร์:
<!-รายการนักเรียนแบบสอบถาม = เพศประเภทแผนที่พารามิเตอร์-> <เลือก id = "getStudentListWherEmap" parameterType = "แผนที่" resultmap = "StudentResultMap"> เลือก * จาก Student_tbl St. St.Student_sex = #{sex} และ St.Student_sex = # แผนที่ <สตริงสตริง> แผนที่ = ใหม่ hashmap <สตริงสตริง> (); map.put ("เพศ", "หญิง"); map.put ("ชื่อ", "li"); รายการ <TudentEntity> studentList = StudentMapper.GetStudentListWherEmap (แผนที่); สำหรับ (StudentEntity EntityTemp: StudentList) {System.out.println (EntityTemp.ToString ()); - 2.5.4 การใช้พารามิเตอร์หลายพารามิเตอร์
หากคุณต้องการส่งผ่านพารามิเตอร์หลายตัวคุณจะต้องเพิ่มคำอธิบายประกอบ @Param ลงในพารามิเตอร์ของอินเตอร์เฟส ให้ตัวอย่าง:
การเขียนอินเตอร์เฟส:
รายการสาธารณะ <TudentEntity> getStudentListherewhereParam (@param (value = "ชื่อ") ชื่อสตริง, @param (value = "sex") String Sex, @param (value = "วันเกิด") วันเกิดวันเกิด, @Param (value = "classEntity") classEntity classEntity);
วิธีการเขียน SQL:
<!-รายการนักเรียนแบบสอบถาม, เหมือนชื่อ, = เพศ, = วันเกิด, = คลาส, วิธีการพารามิเตอร์แบบหลายพารามิเตอร์-> <select id = "getStudentListhereWereParam" resultmap = "studentResultMap"> เลือก * จาก Student_tbl st <โดยที่> <if test = "ชื่อ! = null และชื่อ! = '' ' </ถ้า> <ถ้า test = "sex! = null และ sex! = '' '> และ st.student_sex = #{sex} </ถ้า> <ถ้า test =" วันเกิด! = null "> และ St.Student_birthday = #{วันเกิด} = #{classEntity.classId} </if> </where> </select>ทำแบบสอบถาม:
รายการ <TudentEntity> studentList = StudentMapper.GetStudentListlistherewereParam ("," ", Stringutil.parse (" 1985-05-28 "), classmapper.getClassByid (" 20000002 ")); 2.5.5 วิธีการทดแทนสตริง
โดยค่าเริ่มต้นการใช้ #{} ไวยากรณ์ทำให้ MyBatis สร้างคุณสมบัติ PreparedStatement และใช้พารามิเตอร์ PreparedStatement (=?) เพื่อตั้งค่าอย่างปลอดภัย พยายามอย่างรวดเร็วและปลอดภัยและใช้บ่อย แต่บางครั้งคุณอาจต้องการแทนที่สตริงที่ไม่เปลี่ยนแปลงเป็นคำสั่ง SQL โดยตรง ตัวอย่างเช่นสำหรับการสั่งซื้อโดยคุณอาจใช้สิ่งนี้: สั่งซื้อโดย $ {columnName} แต่ mybatis จะไม่แก้ไขและหลีกเลี่ยงสตริงนี้
หมายเหตุ: มันไม่ปลอดภัยมากที่จะได้รับและใช้อินพุตของผู้ใช้ในคำสั่งที่ไม่เปลี่ยนแปลงด้วยวิธีนี้ สิ่งนี้จะช่วยให้ผู้ใช้สามารถปลูกฝังรหัสที่เสียหายได้ดังนั้นจึงจำเป็นต้องมีฟิลด์ที่จะไม่อนุญาตให้ลูกค้าป้อนหรือคุณตรวจสอบความถูกต้องโดยตรง
2.6 แคชแคช
MyBatis มีกลไกแคชที่ทรงพลังกำหนดค่าได้และปรับแต่งได้ การใช้แคชของ MyBatis 3 ได้รับการปรับปรุงหลายครั้งซึ่งมีประสิทธิภาพและง่ายต่อการกำหนดค่า โดยค่าเริ่มต้นแคชจะไม่เปิดใช้งาน นอกเหนือจากแคชเซสชันแล้วยังสามารถปรับปรุงประสิทธิภาพและแก้ปัญหาการพึ่งพาทั่วโลก เปิดแคชระดับ 2 คุณจะต้องเพิ่มบรรทัดง่ายๆในไฟล์การแมป SQL: <แคช/>
ฟังก์ชั่นของประโยคง่ายๆนี้มีดังนี้:
(1). คำสั่ง SELECT ทั้งหมดในไฟล์การแมปจะถูกแคช
(2). การแทรกการอัปเดตและลบคำสั่งทั้งหมดในไฟล์การแมปจะล้างแคช
(3). แคชถูกรีไซเคิลโดยใช้อัลกอริทึม "ไม่ค่อยใช้" (4) แคชจะไม่ถูกล้างตามเวลาที่กำหนด
(5). แต่ละแคชสามารถจัดเก็บ 1024 รายการหรืออ้างอิงไปยังวัตถุ (โดยไม่คำนึงถึงผลการสอบถาม)
(6). แคชจะถูกใช้เป็นแคช "อ่าน/เขียน" ซึ่งหมายความว่าวัตถุที่ดึงมาไม่ได้แชร์และปลอดภัยสำหรับผู้โทร จะไม่มีสายอื่น (7) หรือการปรับเปลี่ยนที่เป็นไปได้ในเธรด
ตัวอย่างเช่นสร้างแคช FIFO เพื่อล้างหนึ่งครั้งใน 60 วินาทีเก็บผลลัพธ์ของวัตถุ 512 หรือการอ้างอิงรายการและส่งคืนผลลัพธ์แบบอ่านอย่างเดียว เนื่องจากการแก้ไขในเธรดที่ไม่ได้ใช้อาจส่งผลให้เกิดความขัดแย้งอ้างอิง
<cache eviction = "fifo" flushinterval = "60000" size = "512" readonly = "true"> </cache>
คุณยังสามารถแชร์การกำหนดค่าแคชหรืออินสแตนซ์เดียวกันในเนมสเปซที่แตกต่างกัน ในกรณีนี้คุณสามารถใช้ Cache-Ref เพื่ออ้างอิงแคชอื่น
<cache-ref namespace = "com.liming.manager.data.studentMapper"/>
คำสั่งแคชรายละเอียดการกำหนดค่าแอตทริบิวต์:
| คุณสมบัติ | อธิบาย | รับค่า | ค่าเริ่มต้น |
| การขับไล่ | นโยบายการแคช: LRU - การใช้งานน้อยที่สุดล่าสุด: ลบวัตถุที่ไม่ได้ใช้ในระยะเวลานาน FIFI- First-in First-Out: เลื่อนวัตถุก่อนหน้าในคิว Soft - Soft Reference: ขึ้นอยู่กับกฎการอ้างอิงที่อ่อนนุ่มใช้กลไกการรวบรวมขยะเพื่อลบวัตถุ อ่อนแอ - การอ้างอิงที่อ่อนแอ: ใช้กลไกการรวบรวมขยะเพื่อกำจัดวัตถุขึ้นอยู่กับกฎอ้างอิงที่อ่อนแอ | LRU Fifi อ่อนนุ่ม อ่อนแอ | LRU |
| ฟลัชอินเวล | แสดงถึงเวลารวมมิลลิวินาทีที่เหมาะสม ค่าเริ่มต้นไม่ได้ตั้งค่าดังนั้นหากคุณใช้การล้างแบบไม่ผ่านการรบกวนคุณสามารถโทรหาคำสั่งเพื่อล้างได้เท่านั้น | จำนวนเต็มบวก | ไม่ได้ตั้งค่า |
| ขนาด | ขนาดของวัตถุแคช | จำนวนเต็มบวก | 1024 |
| อย่างอ่านอย่างเดียว | แคชแบบอ่านอย่างเดียวจะส่งคืนอินสแตนซ์เดียวกันกับผู้โทรทั้งหมด ดังนั้นจึงไม่สามารถแก้ไขได้ซึ่งสามารถปรับปรุงประสิทธิภาพได้อย่างมาก แคชที่เขียนได้จะผ่านลำดับ เพื่อส่งคืนสำเนาของวัตถุแคช สิ่งนี้จะช้าลง แต่ปลอดภัยกว่า ดังนั้นค่าเริ่มต้นจึงเป็นเท็จ | จริง | เท็จ | เท็จ |