ในตอนต้นของโครงการฉันต้องใช้ MyBatis Paging ฉันอ่านปลั๊กอินออนไลน์จำนวนมาก ในความเป็นจริงหลักการดำเนินงานนั้นเหมือนกัน แต่ส่วนใหญ่ให้รหัสและมีคำอธิบายประกอบที่ไม่สมบูรณ์ ดังนั้นฉันจึงอ้างถึงบทความจำนวนมาก (แต่ละบทความขโมยรหัสเล็กน้อยประเมินของตัวเองและกึ่ง plagiarizes มัน) จากนั้นฉันเลียนแบบและเขียนปลั๊กอินเพจเหมาะสำหรับโครงการของฉัน หากไม่มีความกังวลใจเพิ่มเติมฉันเพิ่งอัปโหลดรหัส เมื่อเทียบกับบทความส่วนใหญ่คำอธิบายประกอบจะสมบูรณ์มาก
interceptor ที่สำคัญที่สุด
แพ็คเกจ com.dnkx.interceptor; นำเข้า Java.sql.*; นำเข้า java.util.hashmap; นำเข้า java.util.properties; นำเข้า org.apache.ibatis.executor.resultset.resultsethandler; นำเข้า org.apache.ibatis.executor.statement.statementhandler; นำเข้า org.apache.ibatis.mapping.boundsql; นำเข้า org.apache.ibatis.mapping.mappedstatement; นำเข้า org.apache.ibatis.plugin.interceptor; นำเข้า org.apache.ibatis.plugin.intercepts; นำเข้า org.apache.ibatis.plugin.invocation; นำเข้า org.apache.ibatis.plugin.plugin; นำเข้า org.apache.ibatis.plugin.signature; นำเข้า org.apache.ibatis.reflection.metaobject; นำเข้า org.apache.ibatis.reflection.systemmetaobject; นำเข้า com.dnkx.pojo.page; /** * * interceptor การปนเปื้อนใช้เพื่อสกัดกั้นการดำเนินการที่ต้องใช้การสืบค้นเพจและจากนั้นทำให้พวกเขา * หลักการของ MyBatis Paging ถูกนำมาใช้โดยใช้ interceptors: * เพื่อใช้ JDBC เพื่อใช้งานในฐานข้อมูลคุณต้องมีวัตถุคำสั่งที่สอดคล้องกัน ก่อนที่ MyBatis จะดำเนินการคำสั่ง SQL มันจะสร้างวัตถุคำสั่งที่มีคำสั่ง SQL และคำสั่ง SQL ที่เกี่ยวข้อง* จะถูกสร้างขึ้นก่อนคำสั่งดังนั้นเราจึงสามารถเริ่มต้นด้วยคำสั่ง SQL ที่ใช้ในการสร้างคำสั่งก่อนที่จะสร้างคำสั่ง ในคำสั่ง MyBatis ถูกสร้างขึ้นโดย * วิธีการเตรียมของวัตถุ RoutingStatementHandler ดังนั้นหนึ่งในแนวคิดสำหรับการใช้ตัวดักจับเพื่อใช้ MyBatis paging คือการสกัดกั้นวิธีการเตรียมของอินเทอร์เฟซ attementhandler จากนั้นเปลี่ยนคำสั่ง SQL เป็นคำสั่ง sql การสืบค้น pagination ที่สอดคล้องกันในวิธีการสกัดกั้นแล้วเรียกใช้วิธีการเตรียมของวัตถุคำสั่ง * * สำหรับการปนเปื้อนหนึ่งในการดำเนินการที่เราต้องทำในตัวดักคือการนับจำนวนบันทึกทั้งหมดที่ตรงกับเงื่อนไขปัจจุบัน นี่คือการได้รับคำสั่ง SQL ดั้งเดิมเปลี่ยนเป็นคำสั่งทางสถิติที่สอดคล้องกันจากนั้นแทนที่พารามิเตอร์ในคำสั่ง SQL โดยใช้พารามิเตอร์ myBatis encapsulated และพารามิเตอร์ * การตั้งค่า * จากนั้นคำสั่ง SQL จะทำการสืบค้นจำนวนระเบียนจะถูกดำเนินการเพื่อนับจำนวนระเบียนทั้งหมด ** อธิบายหลายคลาสที่อาจใช้ในปลั๊กอิน:* MetaObject: คลาสที่จัดทำโดย mybatis ตามวัตถุที่ส่งคืนค่าคุณสมบัติ* boundsql: ในนี้คุณสามารถใช้ SQL ได้และพารามิเตอร์ที่ใช้งาน SQL MyBatis Memory Memage Paging * ParameterHandler: มันถูกใช้ใน MyBatis เพื่อแทนที่ค่าที่ปรากฏใน SQL * * @author li xiaogui 9 พฤศจิกายน 2016 10:59:04 */ @intercepts ({@signature (type = stementhandler.class, method = "เตรียม", args = {connection.class}), @signature interceptor {// สกัดกั้นคีย์เวิร์ด Paging Private Private Static Final String select_id = "Page"; // รหัสที่รันโดยปลั๊กอินจะแทนที่วิธีดั้งเดิมและเขียนใหม่การสกัดกั้นวัตถุสาธารณะที่สำคัญที่สุด @Override (การเรียกร้องการเรียกร้อง) พ่นที่ throwable {ถ้า (invocation.getTarget () อินสแตนซ์ของคำสั่ง handler) {// ที่นี่เรามีการตั้งค่า metaobject metaobject = systemmetaobject.forobject (stementhandler); MappedStatement MappedStatement = (MappedStatement) MetaObject.getValue ("Delegate.mappedStatement"); String selectId = mappedStatement.getId (); String methodName = selectId.substring (selectId.AlastIndexof (".")+1) .toLowerCase (); // จากนั้นตัดสินหากรวมหน้ารับ SQL ถ้า (methorname.contains (select_id)) {boundsql boundsql = (boundsql) metaobject.getValue ("delegate.boundsql"); // พารามิเตอร์ pagination เป็นคุณสมบัติของพารามิเตอร์พารามิเตอร์พารามิเตอร์สตริง sql = boundsql.getsql (); System.out.println ("รับ SQL:"+SQL); hashmap <string, object> map = (hashmap <string, object>) (boundsql.getParameterObject ()); // หน้าหน้า = (หน้า) (boundsql.getParameterObject ()); หน้าหน้า = (หน้า) map.get ("หน้า"); // rewrite SQL สตริง countsql = concatCountSql (SQL); String PagesQl = concatPagesQl (sql, page); // system.out.println ("เขียนซ้ำ SQL:"+countsql); System.out.println ("rewrite เลือก SQL:"+pageSQL); การเชื่อมต่อการเชื่อมต่อ = (การเชื่อมต่อ) ravecocation.getArgs () [0]; PreparedStatement CountStmt = NULL; ผลลัพธ์ RS = NULL; int totalCount = 0; ลอง {countStmt = connection.prepareStatement (countsql); rs = countstmt.executeQuery (); if (rs.next ()) {totalCount = rs.getInt (1); }} catch (sqlexception e) {system.out.println ("ละเว้นข้อยกเว้นนี้"+e); } ในที่สุด {ลอง {rs.close (); countstmt.close (); } catch (sqlexception e) {system.out.println ("ละเว้นข้อยกเว้นนี้"+e); }} metaobject.setValue ("delegate.boundsql.sql", pagesql); // bind count page.setNumCount (TotalCount); }} return invocation.proceed (); } // สกัดกั้นประเภทคำสั่ง handler, แทนที่เมธอดปลั๊กอิน @Override ปลั๊กอินวัตถุสาธารณะ (เป้าหมายวัตถุ) {ถ้า (เป้าหมายอินสแตนซ์ของคำสั่ง handler) {return plugin.wrap (เป้าหมาย, สิ่งนี้); } else {return target; }} @Override โมฆะสาธารณะ setProperties (คุณสมบัติคุณสมบัติ) {} // ปรับปรุง SQL Public String concatCountSql (String SQL) {// StringBuffer SB = new StringBuffer ("SELECT (*) จาก"); /*SQL=SQL.TOLOWERCASE (); if (sql.lastindexof ("order")> sql.lastindexof (")")) {sb.append (sql.substring (sql.indexof ("จาก")+4, sql.lastindexof ("คำสั่งซื้อ")); } else {sb.append (sql.substring (sql.indexof ("จาก")+4)); }*/ stringbuffer sb = new StringBuffer (); sql = sql.toLowercase (); if (sql.lastindexof ("order")> 0) {sql = sql.substring (0, sql.indexof ("order")); } sb.append ("เลือกนับ (*) จาก ("+sql+") tmp"); ส่งคืน sb.toString (); } สตริงสาธารณะ concatPagesQl (สตริง SQL, หน้าหน้า) {StringBuffer SB = new StringBuffer (); SB.Append (SQL); sb.append ("จำกัด ") .append (page.getPageBegin ()). ผนวก (",") .append (page.getPagesize ()); ส่งคืน sb.toString (); }} คลาสหน้า [java] ดู plain copypackage com.dnkx.pojo; นำเข้า java.util.hashmap; นำเข้า java.util.map; / ** * * การสืบค้นคลาสเสริมคลาส * @author li xiaogui 9 พฤศจิกายน 2016 13:55:37 */ หน้าชั้นเรียนสาธารณะ { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- pageBegin; // เริ่มตำแหน่งส่วนตัว int int numcount; // จำนวนรวมของ int pagetotal ส่วนตัว; // จำนวนรวมของสตริงส่วนตัว orderfield = ""; // ควบคุมการสั่งซื้อสตริงส่วนตัวที่แสดงบนหน้าการเรียงลำดับ = ""; หน้าสาธารณะ () {} หน้าสาธารณะ (int pagesize, int pageCurrentPage) {super (); this.pageize = pageSize; this.pagecurrentPage = pageCurrentPage; } หน้าสาธารณะ (แผนที่ <สตริง, สตริง> แผนที่) {ถ้า (map.get ("pagenum")! = null) {this.setPagecurrentPage (this.pageCurrentPage = integer.parseint (map.get ("pagenum")); if (map.get ("numperPage")! = null) {this.setPagesize (integer.parseint (map.get ("numperpage"))); // จำนวนของรายการที่แสดงต่อหน้า} else {this.setPagesize (5); // ตั้งค่าเริ่มต้น} } if (map.get ("OrderDirection")! = null) {this.setOrderDirection (map.get ("OrderDirection")); }} สาธารณะ int getPageCurrentPage () {return pageCurrentPage; } โมฆะสาธารณะ setPageCurrentPage (int pageCurrentPage) {this.pageCurrentPage = pageCurrentPage; } สาธารณะ int getNumCount () {return numCount; } โมฆะสาธารณะ setNumCount (int numCount) {this.numCount = numCount; } public int getPagetotal () {return (numCount%pagesize> 0)? (numCount/pagesize+1) :( numCount/pageSize); } โมฆะสาธารณะ setPagetotal (int pagetotal) {this.pagetotal = pagetotal; } public int getPagesize () {กลับ pageSize; } โมฆะสาธารณะ setPagesize (int pageize) {this.page.ize = pageSize; } public int getPageBegin () {return pagesize*(pageCurrentPage-1); } โมฆะสาธารณะ setPageBegin (int pageBegin) {this.pageBegin = pageBegin; } สตริงสาธารณะ getOrderField () {return orderfield; } โมฆะสาธารณะ setOrderField (String orderfield) {this.orderfield = orderfield; } public String getOrderDirection () {return orderdirection; } โมฆะสาธารณะ setOrderDirection (String OrderDirection) {this.orderDirection = OrderDirection; } หน้าสาธารณะคงที่ getPage (int pageize, int pageCurrentPage) {ส่งคืนหน้าใหม่ (หน้าหน้า, pageCurrentPage); } หน้าคงที่สาธารณะ getPage (แผนที่แผนที่) {ส่งคืนหน้าใหม่ (แผนที่); -วิธีการโทรในคอนโทรลเลอร์
รายการสตริงสาธารณะ (คำขอ httpservletRequest) {long a = system.currentTimeMillis (); hashmap <string, object> map = getRequestMap.getMap (คำขอ); // ห่อหุ้มวิธีการด้วยตัวคุณเองใช้พารามิเตอร์ของหน้าคำขอ = page.getPage (แผนที่); // เริ่มต้นแผนที่หน้า ("หน้า", หน้า); // ใส่หน้าวัตถุลงในชุดพารามิเตอร์ map.put (map.get ("orderfield")+"", map.get ("orderdirection")); รายการ <Spop อยู่> list = stuperilyervice.getListPage (MAP); request.setAttribute ("emlist", รายการ); request.setAttribute ("หน้า" หน้า); request.setAttribute ("แผนที่", แผนที่); // รับหน้าแอตทริบิวต์ที่เกี่ยวข้องหน้า GetNumCount (); // จำนวนหน้าทั้งหมดหน้า. getPagetotal (); // จำนวนทั้งหมดของหน้ายาว b = system.currenttimeMillis (); System.out.println ("-------------- การใช้เวลานาน:"+(ba)+"MS"); ส่งคืน "พื้นฐาน/พนักงาน _List"; -ในที่สุดกำหนดค่าปลั๊กอินในฤดูใบไม้ผลิ
<bean id = "PageInterclector"> </ebean> <!-Spring และ MyBatis ถูกรวมเข้าด้วยกันอย่างสมบูรณ์แบบและไม่จำเป็นต้องใช้ไฟล์การแมปการกำหนดค่า myBatis-> <bean id = "SQLSessionFactory"> <property name = "dataSource" ref = "DataSource" /> <! value = "classpath: com/dnkx/mapping/*. xml"> </คุณสมบัติ> <property name = "ปลั๊กอิน"> <ref bean = "PageInterclect
ตกลงนั่นคือจุดจบบทความนี้มีไว้สำหรับการอ้างอิงเท่านั้น! รอคอยคำแนะนำของพระเจ้าที่ยิ่งใหญ่