ในบทความข้างต้นเราได้ดำเนินการตามเมนู EasyUI เสร็จแล้ว คลิกที่นี่เพื่อดู ในส่วนนี้เราจะเขียนเกี่ยวกับคลาสการใช้งาน CategoryServiceImpl เป็นหลักเพื่อกรอกแบบสอบถามแบบเรียงซ้อนของฐานข้อมูล โดยทั่วไปโครงการจะทำจากด้านหลังไปด้านหน้าก่อนอื่นให้บริการ (เราไม่ได้แยก DAO และสกัดในที่สุด) จากนั้นทำชั้นบนหลังจากเสร็จสิ้น
ก่อนที่จะเขียนลองดูที่ตารางในฐานข้อมูล:
วางฐานข้อมูลหากมีร้านค้าอยู่ /*สร้างฐานข้อมูลและตั้งค่าการเข้ารหัส*/ สร้างฐานข้อมูลร้านค้าเริ่มต้นอักขระอักขระเริ่มต้น UTF8; ใช้ร้านค้า; /*ลบตารางผู้ดูแลระบบ*/ drop table หากมีบัญชี; /*ลบตารางหมวดหมู่ผลิตภัณฑ์*/ drop table หากมีหมวดหมู่; - - - - ชื่อผู้ดูแลระบบเข้าสู่ระบบ*/ ล็อกอิน VARCHAR (20),/*ชื่อผู้ดูแลระบบ*/ ชื่อ VARCHAR (20),/*รหัสผ่านของผู้ดูแลระบบ*/ ผ่าน VARCHAR (20)); - - - - เท็จ /* คีย์ต่างประเทศซึ่งผู้ดูแลระบบจัดการหมวดหมู่นี้* / account_id int, ข้อ จำกัด AID_FK คีย์ต่างประเทศ (Account_ID) บัญชีอ้างอิง (ID));
ส่วนใหญ่มีสองตารางคือตารางหมวดหมู่ผลิตภัณฑ์และตารางผู้ดูแลระบบและตารางผู้ดูแลระบบที่เกี่ยวข้องกับคีย์ต่างประเทศมีอยู่ในตารางหมวดหมู่ผลิตภัณฑ์ นั่นคือผลิตภัณฑ์และผู้ดูแลระบบมีความสัมพันธ์แบบหลายต่อหนึ่ง ตอนนี้เราเริ่มเขียนข้อมูลหมวดหมู่สำหรับการสอบถามผลิตภัณฑ์และเราต้องการผู้ดูแลระบบเรียงซ้อน
1. ใช้วิธีการสืบค้นแบบเรียงซ้อน
ก่อนอื่นกำหนดวิธีนี้ในหมวดหมู่อินเตอร์เฟส:
หมวดหมู่ส่วนต่อประสานสาธารณะขยาย Baseservice <หมวดหมู่> {// ข้อมูลหมวดหมู่การสืบค้น, การจัดเรียงรายชื่อผู้ดูแลระบบสาธารณะ // คำถามที่มีชื่อของหมวดหมู่} จากนั้นเราใช้วิธีนี้ในคลาสการใช้งานหมวดหมู่ eserviceimpl ของหมวดหมู่บริการ:
@Service ("CategoryService") คลาสสาธารณะ CategoryServiceImpl ขยาย BaseserviceImpl <หมวดหมู่> ใช้หมวดหมู่ Service {@Override รายการสาธารณะ <หมวดหมู่> queryJoInAccount (ประเภทสตริง) {String HQL = "จากหมวดหมู่ C return getSession (). createquery (HQL) .setstring ("type", "%" + type + "%"). list (); - ในบรรดาสองรุ่นเราจะกำหนดลิงค์ไปยังคำอธิบายประกอบ:
// @ManytoOne (fetch = fetchType.eager) @Joincolumn (name = "account_id") บัญชีสาธารณะ getAccount () {return this.account; } // @onetomany (cascade = cascadeType.all, fetch = fetchType.lazy, mappedby = "บัญชี") ชุดสาธารณะ <หมวดหมู่> getCategories () {ส่งคืนสิ่งนี้ - จากนั้นเราทดสอบในคลาสทดสอบ:
@runwith (springjunit4classrunner.class) @contextconfiguration (locations = "classpath: beans.xml") คลาสสาธารณะหมวดหมู่ serviceimpltest {@resource หมวดหมู่ส่วนตัวหมวดหมู่ @Test Public Void TestQueryJoInAccount () {สำหรับ (หมวดหมู่ C: categoryService.QueryJoinAccount ("")) {System.out.println (C); System.out.println (C.GetAccount ()); - 2. ปัญหาเกี่ยวกับการสืบค้นแบบเรียงซ้อน
หากเราดูผลลัพธ์ของคอนโซลเราจะเห็นว่ามันส่งคำสั่ง SQL มากกว่าหนึ่งคำสั่ง แต่เราได้สอบถามเพียงครั้งเดียวดังนั้นทำไมเราถึงส่งข้อความจำนวนมาก? นี่คือปัญหา 1+n ทั่วไป ปัญหาที่เรียกว่า 1+n คือการออกคำสั่งก่อนเพื่อสอบถามวัตถุปัจจุบันจากนั้นออกคำสั่ง n เพื่อสอบถามวัตถุที่เกี่ยวข้องดังนั้นประสิทธิภาพจึงต่ำมาก มีเพียงสองวัตถุที่นี่ หากมีวัตถุมากขึ้นประสิทธิภาพจะลดลงอย่างมาก เราควรแก้ปัญหานี้อย่างไร?
บางทีคุณอาจคิดว่าถ้าคุณตั้งค่าการดึงข้อมูลเพื่อสร้าง fetchType.lazy คุณจะไม่โพสต์ข้อความหลายข้อความ แต่นี่เป็นไปไม่ได้แน่นอนเพราะหลังจากตั้งค่าเป็นขี้เกียจเราไม่สามารถรับวัตถุบัญชีได้ ทางออกที่ดีกว่าคือการเขียนคำสั่ง HQL ด้วยตนเองและใช้การเข้าร่วม สำหรับรายละเอียดให้ดูที่คลาสการใช้งานหมวดหมู่ที่ได้รับการแก้ไข
@Service ("CategoryService") คลาสสาธารณะ categoryServiceImpl ขยาย BaseserviceImpl <หมวดหมู่> ใช้หมวดหมู่ {@Override รายการสาธารณะ <หมวดหมู่> queryJoInAccount (ประเภทสตริง) {String HQL = "จากหมวดหมู่ return getSession (). createquery (HQL) .setstring ("type", "%" + type + "%"). list (); - การเข้าร่วมด้านซ้ายหมายถึงการสืบค้นพร้อมกับบัญชีการดึงข้อมูลหมายถึงการเพิ่มวัตถุบัญชีลงในหมวดหมู่เพื่อให้มีการส่งคำสั่ง SQL เพียงใบเดียวและหมวดหมู่ที่ส่งคืนยังมีวัตถุบัญชี
3. ทำฟังก์ชั่นการเพจ
การปนเปื้อนในไฮเบอร์เนตนั้นง่ายมาก คุณจะต้องโทรสองวิธี SetFirStResult และ SetMaxResults: ลองแก้ไขอินเทอร์เฟซหมวดหมู่บริการและหมวดหมู่การใช้งานหมวดหมู่ ServiceImpl:
// CategoryService Interface Public CategoryService ขยาย Baseservice <หมวดหมู่> {// ข้อมูลหมวดหมู่การสืบค้น, การเรียงลำดับผู้ดูแลระบบรายชื่อสาธารณะ <หมวดหมู่> queryJoinAccount (ประเภทสตริง, หน้า int, ขนาด int); // และใช้ pagination} // categoryserviceimpl @Service ("categoryservice") คลาสสาธารณะหมวดหมู่ ServiceImpl ขยาย baseserviceimpl <หมวดหมู่> ใช้หมวดหมู่ {@override รายการสาธารณะ <หมวดหมู่> queryjoinaccount (ประเภทสตริง Return getSession (). createquery (hql) .setstring ("type", "%" + type + "%") .setfirstresult ((page-1) * ขนาด) // show .setMaxResults (ขนาด) // แสดงหลาย. - ลองทดสอบในคลาสทดสอบ:
@runwith (springjunit4classrunner.class) @contextconfiguration (locations = "classpath: beans.xml") คลาสสาธารณะหมวดหมู่ serviceimpltest {@resource หมวดหมู่ส่วนตัวหมวดหมู่ @Test Public Void TestQueryJoInAccount () {สำหรับ (หมวดหมู่ C: categoryService.QueryJoInAccount ("", 1,2)) {// แสดงหน้าแรก 2 ชิ้นข้อมูลต่อหน้า System.out.println (C + "," - ด้วยเหตุนี้เราจึงเขียนวิธีการบริการเสร็จแล้วและเสร็จสิ้นฟังก์ชั่นการสืบค้นและการเพจของหมวดหมู่ผลิตภัณฑ์
(หมายเหตุ: ในที่สุดฉันจะให้การดาวน์โหลดซอร์สโค้ดของโครงการทั้งหมด! ทุกคนยินดีที่จะรวบรวมหรือแบ่งปัน)
ที่อยู่ดั้งเดิม: http://blog.csdn.net/eson_15/article/details/51320212
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น