คำนำ
เมื่อตารางมีส่วนร่วมในการพัฒนาเว็บเช่น DataTable ความต้องการการเพจจะเกิดขึ้น โดยปกติแล้วเราจะแบ่งวิธีการเพจออกเป็นสองประเภท: การเพจ front-end และการเพจแบ็คเอนด์
การแบ่งหน้า
บันทึกทั้งหมด (AJAX) ในตารางข้อมูลได้รับการร้องขอในครั้งเดียวจากนั้นแคชที่ปลายด้านหน้าและการนับจำนวนและตรรกะการเพจ โดยทั่วไปส่วนประกอบส่วนหน้า (เช่น DataTable) จะให้การดำเนินการเพจ
คุณสมบัติคือ: ง่ายเหมาะมากสำหรับแพลตฟอร์มเว็บขนาดเล็ก ปัญหาด้านประสิทธิภาพจะเกิดขึ้นเมื่อปริมาณข้อมูลมีขนาดใหญ่และเวลาสำหรับการสืบค้นและการส่งเครือข่ายจะยาว
การปนเปื้อนแบ็กเอนด์
ระบุหมายเลขหน้า (pagenum) และขนาดของแต่ละหน้า (pagesize) ในคำขอ AJAX แบ็กเอนด์สอบถามข้อมูลของหน้าและส่งคืนและส่วนหน้ามีส่วนรับผิดชอบเฉพาะการแสดงผล
คุณสมบัติคือ: ซับซ้อนมากขึ้น; คอขวดประสิทธิภาพอยู่ในประสิทธิภาพการค้นหาของ MySQL ซึ่งแน่นอนว่าสามารถปรับให้เหมาะสมและแก้ไขได้ โดยทั่วไปการพัฒนาเว็บใช้วิธีนี้
เรากำลังพูดถึงการพลิกกลับแบ็กเอนด์
การสนับสนุน MySQL สำหรับการปนเปื้อน
พูดง่ายๆคือ MySQL รองรับการปนเปื้อนผ่านข้อ จำกัด โปรดดูตัวอย่างด้านล่าง
การใช้คำหลักขีด จำกัด คือ
จำกัด [ออฟเซ็ต] แถว
ออฟเซ็ตเป็นออฟเซ็ตที่สัมพันธ์กับแถวแรก (แถวแรกคือ 0) และแถวคือจำนวนแถว
# แต่ละหน้ามี 10 ระเบียนใช้หน้าแรกและส่งคืน 10 บันทึกแรกเลือก * จาก Tablea Limit 0,10;# แต่ละหน้ามี 10 ระเบียนใช้หน้าสองและส่งคืนบันทึกที่ 11 ไปยังระเบียนที่ 20 เลือก * จาก Tablea Limit 10,10;
สิ่งที่ฉันต้องการพูดถึงที่นี่คือเมื่อ MySQL จัดการการแบ่งหน้า:
จำกัด 1,000,10 - กรองข้อมูล 1010 ชิ้นจากนั้นทิ้ง 1,000 ชิ้นแรกและเก็บ 10 ชิ้น เมื่อชดเชยมีขนาดใหญ่ประสิทธิภาพจะลดลง
จำกัด 100000,10 - จะกรองข้อมูล 10W+10 ชิ้นจากนั้นทิ้งชิ้น 10W ชิ้นแรก หากคุณพบปัญหาด้านประสิทธิภาพในการปนเปื้อนคุณสามารถปรับได้ตามความคิดนี้
ปลั๊กอิน MyBatis Paging PageHelper
เมื่อใช้การพัฒนา Java Spring MyBatis เป็นเครื่องมือที่ทรงพลังสำหรับการดำเนินการฐานข้อมูล อย่างไรก็ตามเมื่อต้องรับมือกับการเพจ Mybatis ไม่มีวิธีการพิเศษใด ๆ โดยทั่วไปคุณต้องเขียนประโยคขีด จำกัด ด้วยตัวเองเพื่อนำไปใช้ซึ่งค่อนข้างแพง โชคดีที่มีปลั๊กอิน PageHelper
1. การพึ่งพาปอม
ฉันจะไม่พูดถึงการกำหนดค่าของ mybatis การพึ่งพาของ PageHelper มีดังนี้ หากคุณต้องการเวอร์ชันใหม่คุณสามารถเลือก Maven ได้
<Ederency> <sderctId> com.github.pageHelper </groupId> <ratifactId> PageHelper </artifactId> <cersion> 4.1.4 </version> </dependency>
2. การกำหนดค่า mybatis ของ pagehelper
เปิดไฟล์การกำหนดค่า MyBatis โดยปกติจะอยู่ภายใต้เส้นทางทรัพยากร ฉันชื่อ mybatis-config.xml
<? XML เวอร์ชัน = "1.0" การเข้ารหัส = "UTF-8"?> <! การกำหนดค่า doctype สาธารณะ "-// mybatis.org//dtd config 3.0 // en" "http://mybatis.org/dtd/mybatis-3-config.dtd"> Mapper เปิดใช้งานหรือปิดการใช้งานแคช -> <การตั้งค่าชื่อ = "cacheenabled" value = "true"/> <!-เปิดใช้งานหรือปิดใช้งานการโหลดขี้เกียจทั่วโลก เมื่อปิดใช้งานวัตถุที่เกี่ยวข้องทั้งหมดจะถูกโหลดทันที -> <การตั้งค่าชื่อ = "lazyloadingenabled" value = "true"/> <!-เมื่อเปิดใช้งานวัตถุที่มีคุณสมบัติการโหลดขี้เกียจจะโหลดคุณสมบัติใด ๆ อย่างสมบูรณ์เมื่อเรียกว่า มิฉะนั้นคุณสมบัติแต่ละคุณสมบัติจะถูกโหลดตามต้องการ -> <การตั้งค่าชื่อ = "aggressivelazyloading" value = "true"/> <!-ไม่ว่าจะอนุญาตให้ SQL เดี่ยวส่งคืนชุดข้อมูลหลายชุด (ขึ้นอยู่กับความเข้ากันได้ของไดรเวอร์) ค่าเริ่มต้น: จริง-> <การตั้งค่าชื่อ = "multipleSultSeTsenabled" true "/> <! name = "usecolumnlabel" value = "true"/> <!- อนุญาตให้ JDBC สร้างคีย์หลัก จำเป็นต้องมีการสนับสนุนไดรฟ์ หากตั้งค่าเป็นจริงการตั้งค่านี้จะบังคับให้คีย์หลักที่สร้างขึ้นไดรฟ์บางตัวไม่เข้ากัน แต่ยังสามารถดำเนินการได้ ค่าเริ่มต้น: false-> <การตั้งค่าชื่อ = "useGeneratedKeys" value = "true"/> <!-ระบุว่า mybatis แมปคอลัมน์ของตารางฐานข้อมูลโดยอัตโนมัติไม่มี: ไม่ปิดบังบางส่วน: ส่วนเต็ม: ทั้งหมด-> <การตั้งค่าชื่อ = "AutomappingBeHavior" คำสั่งและการอัปเดตแบบแบตช์)-> <การตั้งค่าชื่อ = "defaultExecutortype" value = "simple"/> <!-แปลงฟิลด์โดยใช้ Camel NeMenclature -> <การตั้งค่าชื่อ = "mapunderscoretocamelcase" value = "true"/> <!-การตั้งค่าช่วงแคชในพื้นที่: จะมีคำสั่งการแบ่งปันข้อมูล: ขอบเขตคำสั่ง (นี่จะไม่เป็นการแชร์ข้อมูล) defalut: เซสชัน-> <การตั้งค่าชื่อ = พิมพ์เมื่อใส่ค่า null -> <การตั้งค่าชื่อ = "jdbcTypeforNull" value = "null"/> </การตั้งค่า> <plugins> <ปลั๊กอิน interceptor = "com.github.pagehelper.pageHelper"> <property name = "Dialect" value = "mysql"/> name = "rowboundswithcount" value = "false"/> <property name = "pageSizezero" value = "true"/> <property name = "ordinable" value = "false"/> <property name = "SupportMethodSarguments" value = "false"/> <property name = "returnPage
สิ่งที่คุณต้องให้ความสนใจที่นี่คือการกำหนดค่าที่เกี่ยวข้องกับ PageHelper
หากคุณไม่โหลดไฟล์การกำหนดค่า MyBatis คุณจะใช้การกำหนดค่าเริ่มต้น MyBatis วิธีโหลดไฟล์การกำหนดค่า mybatis?
ไปที่การกำหนดค่า DataSrouce ของคุณ
เมื่อกำหนดค่า SQLSessionFactory ให้ระบุไฟล์การกำหนดค่า MyBatis Core และพา ธ Mapper รหัสมีดังนี้
@bean (name = "moonlightsqlsessionfactory") @primary สาธารณะ sqlsessionfactory moonlightsqlsessionfactory (@qualifier ("moonlightdata") DataSource DataSource) โยนข้อยกเว้น Bean.setDatasource (แหล่งข้อมูล); Bean.setMapperLocations (PathMatchingResourcePatternResolver (). getResources ("classpath: mybatis-mapper/*. xml")); Bean.setConfigLocation (ใหม่ classpathresource ("mybatis-config.xml")); กลับ bean.getObject (); -ภาพประกอบ:
เส้นทางการจัดเก็บ mapper.xml ที่กำหนดค่าไว้ที่นี่อยู่ในโฟลเดอร์ทรัพยากร/mybatis-mapper
ไฟล์ mybatis-config.xml ที่กำหนดค่าไว้ที่นี่อยู่ภายใต้ทรัพยากร/
3. การปนเปื้อน
เตรียม mapper.xml เพียงเขียนหนึ่งสำหรับการทดสอบเพียงใช้หนึ่งจากโครงการ
แบบสอบถามนี้นี่เป็นแบบสอบถามหลายเงื่อนไขทั่วไป สิ่งที่เราต้องทำคือการทำให้บันทึกที่จับคู่กับหลายเงื่อนไข
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <! doctype mapper สาธารณะ "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd namespace = "com.kangaroo.studio.moonlight.dao.mapper.moonlightmapper"> <resultmap id = "geofencelist" type = "com.kangaroo.studio.moonlight.dao.model.geofence" jdbcType = "จำนวนเต็ม" /> <arg column = "name" javatype = "java.lang.string" jdbctype = "varchar" /> <arg column = "type" javatype = "java.lang.integer jdbcType = "varchar" /> <arg column = "geo" javatype = "java.lang.string" jdbctype = "varchar" /> <arg column = "createTime" javatype = "java.lang.string javatype = "java.lang.string" jdbcType = "varchar"/> </constructor> </resultmap> <sql id = "base_column"> id, ชื่อ, ประเภท, `กลุ่ม, geo, createTime, updateTime </sql> parameterType = "com.kangaroo.studio.moonlight.dao.model.geofenceQueryParam" resultmap = "geofencelist"> เลือก <รวม refid = "base_column"/> จาก geofence ที่ 1 = 1 <ถ้าทดสอบ = "ประเภท! = null" concat ('%', #{name}, '%') </ถ้า> <ถ้า test = "group! = null"> และ `group` ชอบ concat ('%', #{group}, '%') </ถ้า> <ถ้าทดสอบ =" เริ่มต้น " </if> </select> </mapper>เขียนวิธีการที่สอดคล้องกันในอินเทอร์เฟซ mapper.java
รายการ <eofence> QuerygeOfence (GeofenceQueryParam GeofenceQueryParam);
ก่อนอื่นเพิ่มรหัสหน้าแล้วอธิบายในภายหลัง
@RequestMapping (value = "/Fence/Query", method = requestMethod.post) @ResponseBody การตอบสนองสาธารณะ QueryFence (@requestbody geofenceQueryParam geofenceQueryParam) {ลอง {integer pagenum. จำนวนเต็ม pageSize = geofenceQueryParam.getPagesize ()! = null? geofenceQueryParam.getPagesize (): 10; pagehelper.startpage (pagenum, pagesize); รายการ <eofence> list = moonlightmapper.querygeOfence (GeofenceQueryParam); ส่งคืนการตอบกลับใหม่ (ResultCode.Success, "Query Geofence Success", รายการ); } catch (exception e) {logger.error ("Query Geofence ล้มเหลว", e); ส่งคืนการตอบกลับใหม่ (ResultCode.Exception, "Query Geofence ล้มเหลว", null); -ภาพประกอบ:
1. ข้อดีของ PageHelper คือการแบ่งหน้าและ mapper.xml ถูกแยกออกอย่างสมบูรณ์ วิธีการใช้งานคือการเสริมสร้างกระบวนการดำเนินการ MyBatis ในรูปแบบของปลั๊กอินเพิ่มจำนวนการค้นหาและ จำกัด ทั้งหมด เป็นของหน้ากายภาพ
2. มีปัญหาด้านความปลอดภัยที่คุณต้องให้ความสนใจมิฉะนั้นอาจนำไปสู่ความผิดปกติของการเพจ ฉันได้วางข้อความจากบล็อกนี้โดยตรงที่นี่
4. มันจะนำไปสู่การเพจที่ไม่ปลอดภัยเมื่อใด
วิธีการ PageHelper ใช้พารามิเตอร์ threadlocal แบบคงที่และพารามิเตอร์การเพจและเธรดจะถูกผูกไว้
ตราบใดที่คุณสามารถมั่นใจได้ว่าวิธีการ PageHelper นั้นถูกเรียกทันทีตามด้วยวิธีการสืบค้น MyBatis นั้นปลอดภัย เพราะ PageHelper จะล้างวัตถุที่เก็บไว้ใน ThreadLocal โดยอัตโนมัติในตัวอย่างล่าสุด
หากมีข้อยกเว้นเกิดขึ้นก่อนที่จะป้อนผู้บริหารเธรดจะไม่สามารถใช้งานได้ซึ่งเป็นข้อผิดพลาดของมนุษย์ (เช่นไม่ตรงกันระหว่างวิธีการเชื่อมต่อกับ XML ซึ่งจะนำไปสู่การแม็พสเตตไม่พบ) สถานการณ์นี้จะไม่ทำให้พารามิเตอร์ ThreadLocal ใช้อย่างไม่ถูกต้องเนื่องจากความไม่พร้อมใช้งานของเธรด
แต่ถ้าคุณเขียนรหัสต่อไปนี้มันเป็นการใช้งานที่ไม่ปลอดภัย:
PageHelper.StartPage (1, 10); รายการ <ประเทศ> รายการ; ถ้า (param1! = null) {list = countrymapper.selectif (param1);} else {list = new ArrayList <ประเทศ> ();};ในกรณีนี้เนื่องจาก Param1 มี NULL, PageHelper จะสร้างพารามิเตอร์เพจ แต่ไม่ได้ใช้งานและพารามิเตอร์นี้จะยังคงอยู่ในเธรดนี้ เมื่อมีการใช้เธรดนี้อีกครั้งอาจทำให้เกิดวิธีการที่ไม่ควรเพจเพื่อใช้พารามิเตอร์เพจเพจซึ่งส่งผลให้เกิดการเพจที่อธิบายไม่ได้
รหัสข้างต้นควรเขียนดังนี้:
รายการ <ประเทศ> รายการ; ถ้า (param1! = null) {pageHelper.startPage (1, 10); list = countrymapper.selectif (param1);} else {list = new ArrayList <ประเทศ> ();}วิธีการเขียนนี้สามารถรับประกันความปลอดภัย
หากคุณไม่สบายใจกับสิ่งนี้คุณสามารถทำความสะอาดพารามิเตอร์การเพจที่เก็บไว้ใน ThreadLocal ซึ่งสามารถใช้เช่นนี้ได้:
รายการ <ประเทศ> รายการ; ถ้า (param1! = null) {pageHelper.startPage (1, 10); ลอง {list = countrymapper.selectall (); } ในที่สุด {PageHelper.ClearPage (); }} else {list = new ArrayList <ประเทศ> ();}การเขียนแบบนี้ไม่ดีและไม่จำเป็น
สรุป
ด้านบนเป็นวิธีการกำหนดค่าและวิธีการใช้งานง่าย ๆ ของปลั๊กอิน MyBatis Paging Page Helper แนะนำให้คุณรู้จักโดยตัวแก้ไข (แนะนำ) ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!