กระบวนการดำเนินการตามกรอบ MyBatis:
1. กำหนดค่าไฟล์การกำหนดค่า mybatis, sqlmapconfig.xml (ชื่อไม่ได้รับการแก้ไข)
2. โหลด MyBatis ที่ใช้สภาพแวดล้อมผ่านไฟล์การกำหนดค่าและสร้างโรงงานเซสชัน SQLSessionFactory
SQLSessionFactory ใช้ในลักษณะซิงเกิลเมื่อใช้จริง
3. สร้าง SQLSession ผ่าน SQLSessionFactory
SQLSession เป็นอินเทอร์เฟซที่เน้นผู้ใช้ (ให้วิธีการฐานข้อมูลการดำเนินงาน) วัตถุการนำไปใช้เป็นความปลอดภัยเธรด ขอแนะนำให้สถานการณ์แอปพลิเคชันของ SQLSession อยู่ในตัวของวิธีการ
4. เรียกวิธี SQLSession เพื่อจัดการข้อมูล
หากคุณต้องการทำธุรกรรมคุณจะต้องดำเนินการวิธีการของ SQLSession
5. ทรัพยากรที่วางจำหน่ายและปิด sqlsession
วิธีการพัฒนาตัวแทน Mapper (แนะนำ)
โปรแกรมเมอร์เท่านั้นที่ต้องเขียนอินเทอร์เฟซ Mapper (นั่นคืออินเทอร์เฟซ DAO)
โปรแกรมเมอร์จำเป็นต้องทำตามข้อกำหนดการพัฒนาเมื่อเขียน mapper.xml (ไฟล์การแมป) และ mapper.java:
1. เนมสเปซใน mapper.xml เป็นเส้นทางเต็มของคลาส mapper.java
2. ID ของคำสั่งใน mappper.xml เหมือนกับชื่อวิธีใน mappper.java
3. พารามิเตอร์ของคำสั่งใน mapper.xml ระบุประเภทของพารามิเตอร์อินพุตและประเภทของพารามิเตอร์อินพุตของวิธี mapper.java
4. ผลลัพธ์ที่ได้ของคำสั่งใน mapper.xml ระบุประเภทเอาต์พุตและประเภทค่าคืนของวิธี mapper.java
เนื้อหาของบทความนี้:
วิเคราะห์โมเดลข้อมูลผลิตภัณฑ์สั่งซื้อ
การทำแผนที่ขั้นสูง: (เรียนรู้)
ใช้การสืบค้นแบบหนึ่งต่อหนึ่งแบบหนึ่งต่อหลาย ๆ และแบบสอบถามหลายต่อหลายคน
การโหลดล่าช้า
แคชแบบสอบถาม
แคชระดับ 1
แคชระดับ 2 (ทำความเข้าใจสถานการณ์การใช้งานของแคช MyBatis Level 2)
MyBatis และ Spirng Integration (Master)
วิศวกรรมย้อนกลับ (สามารถใช้)
สั่งซื้อโมเดลข้อมูลผลิตภัณฑ์
แนวคิดการวิเคราะห์แบบจำลองข้อมูล
1. เนื้อหาข้อมูลที่บันทึกไว้ในแต่ละตาราง
การคุ้นเคยกับเนื้อหาที่บันทึกไว้ในแต่ละตารางโดยโมดูลนั้นเทียบเท่ากับกระบวนการของความต้องการระบบการเรียนรู้ (ฟังก์ชั่น)
2. การตั้งค่าฟิลด์ที่สำคัญสำหรับแต่ละตาราง
ฟิลด์ที่ไม่ว่างเปล่าฟิลด์คีย์ต่างประเทศ
3. ความสัมพันธ์ระหว่างตารางระดับฐานข้อมูล
ความสัมพันธ์ที่สำคัญต่างประเทศ
4. ความสัมพันธ์ทางธุรกิจระหว่างตาราง
เมื่อวิเคราะห์ความสัมพันธ์ทางธุรกิจระหว่างตารางจำเป็นต้องวิเคราะห์ตามความสำคัญของธุรกิจบางอย่าง
การวิเคราะห์แบบจำลองข้อมูล
ผู้ใช้ตารางผู้ใช้:
บันทึกข้อมูลผู้ใช้ของผลิตภัณฑ์ที่ซื้อ
ตารางคำสั่งซื้อ: คำสั่งซื้อ
บันทึกคำสั่งซื้อที่สร้างโดยผู้ใช้ (คำสั่งซื้อรายการ)
รายละเอียดการสั่งซื้อ: orderdetail:
บันทึกข้อมูลรายละเอียดของคำสั่งคือข้อมูลการซื้อ
รายการผลิตภัณฑ์: รายการ
ข้อมูลผลิตภัณฑ์ที่บันทึกไว้
ความสัมพันธ์ทางธุรกิจระหว่างตาราง:
เมื่อวิเคราะห์ความสัมพันธ์ทางธุรกิจระหว่างตารางจำเป็นต้องวิเคราะห์ตามความสำคัญของธุรกิจบางอย่าง
ก่อนอื่นวิเคราะห์ความสัมพันธ์ทางธุรกิจระหว่างตารางที่มีความสัมพันธ์ระหว่างระดับข้อมูล:
usre และคำสั่ง:
ผู้ใช้ ―-> คำสั่งซื้อ: ผู้ใช้สามารถสร้างคำสั่งซื้อได้หลายคำสั่งหนึ่งถึงหลายคน
คำสั่งซื้อ -> ผู้ใช้: คำสั่งซื้อถูกสร้างขึ้นโดยผู้ใช้เพียงหนึ่งคนหนึ่งต่อหนึ่ง
คำสั่งซื้อและ orderdetail:
คำสั่งซื้อ> orderdetail: คำสั่งซื้ออาจรวมถึงรายละเอียดการสั่งซื้อหลายรายการเนื่องจากคำสั่งซื้อหนึ่งรายการสามารถซื้อหลายรายการและข้อมูลการซื้อของแต่ละรายการจะถูกบันทึกไว้ใน orderdetail ความสัมพันธ์แบบหนึ่งต่อหลายคน
orderdetail> คำสั่งซื้อ: รายละเอียดการสั่งซื้อสามารถรวมอยู่ในคำสั่งซื้อแบบหนึ่งต่อหนึ่งได้
orderdetail และ itemsm:
orderDetail-> รายการ: รายละเอียดการสั่งซื้อหนึ่งรายเท่านั้นสอดคล้องกับข้อมูลผลิตภัณฑ์หนึ่งรายการหนึ่งต่อหนึ่ง
รายการ> orderdetail: ผลิตภัณฑ์สามารถรวมอยู่ในรายละเอียดการสั่งซื้อหลายรายการหนึ่งถึงหลาย ๆ
จากนั้นวิเคราะห์ว่ามีความสัมพันธ์ทางธุรกิจระหว่างตารางที่ไม่เกี่ยวข้องกับระดับฐานข้อมูลหรือไม่:
คำสั่งซื้อและรายการ:
ความสัมพันธ์ระหว่างคำสั่งซื้อและรายการสามารถสร้างได้ผ่านตาราง orderdetail
ผู้ใช้และรายการ: ประกอบด้วยความสัมพันธ์แบบหลายต่อหลายครั้งผ่านตารางอื่น ๆ
แบบสอบถามแบบตัวต่อตัว
ข้อกำหนด: ข้อมูลการสั่งซื้อแบบสอบถามและข้อมูลผู้ใช้แบบสอบถามเชื่อมโยงสำหรับการสร้างคำสั่งซื้อ
ใช้ ResultSpe เพื่อค้นหา
การพิจารณาการใช้คำสั่ง SQL
กำหนดตารางหลักของแบบสอบถาม: ตารางคำสั่งซื้อ
กำหนดตารางการเชื่อมโยงสำหรับแบบสอบถาม: ตารางผู้ใช้
แบบสอบถามสมาคมใช้ลิงค์ภายในหรือลิงค์ภายนอกหรือไม่?
เนื่องจากมีคีย์ต่างประเทศ (user_id) ในตารางคำสั่งซื้อเพียงหนึ่งระเบียนสามารถพบได้โดยการสอบถามตารางผู้ใช้ผ่านการเชื่อมโยงคีย์ต่างประเทศและสามารถใช้ลิงค์ภายในได้
เลือกคำสั่งซื้อ*, user.username, user.sex, user.address fromorders, ผู้ใช้ที่ orders.user_id = user.id
สร้าง pojo (orderscustom.java)
แมปผลลัพธ์ของแบบสอบถาม SQL ข้างต้นลงใน POJO ซึ่งจะต้องรวมชื่อคอลัมน์แบบสอบถามทั้งหมด
คำสั่งซื้อดั้งเดิม Java ไม่สามารถแมปฟิลด์ทั้งหมดและจำเป็นต้องใช้ pojo ที่สร้างขึ้นใหม่
สร้างคลาส PO ที่สืบทอดคลาส PO ที่มีฟิลด์แบบสอบถามจำนวนมาก
ordersmappercustom.xml
ordersmappercustom.java
เขียนคลาสทดสอบ
คลิกขวาที่ไฟล์ ordersmappercustom.java> เลือกใหม่> อื่น ๆ > กรณีทดสอบ junit> เลือกฟังก์ชั่นเพื่อทดสอบ
เขียนรหัสต่อไปนี้ใน ordersmappercustomtest.java:
Public Class OrdersMapperCustomTest {Private SQLSessionFactory SQLSessionFactory; // วิธีนี้คือการเรียกใช้ @BeforePublic void setup () โยนข้อยกเว้น {// สร้าง SQLSessionFactory // myBatis configuration resource = "sqlmapconfig.xml" Resources.getResourceasstream (ทรัพยากร); // สร้างเซสชันโรงงานและส่งผ่านข้อมูลไฟล์การกำหนดค่า mybatis sqlsessionfactory = ใหม่ sqlsessionfactorybuilder () สร้าง (inputstream);}@testpublic void testfindordersuser () ordersmappercustom ordersmappercustom = sqlsession.getMapper (ordersmappercustom.class); // รายการวิธีการเรียกใช้รายการ Mapper Method <sorderScustom> list = ordersmappercustom.findordersuser (); system.out.println (รายการ); sqlsession.close ();};};ใช้ ResultMap เพื่อสอบถาม
คำสั่ง SQL: SQL นำไปใช้ในผลลัพธ์เดียวกัน
แนวคิดสำหรับการใช้การแมปผลลัพธ์
ใช้ ResultMap เพื่อแมปข้อมูลการสั่งซื้อในผลลัพธ์การสืบค้นไปยังวัตถุคำสั่งซื้อเพิ่มแอตทริบิวต์ผู้ใช้ในคลาสคำสั่งซื้อและแมปข้อมูลผู้ใช้ที่เกี่ยวข้องกับแอตทริบิวต์ผู้ใช้ในวัตถุคำสั่งซื้อ
เพิ่มแอตทริบิวต์ผู้ใช้ในคลาสคำสั่งซื้อ
ordersmappercustom.xml
กำหนดผลลัพธ์
TYEP: หมายถึงการแมปผลลัพธ์ของการสืบค้นทั้งหมดไปยังชั้นเรียนที่แน่นอนเช่น: cn.itcast.mybatis.po.orders
ID: แสดงถึงตัวระบุที่ไม่ซ้ำกันของคอลัมน์แบบสอบถามในตารางฐานข้อมูลตัวระบุที่ไม่ซ้ำกันในข้อมูลการสั่งซื้อ หากมีหลายคอลัมน์ที่สร้างตัวระบุที่ไม่ซ้ำกันให้กำหนดค่า ID หลายรายการ
คอลัมน์: คอลัมน์การระบุตัวตนที่ไม่ซ้ำกันสำหรับข้อมูลการสั่งซื้อในตารางฐานข้อมูล
คุณสมบัติ: คุณสมบัติใดที่แมปกับคำสั่งซื้อโดยคอลัมน์บัตรประจำตัวที่ไม่ซ้ำกันของข้อมูลการสั่งซื้อ?
การเชื่อมโยง: ใช้ในการแมปข้อมูลสำหรับการสอบถามแต่ละวัตถุ
คุณสมบัติ: คุณสมบัติใดในการสั่งซื้อเพื่อแมปข้อมูลผู้ใช้ของแบบสอบถามที่เกี่ยวข้องกับ
Javatype: คุณสมบัติใดที่แมปกับผู้ใช้
<!-ผลลัพธ์ของผู้ใช้ที่เกี่ยวข้องแมปผลลัพธ์ของการสืบค้นทั้งหมดไปยัง cn.itcast.mybatis.po.orders-> <resultmap type = "cn.itcast.mybatis.po.orders" ord-ordicient ide-ide ข้อมูล. หากมีหลายคอลัมน์ในการสร้างตัวระบุที่ไม่ซ้ำกันให้กำหนดค่า IDColumn หลายรายการ: คอลัมน์การระบุที่ไม่ซ้ำกันของคุณสมบัติการสั่งซื้อข้อมูล: คุณสมบัติใดในคำสั่งซื้อที่ถูกแมปไปที่คอลัมน์ตัวระบุที่ไม่ซ้ำกันของข้อมูลคำสั่งซื้อ-> <ID คอลัมน์ = "id" คุณสมบัติ = "ID" /> <result column = "property =" creatt = "cropalate = column = "note" property = note/> <!-กำหนดค่าข้อมูลผู้ใช้ที่เกี่ยวข้องที่แมป-> <!-การเชื่อมโยง: ข้อมูลที่ใช้ในการแมปคุณสมบัติการสืบค้นวัตถุเดียวที่เกี่ยวข้อง: คุณสมบัติใดในคำสั่งซื้อเพื่อแมปข้อมูลผู้ใช้ของแบบสอบถามที่เกี่ยวข้องกับ-> <การเชื่อมโยงคุณสมบัติ = "ผู้ใช้" javatype = "cn.itcast.mybatis.po. ข้อมูลผู้ใช้ javatype: คุณสมบัติใดที่แมปกับผู้ใช้ -> <id column = "user_id" คุณสมบัติ = "id"/> <result column = "ชื่อผู้ใช้" คุณสมบัติ = "ชื่อผู้ใช้"/> <result column = "sex" property = "sex"/> <result column = "address"
คำจำกัดความคำสั่ง
ordersmappercustom.java
รหัสทดสอบ
@TestPublic เป็นโมฆะ testFindOrSuserResultMap () โยนข้อยกเว้น {SQLSession SQLSession = SQLSessionFactory.Opensession (); // สร้างพร็อกซีวัตถุ ObjectMappercustom ordermappercustom = sqlsession.getmapper ordersmappercustom.findordersuserresultmap (); system.out.println (รายการ); sqlsession.close ();}ResultType และ ResultSmap ใช้การสืบค้นแบบหนึ่งต่อหนึ่ง
ResultType: มันค่อนข้างง่ายที่จะนำไปใช้โดยใช้ ResultType หากชื่อคอลัมน์แบบสอบถามไม่รวมอยู่ใน POJO คุณจะต้องเพิ่มแอตทริบิวต์ที่เกี่ยวข้องของชื่อคอลัมน์เพื่อทำการแมปให้เสร็จสมบูรณ์
หากไม่มีข้อกำหนดพิเศษสำหรับผลลัพธ์การสืบค้นขอแนะนำให้ใช้ ResultType
ResultMap: MAP ผลลัพธ์จะต้องมีการกำหนดแยกต่างหากซึ่งเป็นปัญหาเล็กน้อย หากมีข้อกำหนดพิเศษสำหรับผลลัพธ์การสืบค้นการใช้ ResultMap สามารถทำให้แอตทริบิวต์ของการทำแผนที่การสืบค้นที่เกี่ยวข้องเสร็จสมบูรณ์
Map ResultsMap สามารถใช้งานได้อย่างขี้เกียจ ResultType ไม่สามารถใช้การโหลดขี้เกียจได้
แบบสอบถามแบบหนึ่งต่อหลายคน
ข้อกำหนด: คำสั่งค้นหาและข้อมูลรายละเอียดการสั่งซื้อ
คำสั่ง SQL
กำหนดตารางเคียวรีหลัก: ตารางคำสั่งซื้อ
กำหนดตารางการสืบค้นที่เกี่ยวข้อง: ตารางรายละเอียดการสั่งซื้อ
เพียงเพิ่มรายละเอียดการสั่งซื้อรายการสมาคมตามแบบสอบถามแบบหนึ่งต่อหนึ่ง
Selectorders.*, user.username, user.sex, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_idfromorders, ผู้ใช้
การวิเคราะห์: ใช้ ResultType เพื่อแมปผลลัพธ์การสืบค้นข้างต้นลงใน POJO และข้อมูลการสั่งซื้อคือการทำซ้ำ
ข้อกำหนด: บันทึกที่ซ้ำกันไม่สามารถเกิดขึ้นได้สำหรับการทำแผนที่คำสั่งซื้อ
เพิ่มคุณสมบัติ <orderdetail> คุณสมบัติ orderdetails ในคลาส order.java
ในที่สุดข้อมูลการสั่งซื้อจะถูกแมปเป็นคำสั่งซื้อและรายละเอียดการสั่งซื้อที่สอดคล้องกับคำสั่งซื้อจะถูกแมปเข้ากับคุณสมบัติ orderdetails ในคำสั่งซื้อ
จำนวนคำสั่งซื้อที่บันทึกไว้ในการแมปคือสอง (ข้อมูลคำสั่งซื้อไม่ได้ทำซ้ำ)
คุณสมบัติ orderdetails ในแต่ละคำสั่งซื้อจะจัดเก็บรายละเอียดการสั่งซื้อที่สอดคล้องกับคำสั่งซื้อ
เพิ่มแอตทริบิวต์รายละเอียดการสั่งซื้อรายการใน orders.java
ordersmappercustom.xml
คำจำกัดความของผลลัพธ์
ใช้ขยายการสืบทอดโดยไม่ต้องกำหนดค่าการแมปข้อมูลการสั่งซื้อและข้อมูลผู้ใช้ใน
คอลเลกชัน: แบบสอบถามหลายระเบียนเพื่อทำแผนที่ไปยังวัตถุคอลเลกชันสำหรับการสืบค้นสมาคม
คุณสมบัติ: แผนที่การสืบค้นสมาคมไปยังหลายระเบียนไปยัง cn.itcast.mybatis.po.orders คุณสมบัติใดที่แมปกับ cn.itcast.mybatis.po.orders
OfType: ระบุประเภทที่แผนที่ไปยัง POJO ในแอตทริบิวต์การรวบรวมรายการ
<!-ผลลัพธ์ที่ได้สำหรับคำสั่งซื้อและรายละเอียดการสั่งซื้อนั้นได้รับการสืบทอดโดยใช้ส่วนขยายและไม่จำเป็นต้องกำหนดค่าการแมปข้อมูลการสั่งซื้อและข้อมูลผู้ใช้ในนั้น-> <resultmap type = "cn.itcast.mybatis.po.orders" ord-orderDoRderDetailResultMap " การสืบทอดไม่จำเป็นต้องกำหนดค่าการแมปของข้อมูลการสั่งซื้อและข้อมูลผู้ใช้ในนั้น-> <!-รายละเอียดการสั่งซื้อข้อมูลแบบสอบถามสมาคมการสั่งซื้อมีรายละเอียดหลายอย่าง หากต้องการใช้คอลเลกชันเพื่อทำแผนที่คอลเลกชัน: แผนที่หลายระเบียนไปยังคุณสมบัติการรวบรวมอ็อบเจ็กต์: แผนที่ความสัมพันธ์แบบสอบถามไปยังหลายระเบียนไปยัง cn.itcast.mybatis.po.orders คุณสมบัติใดของ ttype: ระบุประเภทของแผนที่ pojo ไปยังคุณสมบัติการรวบรวมคุณสมบัติ-> <collection property = "orderdetails" แมปตัวระบุที่ไม่ซ้ำกันของรายละเอียดการสั่งซื้อไปยัง cn.itcast.mybatis.po.orderDetail-> <id column = "orderDetail_id" คุณสมบัติ = "id"/> <result column = "items_id" คุณสมบัติ = "itementId"/> <results = "ittes_num"
ordersmappercustom.java
รหัสทดสอบ:
@TestPublic เป็นโมฆะ testFindOrdOrdOrderDetailResultMap () โยนข้อยกเว้น {SQLSession SQLSession = SQLSessionFactory.OpenSession (); // สร้างพร็อกซีวัตถุสั่งซื้อ ordersmappercustom; ordersmappercustom.findordersandorderDetailResultMap (); system.out.println (รายการ); sqlsession.close ();}สรุป
MyBatis ใช้คอลเลกชันของ ResultMap เพื่อแมปหลายระเบียนของแบบสอบถามที่เกี่ยวข้องลงในคุณสมบัติการรวบรวมรายการ
การใช้งานโดยใช้ ResultType:
การทำแผนที่รายละเอียดการสั่งซื้อเป็นคำสั่งซื้อในคำสั่งซื้อคุณต้องจัดการด้วยตัวเองใช้ลูปสองครั้งเพื่อสำรวจลบบันทึกที่ซ้ำกันและวางรายละเอียดการสั่งซื้อใน orderdetails
แบบสอบถามหลายต่อหลายคน
ข้อกำหนด: ผู้ใช้แบบสอบถามและข้อมูลการซื้อผู้ใช้
คำสั่ง SQL
ตารางหลักแบบสอบถามคือ: ตารางผู้ใช้
ตารางการเชื่อมโยง: เนื่องจากผู้ใช้และผลิตภัณฑ์ไม่เกี่ยวข้องโดยตรงพวกเขาจะเกี่ยวข้องผ่านคำสั่งซื้อและรายละเอียดการสั่งซื้อดังนั้นตารางการเชื่อมโยง: คำสั่งซื้อ, orderdetail, รายการ
เลือกคำสั่งซื้อ*, user.username, user.sex, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id, items.name items_name, items.detail items order.user_id = user.id และ orderdetail.orders_id = order.id และ orderdetail.items_id = items.id
การทำแผนที่ไอเดีย
แมปข้อมูลผู้ใช้เป็นผู้ใช้
เพิ่มรายการแอตทริบิวต์รายการคำสั่งซื้อ <derrer> orderlist ในคลาสผู้ใช้เพื่อแมปคำสั่งซื้อที่สร้างโดยผู้ใช้ไปยังลิสต์คำสั่งซื้อ
เพิ่มรายละเอียดการสั่งซื้อรายการคุณสมบัติรายการคุณสมบัติ <OrderDetail> orderDetials ในการสั่งซื้อไปยังแผนที่ orderDetials
เพิ่มคุณสมบัติรายการใน OrderDetail เพื่อแมปรายการที่สอดคล้องกับรายละเอียดการสั่งซื้อในรายการ
ordersmappercustom.xml
คำจำกัดความของผลลัพธ์
<!-สอบถามผู้ใช้และผลิตภัณฑ์ที่ซื้อ-> <resultmap type = "cn.itcast.mybatis.po.user" id = "useranditemsresultmap"> <!-ข้อมูลผู้ใช้-> <id column = "user_id" คุณสมบัติ = "idex = <ide result => property = "ที่อยู่"/> <!-ข้อมูลการสั่งซื้อผู้ใช้สอดคล้องกับคำสั่งซื้อหลายครั้งและใช้การแมปคอลเลกชัน-> <property collection = "orderslist" OfType = "cn.itcast.mybatis.po.orders"> <id column = "id" property = "id"/> property = "createTime"/> <result column = "note" property = "note"/> <!-รายละเอียดการสั่งซื้อหนึ่งคำสั่งรวมถึงรายละเอียดหลายอย่าง-> <collection property = "orderDetails" OFType = "cn.itcast.mybatis.po.orderDetail" column = "items_num" property = "itemnum"/> <result column = "orders_id" คุณสมบัติ = "ordersid"/> <!-ข้อมูลผลิตภัณฑ์รายละเอียดการสั่งซื้อสอดคล้องกับผลิตภัณฑ์-> <Association property = "items" javatype = "cn.itcast.mybatis.po.items" property = "name"/> <result column = "items_detail" คุณสมบัติ = "รายละเอียด"/> <result column = "items_price" คุณสมบัติ = "ราคา"/> </secelation> </collection> </collection>
ordersmappercustom.java
รหัสทดสอบ:
@TestPublic เป็นโมฆะ TestFinduserandItemSresultMap () โยนข้อยกเว้น {SQLSession SQLSession = SQLSessionFactory.OpenSession (); // สร้างพร็อกซีวัตถุสั่งซื้อ mappermappermappermpermertom = sqlsession.getMapper ordersmappercustom.finduseranditemsresultmap (); system.out.println (รายการ); sqlsession.close ();} สรุปการสืบค้นหลายต่อหลายครั้ง
รายละเอียดของข้อมูลผลิตภัณฑ์ที่ซื้อโดยผู้ใช้จะได้รับการตรวจสอบ (ชื่อผู้ใช้ที่อยู่ผู้ใช้ชื่อผลิตภัณฑ์เวลาซื้อปริมาณการซื้อ)
ในการตอบสนองต่อข้อกำหนดข้างต้นเราใช้ ResultType เพื่อแมปบันทึกการสืบค้นลงใน POJO ที่ขยายออกไปซึ่งง่ายมากในการใช้ฟังก์ชั่นของรายการโดยละเอียด
แบบหนึ่งต่อหลายคนเป็นกรณีพิเศษของหลาย ๆ คนดังนี้:
เมื่อสอบถามข้อมูลผลิตภัณฑ์ที่ผู้ใช้ซื้อความสัมพันธ์ระหว่างผู้ใช้และผลิตภัณฑ์เป็นความสัมพันธ์แบบหลายต่อหลายครั้ง
ข้อกำหนด 1:
ฟิลด์แบบสอบถาม: บัญชีผู้ใช้ชื่อผู้ใช้เพศผู้ใช้ชื่อผลิตภัณฑ์ราคาผลิตภัณฑ์ (ทั่วไปมากที่สุด)
รายการรายละเอียดทั่วไปในการพัฒนาองค์กรรายละเอียดของผลิตภัณฑ์ที่ซื้อโดยผู้ใช้
ใช้ ResultType เพื่อแมปคอลัมน์แบบสอบถามด้านบนกับเอาต์พุต POJO
ข้อกำหนด 2:
ฟิลด์แบบสอบถาม: บัญชีผู้ใช้ชื่อผู้ใช้ปริมาณของรายการที่ซื้อรายละเอียดผลิตภัณฑ์ (เมาส์เพื่อแสดงรายละเอียด)
ใช้ ResultMap เพื่อแมปรายการรายละเอียดผลิตภัณฑ์ที่ผู้ใช้ซื้อลงในวัตถุผู้ใช้
สรุป:
การใช้ผลลัพธ์ MAP สำหรับฟังก์ชั่นเหล่านั้นที่มีข้อกำหนดพิเศษสำหรับการแมปการสืบค้นผลลัพธ์เช่นการแมปข้อกำหนดพิเศษในรายการรวมถึงรายการหลายรายการ
สรุปผลการแข่งขันและผลลัพธ์
ผลการแข่งขัน:
ผล:
แมปผลลัพธ์การสืบค้นเป็น pojo ตามชื่อคอลัมน์ SQL ชื่อแอตทริบิวต์ชื่อความสอดคล้อง
โอกาส:
การแสดงผลทั่วไปของระเบียนโดยละเอียดเช่นเมื่อผู้ใช้ซื้อรายละเอียดผลิตภัณฑ์และแสดงข้อมูลการสืบค้นที่เกี่ยวข้องทั้งหมดในหน้าคุณสามารถใช้ ResultSpe โดยตรงเพื่อแมปแต่ละบันทึก
ยิงเข้าไปใน Pojo และสำรวจรายการ (pojo ในรายการ) ในหน้า front-end
MAP ผลลัพธ์:
ใช้การเชื่อมโยงและคอลเลกชันเพื่อทำแผนที่ขั้นสูงแบบหนึ่งต่อหนึ่งและหนึ่งต่อหนึ่ง (มีข้อกำหนดการทำแผนที่พิเศษสำหรับผลลัพธ์)
สมาคม:
ผล:
แมปข้อมูลการสืบค้นที่เกี่ยวข้องลงในวัตถุ POJO
โอกาส:
เพื่ออำนวยความสะดวกในการสอบถามข้อมูลที่เกี่ยวข้องคุณสามารถใช้การเชื่อมโยงเพื่อทำแผนที่ข้อมูลคำสั่งซื้อที่เกี่ยวข้องลงในแอตทริบิวต์ POJO ของวัตถุผู้ใช้เช่น: คำสั่งค้นหาและข้อมูลผู้ใช้ที่เกี่ยวข้อง
การใช้ ResultType ไม่สามารถแมปผลลัพธ์การสืบค้นกับแอตทริบิวต์ POJO ของวัตถุ POJO เลือกว่าจะใช้ ResultType หรือผลลัพธ์ตามความต้องการของการสำรวจการค้นหาชุดผลลัพธ์
ของสะสม:
ผล:
แมปข้อมูลการสืบค้นที่เกี่ยวข้องลงในรายการรวบรวมรายการ
โอกาส:
เพื่ออำนวยความสะดวกในการสอบถามข้อมูลการเชื่อมโยงการสำรวจคุณสามารถใช้คอลเลกชันเพื่อแมปข้อมูลการเชื่อมโยงกับรายการรวบรวมรายการเช่น: การสืบค้นโมดูลขอบเขตการอนุญาตผู้ใช้และเมนูภายใต้โมดูลคุณสามารถใช้คอลเลกชันเพื่อแมปรายการโมดูลเพื่อแมปรายการเมนูของวัตถุโมดูล จุดประสงค์ของสิ่งนี้คือเพื่ออำนวยความสะดวกในการสอบถามการสอบถามชุดผลลัพธ์แบบสอบถาม
หากคุณใช้ ResultType คุณไม่สามารถแมปผลลัพธ์การสืบค้นไปยังรายการรวบรวมรายการ
การโหลดล่าช้า
ResultSmap สามารถใช้การแมปขั้นสูง (ใช้การเชื่อมโยงและการรวบรวมเพื่อใช้การทำแผนที่แบบหนึ่งต่อหนึ่งและหนึ่งต่อหลาย) การเชื่อมโยงและคอลเลกชันมีฟังก์ชั่นการโหลดขี้เกียจ
ความต้องการ:
หากคำสั่งซื้อถูกสอบถามและข้อมูลผู้ใช้มีความเกี่ยวข้อง หากเราสอบถามข้อมูลการสั่งซื้อเป็นครั้งแรกเพื่อให้เป็นไปตามข้อกำหนดเราจะสอบถามข้อมูลผู้ใช้เมื่อเราต้องการสอบถามข้อมูลผู้ใช้ การสอบถามข้อมูลผู้ใช้ตามความต้องการล่าช้าในการโหลด
การโหลดล่าช้า: แบบสอบถามแรกจากตารางเดียวจากนั้นจากตารางที่เกี่ยวข้องเมื่อจำเป็นต้องปรับปรุงประสิทธิภาพของฐานข้อมูลอย่างมากเนื่องจากการสืบค้นตารางเดียวนั้นเร็วกว่าการสืบค้นหลายตาราง
ใช้การเชื่อมโยงเพื่อใช้การโหลดขี้เกียจ
ข้อกำหนด: คำสั่งค้นหาและข้อมูลผู้ใช้แบบสอบถามเชื่อมโยง
ordresmappercustom.xml
มีความจำเป็นที่จะต้องกำหนดคำสั่งที่สอดคล้องกับวิธีการทำแผนที่สองวิธี
1. ข้อมูลการสั่งซื้อแบบสอบถามเท่านั้น
เลือก * จากคำสั่งซื้อ
ใช้การเชื่อมโยงเพื่อชะลอการโหลด (ดำเนินการ) ความพึงพอใจต่อไปนี้ (ข้อมูลผู้ใช้คิวรีสมาคม) ในคำสั่งของคำสั่งค้นหา
2. ข้อมูลผู้ใช้แบบสอบถามที่เกี่ยวข้อง
user_id ใช้เพื่อสอบถามข้อมูลผู้ใช้โดยทำตาม user_id ในแบบสอบถามข้อมูลการสั่งซื้อด้านบน
ใช้ finduserbyid ใน usermapper.xml
ก่อนหน้านี้จะดำเนินการ FinderDersuserLazyLoading และเมื่อคุณต้องการสอบถามผู้ใช้จากนั้นเรียกใช้ FindUserById และการโหลดและการดำเนินการล่าช้าจะถูกกำหนดค่าผ่านคำจำกัดความของผลลัพธ์
การหน่วงเวลาการโหลดผลลัพธ์
ใช้เลือกในการเชื่อมโยงเพื่อระบุ ID ของคำสั่งที่จะดำเนินการโดยการโหลดขี้เกียจ
<!-Lazy Loaded ResultSmap-> <resultMap type = "cn.itcast.mybatis.po.orders" id = "ordersuserlazyla ด้านการฝึกฝน"> <!-การกำหนดค่าการแมปข้อมูลคำสั่งซื้อ-> <id = "id" คุณสมบัติ = "id"/> < column = "createTime" property = "createTime"/> <result column = "note" คุณสมบัติ = "note"/> <!-การกำหนดค่าการแมปของข้อมูลคำสั่งซื้อ-> <id column = "id" คุณสมบัติ = "user_id" คุณสมบัติ = "userId"/> <result column = "number"
เลือก: ระบุ ID ของคำสั่งที่จะดำเนินการสำหรับการโหลดขี้เกียจ (คำสั่งที่สอบถามข้อมูลผู้ใช้ตาม user_id)
หากต้องการใช้ FindUserById ใน usermapper.xml เพื่อกรอกข้อมูลแบบสอบถามตามข้อมูลผู้ใช้ ID (user_id) หาก FindUserById ไม่ได้อยู่ในแผนที่นี้คุณจะต้องเพิ่มเนมสเปซก่อนหน้านี้
คอลัมน์: คอลัมน์ในข้อมูลการสั่งซื้อที่เกี่ยวข้องกับแบบสอบถามข้อมูลผู้ใช้คือ user_id
SQL for Association Query เข้าใจว่า:
เลือกคำสั่งซื้อ*, (เลือกชื่อผู้ใช้จากผู้ใช้ที่ orders.user_id = user.id) ชื่อผู้ใช้ (เลือกเพศจากผู้ใช้ที่สั่งซื้อ user_id = user.id) คำสั่งซื้อ sexfrom-> <การเชื่อมโยงคุณสมบัติ = "ผู้ใช้" javatype = "cn.itcast.mybatis.po.user column = "user_id"> <!-ใช้การโหลดขี้เกียจของข้อมูลผู้ใช้-> </secelation> </resultmap>
orderesmappercustom.java
แนวคิดทดสอบ:
1. ดำเนินการวิธีการ MAPPER ด้านบน (FindERSUSERLAZYLOADING) และโทรหา FindORSUSERLAZYLOADING ใน CN.ITCAST.MYBATIS.MAPPER.ORDERSMAPPERCUSTOM ข้อมูลคำสั่งค้นหาเท่านั้น (ตารางเดี่ยว)
2. ในโปรแกรมสำรวจรายการ <คำสั่ง> แบบสอบถามในขั้นตอนก่อนหน้า เมื่อเราเรียกเมธอด Getuser ตามคำสั่งเราเริ่มโหลดขี้เกียจ
3. การโหลดล่าช้าโทรเมธอด finduserById ใน usermapper.xml เพื่อรับข้อมูลผู้ใช้
การกำหนดค่าโหลดขี้เกียจ
MyBatis ไม่เปิดใช้งานการโหลดขี้เกียจตามค่าเริ่มต้นและจำเป็นต้องกำหนดค่าใน sqlmapconfig.xml
กำหนดค่าในไฟล์กำหนดค่า MyBatis Core:
ตั้งค่าคำอธิบายรายการค่าเริ่มต้นที่อนุญาต
LazyLoadingEnabled ทั่วโลกตั้งค่าการโหลดขี้เกียจ หากตั้งค่าเป็น 'เท็จ' สิ่งที่เกี่ยวข้องทั้งหมดจะเริ่มต้นและโหลด จริงหรือเท็จ
aggressivelazyloading เมื่อตั้งค่าเป็น 'จริง' วัตถุที่กำลังโหลดขี้เกียจอาจถูกโหลดโดยคุณสมบัติที่ขี้เกียจทั้งหมด มิฉะนั้นคุณสมบัติแต่ละคุณสมบัติจะถูกโหลดตามต้องการ จริงหรือเท็จจริง
กำหนดค่าใน sqlmapconfig.xml:
รหัสทดสอบ
คิดถึงการโหลดล่าช้า
จะทำอย่างไรให้กับการโหลดขี้เกียจโดยไม่ต้องใช้การเชื่อมโยงและคอลเลกชันที่จัดทำโดย MyBatis?
วิธีการใช้งานมีดังนี้:
กำหนดวิธีการทำแผนที่สองวิธี:
1. สอบถามรายการคำสั่งซื้อ
2. ข้อมูลผู้ใช้แบบสอบถามตามรหัสผู้ใช้
แนวคิดการใช้งาน:
ก่อนอื่นตรวจสอบวิธีการทำแผนที่แรกและรับรายการข้อมูลการสั่งซื้อ
ในโปรแกรม (บริการ) โทรหาวิธีการทำแผนที่ที่สองตามที่จำเป็นในการสอบถามข้อมูลผู้ใช้
กล่าวโดยย่อ: ใช้วิธีการโหลดขี้เกียจเพื่อสืบค้น SQL อย่างง่าย (โดยเฉพาะอย่างยิ่งตารางเดียวคุณยังสามารถเชื่อมโยงการสืบค้น) จากนั้นโหลดข้อมูลอื่น ๆ ของการสืบค้นที่เกี่ยวข้องตามต้องการ
แคชแบบสอบถาม
MyBatis ให้แคชแบบสอบถามเพื่อลดความดันข้อมูลและปรับปรุงประสิทธิภาพของฐานข้อมูล
MyBaits ให้แคชระดับแรกและแคชระดับที่สอง
แคชระดับ 1 เป็นแคชระดับ SQLSession เมื่อใช้งานฐานข้อมูลคุณต้องสร้างวัตถุ SQLSession และมีโครงสร้างข้อมูล (HASHMAP) ในวัตถุเพื่อจัดเก็บข้อมูลแคช พื้นที่ข้อมูลแคช (HASHMAPS) ระหว่าง SQLSessions ที่แตกต่างกันไม่ส่งผลกระทบต่อกันและกัน
แคชทุติยภูมิเป็นแคชระดับ MAPPER SQLSessions หลายตัวใช้คำสั่ง SQL ของแผนที่เดียวกัน SQLSessions หลายตัวสามารถแชร์แคชทุติยภูมิได้ แคชรองคือ cross-sqlsession
ทำไมต้องใช้แคช?
หากมีข้อมูลในแคชคุณไม่จำเป็นต้องได้รับจากฐานข้อมูลซึ่งปรับปรุงประสิทธิภาพของระบบอย่างมาก
แคชระดับ 1
หลักการทำงานการแคชระดับแรก
ครั้งแรกที่ฉันเริ่มการสืบค้นข้อมูลผู้ใช้ด้วย ID ผู้ใช้ 1 ก่อนอื่นให้ค้นหาว่ามีข้อมูลผู้ใช้ที่มีข้อมูลผู้ใช้ที่มี ID 1 ในแคชหรือไม่ ถ้าไม่สอบถามข้อมูลผู้ใช้จากฐานข้อมูล
รับข้อมูลผู้ใช้และจัดเก็บข้อมูลผู้ใช้ในแคชระดับแรก
หาก SQLSession ดำเนินการกระทำ (ดำเนินการแทรกอัปเดตและลบ) ให้ล้างแคชระดับแรกใน SQLSession จุดประสงค์ของสิ่งนี้คือการทำให้แคชเก็บข้อมูลล่าสุดและหลีกเลี่ยงการอ่านที่สกปรก
ครั้งที่สองที่ฉันเริ่มสอบถามข้อมูลผู้ใช้ด้วย ID ผู้ใช้ 1 ก่อนอื่นให้ค้นหาว่ามีข้อมูลผู้ใช้ที่มีข้อมูลผู้ใช้ที่มี ID 1 ในแคชหรือไม่ หากมีหนึ่งในแคชฉันจะได้รับข้อมูลผู้ใช้โดยตรงจากแคช
การทดสอบแคชระดับ 1
MyBatis รองรับการแคชระดับแรกโดยค่าเริ่มต้นและไม่จำเป็นต้องกำหนดค่าในไฟล์กำหนดค่า
ทำตามขั้นตอนหลักการแคชระดับหนึ่งข้างต้นเพื่อทดสอบ
//ordersmappercusntomtest.java@testpublic เป็นโมฆะ testcache1 () โยนข้อยกเว้น {sqlsession sqlsession = sqlsessionfactory.opensession (); // สร้างวัตถุพร็อกซี usermapper usermapper = sqlsession และผู้ใช้ที่มี ID 1 เป็นผู้ใช้แบบสอบถามผู้ใช้ 1 = USERMAPPER.FINDUSERBYID (1); System.out.println (user1); // ถ้า SQLSession ดำเนินการคอมมิชชัน (ดำเนินการแทรกอัปเดตและลบ) จุดประสงค์ของสิ่งนี้คือการทำให้แคชเก็บข้อมูลล่าสุดและหลีกเลี่ยงการอ่านที่สกปรก // อัปเดตข้อมูลของ USER1 user1.SetUserName ("ทดสอบ USER22"); USERMAPPER.UPDATEUSER (USER1); // ดำเนินการดำเนินการ commit เพื่อล้างแคช sqlsession.Commit (); // เริ่มคำขอที่สองและสอบถามผู้ใช้ที่มีผู้ใช้ ID 1 ผู้ใช้ 2 = USERMAPPER.FINDUSERBYID (1); System.out.println (user2); sqlsession.close ();แอปพลิเคชันแคชระดับ 1
การพัฒนาอย่างเป็นทางการคือการรวม mybatis และฤดูใบไม้ผลิและการทำธุรกรรมจะถูกควบคุมในการบริการ
วิธีการบริการรวมถึงการเรียกวิธีการทำแผนที่จำนวนมาก
บริการ {// เมื่อเริ่มดำเนินการเริ่มการทำธุรกรรมและสร้างวัตถุ SQLSession // เรียกวิธีการของ Mapper เป็นครั้งแรก FindUserByID (1) // เซลล์วิธีการทำแผนที่เป็นครั้งที่สอง FindUserById (1) ดึงข้อมูลจากแคชระดับแรก //หากคุณเรียกใช้การโทรสองบริการเพื่อสอบถามข้อมูลผู้ใช้เดียวกันคุณจะไม่ไปที่แคชระดับแรกเนื่องจากวิธีการเซสชันสิ้นสุดลง SQLSession จะถูกปิดและแคชระดับแรกจะถูกล้าง
แคชระดับ 2
หลักการ
ก่อนอื่นเปิดใช้งานแคชระดับที่สองของ mybatis
SQLSession1 Querys ข้อมูลผู้ใช้ที่มี ID ผู้ใช้ 1. เมื่อสอบถามข้อมูลผู้ใช้ข้อมูลการสืบค้นจะถูกเก็บไว้ในแคชรอง
หาก SQLSESSION3 ดำเนินการ SQL ภายใต้แผนที่เดียวกันให้ดำเนินการส่งการส่งและล้างข้อมูลในพื้นที่แคชรองภายใต้ MAPPER
SQLSESSION2 แบบสอบถามข้อมูลผู้ใช้ด้วย ID ผู้ใช้ 1 และพบว่ามีข้อมูลในแคชหรือไม่ หากมีอยู่ข้อมูลจะถูกดึงโดยตรงจากแคช
ความแตกต่างระหว่างแคชทุติยภูมิและแคชหลักมีขนาดใหญ่กว่า ช่วงของแคชรองมีขนาดใหญ่กว่า SQLSessions หลายแห่งสามารถแชร์พื้นที่แคชรองของ Usermapper ได้
Usermapper มีพื้นที่แคชรอง (แบ่งโดยเนมสเปซ) และ mappers อื่น ๆ ยังมีพื้นที่แคชรองของตัวเอง (แบ่งโดยเนมสเปซ)
แผนที่เนมสเปซแต่ละตัวมีพื้นที่แคชที่สอง หากเนมสเปซของทั้งสอง mapers เหมือนกันทั้งสองแมปเปอร์จะมีพื้นที่แคชที่สองเดียวกันเมื่อข้อมูลถูกเรียกใช้งานโดย SQL
เปิดแคชระดับ 2
แคชระดับที่สองของ MyBaits คือระดับช่วงของ MAPPER นอกเหนือจากการตั้งค่าสวิตช์หลักของแคชระดับที่สองใน SQLMAPCONFIG.XML แล้วแคชระดับที่สองจะต้องเปิดใช้งานใน mapper.xml เฉพาะ
เพิ่มไปยังไฟล์ core configuration sqlmapconfig.xml
<การตั้งค่าชื่อ = "cacheenabled" value = "true"/>
คำอธิบายค่าเริ่มต้นค่าเริ่มต้น
Cacheenabled การตั้งค่าเปิด/ปิดทั่วโลกสำหรับแคชทั้งหมดภายใต้ไฟล์กำหนดค่านี้ จริงหรือเท็จ
เปิดแคชรองใน usermapper.xml และการดำเนินการ SQL ภายใต้ usermapper.xml จะถูกเก็บไว้ในพื้นที่แคช (HashMap)
เรียกคลาส Pojo เพื่อใช้อินเตอร์เฟสอนุกรม
ในการแยกข้อมูลแคชการดำเนินการ deserialization จะดำเนินการเนื่องจากสื่อจัดเก็บข้อมูลแคชทุติยภูมิมีความหลากหลายและแตกต่างกันในหน่วยความจำ
การทดสอบแคชระดับ 2
@TestPublic เป็นโมฆะ testCache2 () พ่นข้อยกเว้น {SQLSession SQLSESSION1 = SQLSessionFactory.OpenSession (); SQLSESSION SQLSESSION2 = SQLSESSION.OPERSIONSISTION () SQLSESSION SQLSESSION3 = SQLSESSION sqlsession1.getMapper (usermapper.class); // เริ่มต้นคำขอแรกและสอบถามผู้ใช้ด้วยผู้ใช้ ID 1 ผู้ใช้ 1 = USERMAPPER1.FINDUNSERBYID (1); System.out.println (USER1); // ดำเนินการปิดที่นี่และเขียนข้อมูลใน SQLSession ดำเนินการ commit () การดำเนินการ usermapper usermapper3 = sqlsession3.getMapper (usermapper.class) ผู้ใช้ผู้ใช้ = usermapper3.finduserbyid (1); user.setuserName ("จาง mingming"); sqlsession3.Commit (); sqlsession3.close (); usermapper usermapper2 = sqlsession2.getMapper (usermapper.class); // ส่งคำขอที่สองเพื่อสอบถามผู้ใช้ด้วยผู้ใช้ ID 1 ผู้ใช้ 2 = usermapper2.finduserbyid (1);การกำหนดค่า usecache
การตั้งค่า USECACHE = FALSE ในคำสั่งสามารถปิดใช้งานแคชทุติยภูมิของคำสั่ง SELECT ปัจจุบันนั่นคือแต่ละแบบสอบถามจะออก SQL ไปยังแบบสอบถาม ค่าเริ่มต้นคือจริงนั่นคือ SQL ใช้แคชรอง
<select id = "finderNeRistResultMap" resultmap = "orderUserMap" usecache = "false">
สรุป: สำหรับแต่ละแบบสอบถามจำเป็นต้องใช้ข้อมูลล่าสุด SQL ตั้งค่าเป็น USECACHE = FALSE และปิดการใช้งานแคชรอง
รีเฟรชแคช
เพียงล้างแคช
ในเนมสเปซเดียวกันของ mapper หากมีการแทรกการอัปเดตหรือลบข้อมูลการทำงานอื่น ๆ แคชจะต้องรีเฟรชและหากแคชไม่ได้รีเฟรชการอ่านสกปรกจะเกิดขึ้น
ตั้งค่าคุณสมบัติ flushcache =” true” ในการกำหนดค่าคำสั่ง โดยค่าเริ่มต้นมันเป็นความจริงซึ่งหมายความว่าแคชจะถูกรีเฟรช หากมีการเปลี่ยนเป็นเท็จมันจะไม่รีเฟรช เมื่อใช้แคชการอ่านที่สกปรกจะเกิดขึ้นหากคุณแก้ไขข้อมูลการสืบค้นด้วยตนเองในตารางฐานข้อมูล
<insert id = "insertuser" parameterType = "cn.itcast.mybatis.po.user" flushcache = "true">>
สรุป: โดยทั่วไปหลังจากดำเนินการดำเนินการ commit แคชจะต้องได้รับการรีเฟรช FlushCache = True หมายถึงการรีเฟรชแคชซึ่งสามารถหลีกเลี่ยงการอ่านฐานข้อมูลที่สกปรก
การรวม mybatis ehcache
Ehcache เป็นกรอบการแคชแบบกระจาย
分布缓存
我们系统为了提高系统并发,性能、一般对系统进行分布式部署(集群部署方式)
不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。
mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合。
整合ehcache方法(掌握)
mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。
mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。
mybatis默认实现cache类是:
加入ehcache包
整合ehcache
配置mapper中cache中的type为ehcache对cache接口的实现类型。
加入ehcache的配置文件(在classpath下配置ehcache.xml)
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"><diskStore path="F:/develop/ehcache" /><defaultCache maxElementsInMemory="1000" maxElementsOnDisk="10000000"eternal="false" overflowToDisk="false" timeToIdleSeconds="120"timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"></defaultCache></ehcache>
属性说明:
diskStore:指定数据在磁盘中的存储位置。
defaultCache:当借助CacheManager.add(“demoCache”)创建Cache时,EhCache便会采用<defalutCache/>指定的的管理策略
以下属性是必须的:
maxElementsInMemory - 在内存中缓存的element的最大数目
maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大
eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
以下属性是可选的:
timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大
timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.
diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)
二级应用场景
对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。
二级缓存局限性
mybatis二级缓存对细粒度的数据级别的缓存实现不好,比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。