Mybatis Pagination 진입 점
mybatis에는 플러그인 (플러그인) 개념이 있으며, 이는 본질적으로 인터셉터 아이디어입니다. 특정 분석은 다른 기사에서 Mybatis 인터셉터의 원리에 관한 연구에서 찾을 수 있습니다. 이를 바탕 으로이 기사는 실제 프로젝트의 구현 코드 및 기타 관련 분석을 직접 표시합니다.
특정 코드 구현 페이징
먼저 방언 초록 클래스를 정의하여 Paglination AbstractDialect.java를 구현할 수 있습니다.
공개 초록 클래스 AbstractDialect { / *** 제한 및 오프셋이 지원되는지* @return* / public acploplimitoffset (); / ** * 제한이 지원되는지 * @return */ public Abstract Boolean supportLimit (); / ** * 페이징 속성을 추가 한 후 SQL을 얻습니다 * @param sql * @param 오프셋 * @param limit * @return */ public acpract string getLimitstring (String SQL, Int Offset, Int Limit);}}또한 Oracle 및 MySQL 데이터베이스의 페이지 페이징 기술을 별도로 구현할 것입니다.
mysqldialect.java-mysql 페이지 매김 방언
public class mysqldialect 확장 actractDialect {public boolean supportSlimitOffset () {return true; } public boolean supportSlimit () {return true; } public String getLimitstring (String SQL, int Offset, int Limit) {if (Offset> 0) {return SQL + "Limit" + Offset + "," + Limit; } else {return sql + "Limit" + Limit; }}}oracledialect.java-oracle 방언 구현
공개 클래스 oracledialect는 adialect {@override public boolean supportlimitoffset () {return false; } @override public boolean supportLimit () {return false; } @override public String getLimitstring (String SQL, int start, int limit) {if (start <0) {start = 0; } if (limit <0) {limit = 10; } StringBuilder pagesql = new StringBuilder (100); pagesql.append ( "select * from (select temp. *, rownum row_id from ("); pagesql.append (sql); pagesql.append ( ") 임시 rownum <=") .append (start+limit); pagesql.append ( ")) 반환 pagesql.tostring (); }}해당 MyBatis 플러그인 인터셉터 구현은 다음과 같습니다. intercept stateHandler#sql statement 객체 메소드를 생성하기 위해 repay (Connection con)
Pagination Interceptor.java
@InterCepts ({@Signature (type = stationHandler.class, method = "repary", args = {connection.class}})) 공개 최종 클래스 PAGINATION INTERCEPTOR INCEPTOR {private final static logger log = loggerFactory .getLogger (Pagination Interceptor.Class); 개인 adialect 방언; public void setDialect (Adialect Dialect) {this.dialect = dialect; } @override public Object Intercept (호출 호출) 던지기 가능 {// 인터셉트 된 객체를 직접 얻는다. BONDSQL BONDSQL = StateHandler.getBoundSql (); // metaobject를 가져옵니다. MAPPEDSTATEMENT MAPPEDSTMT = (MAPPEDSTATEMENT) MECASTATEMENTHANDLER .getValue ( "Delegate.MappedStatement".intern ()); // queryPagination () 메소드 if (mappedStmt.getId (). indexof ( "QueryPagination") == -1) {return invocation.proceed (); } // 페이징 SQL String Or metastatementHandler.setValue ( "delegate.boundsql.sql".intern (), dialect .getLimitstring (OriginalSql, rowBounds.getOffset (), rowBounds.getLimit ())); metastatementhandler.setValue ( "delegate.rowbounds.offset".intern (), rowbounds.no_row_offset); metastatementHandler.setValue ( "delegate.rowbounds.limit".intern (), rowbounds.no_row_limit); log.debug ( "page sql :" + boundsql.getSql ()); return invocation.proceed (); } // object @Override public Object Plugin (Object Target) {return plugin.wrap (target, this); } @override public void setProperties (속성 속성) {}}스프링의 해당 XML 구성은 다음과 같습니다.
<!-Oracle Pagination에 사용되는 Oracle Dialect 구성-> <Bean id = "Pagination Interceptor"> <property name = "dialect"> <bean/> </property> </bean>
위의 코드 및 구성을 사용하여 Oracle 데이터베이스 및 MySQL 데이터베이스의 페이지 매김 작업을 완료하십시오. 그리고 블로거는 요점 중 하나를 분석합니다
mybatis#metaobject-metadata 객체 분석
블로거가 위의 코드를 사용했을 때, 그는 메타 오브젝트 클래스에 당황했습니다. getValue () 메소드를 통해 프록시되는 객체의 모든 관련 특성을 직접 얻을 수 있습니다. 우리는 소스 코드를 따라 자세한 내용을 배울 수 있습니다
MetaObject#forObject()
모든 프록시 객체는이 정적 방법을 통해 들어갑니다
공개 정적 메타 브리저 orobject (Object Object, ObjectFactory ObjectFactory, ObjectWrapperFactory ObjectWrapperFactory) {if (Object == NULL) {return SystemMetaObject.null_meta_object; } else {return new MetaObject (개체, ObjectFactory, ObjectWrapperFactory); }}우리는 생성자를 직접 관찰 할 수 있습니다. 여기에 미스터리가 있습니다
개인 메타 버젝트 (Object Object, ObjectFactory ObjectFactory, ObjectWrapperFactory ObjectWrapperFactory) {this.originalObject = Object; this.ObjectFactory = ObjectFactory; this.ObjectWrapperFactory = ObjectWrapperFactory; // 모든 속성 획득은 ObjectWrapper 클래스를 통해 얻습니다. 여기서 주로 if (개체 instanceof objectWrapper) {this.ObjectWrapper = (ObjectWrapper) 객체; } else if (objectWrapperFactory.hasWrapperFor (Object)) {this.ObjectWrapper = ObjectWrapperFactory.getWrapperFor (this, object); } else if (객체 인스턴스 맵) {this.objectWrapper = 새 MapWrapper (this, (map) 객체); } else if (Object instanceof collection) {this.objectWrapper = new CollectionWrapper (this, (collection) 객체); } else {// 우리가 자주 사용하는 것은 beanwrapper this.objectWrapper = new BeanWrapper (this, object); }}더 많은 침투를 이해하기 위해, 우리는 계속 후속 조치를 취하고 결국 반사기 클래스의 생성자 기능이라고 할 것임을 알게되었습니다.
개인 반사판 (클래스 <?> Clazz) {type = Clazz; // 생성자 클래스를 가져옵니다. AddDefaultConstructor (Clazz); // GET GET 메소드 세트 ADDGETMETHODS (Clazz); // 설정 메소드 가져 오기 세트 ADDSETMETHODS (Clazz); // 내부 속성 세트 ADDFIELDS (Clazz)를 가져옵니다. readablePropertyNames = getMethods.keyset (). ToArray (새 String [getMethods.keyset (). size ()]); writelepropertyNames = setMethods.keyset (). ToArray (새 String [setMethods.keyset (). size ()]); for (string propname : readablePropertyNames) {caseInsensitivePropertyMap.put (propname.toupperCase (locale.english), propname); } for (string propname : writeblepropertyNames) {caseInsensitivePropertyMap.put (propname.toupperCase (locale.english), propname); }} 이를 통해 반사기 프록시 클래스 및 메타 브렉션을 사용하면 프록시 클래스와 관련된 모든 속성을 가로 질러 갈 수 있습니다. RoutingStatementHandler 클래스를 예로 들어 보겠습니다. 위의 작업 후에는 내부 속성 대의원 및 대의원 configuration/objectFactory/typeHandlerRegistry/resultSetHandler/parameterHandler/mappedStatement 및 기타 속성의 내부 속성에 액세스 할 수 있습니다.
MetaObject#getValue()
위의 내부 속성을 프록시 클래스의 내부 속성을 프록시하는 방법을 설명합니다. 또한 올바르게 전화하는 방법을 간단히 살펴볼 수 있습니다.
public object getValue (문자열 이름) {// propertyTokenizer는 StringTokenizer와 유사합니다. if (prop.hasnext ()) {metaobject metavalue = metaobjectforProperty (prop.getIndexedName ()); if (metavalue == SystemMetaObject.null_meta_object) {return null; } else {return metavalue.getValue (prop.getchildren ()); }} else {return objectWrapper.get (prop); }} 특정 분석은 여기에 설명되지 않습니다. StateHandler가 소유 한 SQL 문자열을 얻는 방법 getValue("delegate.boundSql.sql") 에 의해 얻을 수 있으며 IT의 속성은 내부 속성 (CASE 민감성)이어야합니다.
MetaObject#setValue()
원리는 MetaObject#getValue() 메소드와 동일합니다
요약
위는 편집자가 소개 한 Spring Mybatis Paging 플러그인을 사용하는 자습서입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!