Точка входа в лицензию mybatis
В Mybatis есть концепция плагинов (плагинов), которая по сути является идеей перехвата. Конкретный анализ можно найти в исследовании принципа Mybatis Interceptor в другой статье. Исходя из этой основы, в этой статье будет непосредственно отображать код реализации фактического проекта и другой связанный анализ.
Реализация специфического кода под пейджингом
Сначала мы можем определить класс абстрактного диалекта для реализации лиц AbstractDialect.java
Public Abstract Class AbstractDialect { / *** Поддерживается ли ограничение и смещение* @return* / public Abstract Boolean SupportLimitOffSet (); / ** * Поддерживается ли лимит * @return */ public Abstract boolean supportlimit (); / ** * Получить SQL после добавления атрибутов под падением * @param sql * @param offset * @param limit * @return */ public абстрактная строка getlimitstring (String sql, int offset, int limit);}Кроме того, мы будем реализовать технологию подготовки страниц базы данных Oracle и MySQL отдельно.
Mysqlidialect.java-mysql Pagination Dialect
открытый класс mysqlidialect extends artachydialect {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 extends adialect {@override public boolean support limitoffset () {return false; } @Override public boolean support limit () {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 из ("); pagesql.append (sql); pagesql.append (") temp, где rownum <=") .append (start+limit); pagesql.append ("), где row_id>") .append (start+); вернуть pagesql.toString (); }}Соответствующая реализация перехватчика плагина Mybatis выглядит следующим образом: Intercept atportion handler#Prepare (Connection Con) к созданию метода объекта оператора SQL
PaginationInterceptor.java
@Intercepts ({@Signature (type = ratementHandler.class, method = "prepare", args = {connect.class})}) public final class paginationInterceptor реализует Interceptor {private final static logger = loggerFactory .getLogger (paginationInterceptor.class); частный диалект Adialect; public void setDialect (adialect dialect) {this.dialect = dialect; } @Override public Object Intercept (vocation vocation) бросает Throwable {// непосредственно получить перехваченный объект, который реализует класс маршрутинг StatatementHandler ratement ratementHandler = (ratportHandler) vocation .getTarget (); Boundsql boundsql = ratporthandler.getboundsql (); // Получить мета -объект, в основном используемый для получения объекта и атрибутов, связанных с оператором, metaoBject MetaTatementHandler = MetaObject.ForObject (athustHandler, новый defaultObjectFactory (), новый DefaultObjectWrapperFactory ()); MapedStatement MapedStmt = (MapedStatement) MetaTatementHandler .getValue ("Delegate.MapedStatement" .Intern ()); // Только на страже метода querypagination () if (mapedstmt.getid (). Indexof ("querypagination") ==-1) {return villocation.proecd (); } // Реконструируйте пейджинг sql string inoryalsql = (string) metastementHandler .getValue ("delegate.boundsql.sql" .intern ()); metastementHandler.setValue ("delegate.boundsql.sql" .intern (), dialect .getLimitstring (OriginalSql, rowbounds.getOffset (), rowbounds.getLimit ())); MetaTatementHandler.SetValue ("Delegate.RowBounds.Offset" .Intern (), rowbounds.no_row_offset); MetaTatementHandler.SetValue ("Delegate.RowBounds.limit" .Intern (), rowbounds.no_row_limit); log.debug ("page sql:" + boundsql.getsql ()); return vocation.proceed (); } // incept object @Override public объект плагин (объект цели) {return plugin.wrap (target, this); } @Override public void setProperties (свойства свойства) {}}Соответствующая конфигурация пружины XML может быть следующим образом, принимая страницу Oracle в качестве примера
<!-Конфигурация диалекта Oracle, используемая для Oracle Pagination-> <Bean id = "paginationInterceptor"> <name = "dialect"> <bean/> </property> </bean>
Используйте приведенный выше код и конфигурацию, чтобы завершить операцию страниц базы данных Oracle и базы данных MySQL. И блогер анализирует один из моментов
Mybatis#Metaobject-Metadata Анализ объектов
Когда блоггер использовал приведенный выше код, он был озадачен классом MetaObject. Он может непосредственно получить все связанные свойства объекта, прокси -заведенного с помощью метода getValue (). Мы можем следовать исходному коду, чтобы узнать больше
MetaObject#forObject()
Все прокси -объекты входят через этот статический метод
public static metaObject forObject (объект объекта, объект objectfactory, objectWrapperFactory objectWrapperFactory) {if (object == null) {return systemMetaObject.null_meta_object; } else {return new MetaObject (Object, ObjectFactory, ObjectWrapperFactory); }}Мы можем напрямую наблюдать конструктор, вот загадка
Private MetaObject (объект объекта, объект objectFactory, ObjectWrapperFactory objectWrapperFactory) {this.originalObject = object; this.objectfactory = objectFactory; this.objectWrapperFactory = objectWrapperFactory; // Все приобретения атрибутов получают через класс ObjectWrapper. Здесь мы в основном судим тип объекта объекта, который является прокси -оформлением if (exactionof objectwrapper) {this.objectwrapper = (objectWrapper) Object; } else if (objectWrapperFactory.haswrapperfor (Object)) {this.objectWrapper = objectWrapperFactory.getWrapperfor (this, object); } else if (exanceOf instanceOf map) {this.ObjectWrapper = new MapWrapper (this, (map) object); } else if (exant -ancessionof collection) {this.objectWrapper = new CollectionWrapper (this, (collection) Object); } else {// то, что мы часто используем, это BeanWrapper this.objectWrapper = new BeanWrapper (this, object); }}Чтобы понять больше проникновения, мы продолжаем следить за
Private Offeructor (Class <?> Clazz) {type = clazz; // Получить класс Constructor AddDefaultConstructor (clazz); // Получить методы получения набора addgetMethods (clazz); // Получить установленные методы Set Method AddSetMethods (clazz); // Получить внутренние набор свойств addFields (clazz); ReadablePropertyNames = getMethods.keySet (). Toarray (new String [getMethods.keySet (). size ()]); writeablepropertynames = setmethods.keyset (). for (String propname: читайте propertynames) {caseinsensitypropertymap.put (propname.touppercase (locale.english), propname); } for (String propname: writeablepropertynames) {caseinsensitypropertymap.put (propname.touppercase (locale.english), propname); }} Исходя из этого, мы можем знать, что использование класса прокси -сервера отражателя и MetaObject вы можете пройти все атрибуты, связанные с классом прокси. Возьмите класс RoutingStatementHandler в качестве примера. После приведенной выше операции вы можете получить доступ ко внутреннему делегату атрибута и внутренним атрибутам configuration/objectFactory/typeHandlerRegistry/resultSetHandler/parameterHandler/mappedStatement и другие атрибуты.
MetaObject#getValue()
Приведенное выше объясняется, как доверьте внутренние свойства класса прокси. Мы также можем кратко взглянуть на то, как правильно это назвать.
Public Object getValue (String name) {// PropertyTokenizer аналогична stringTokenizer, за исключением того, что первое написано как Delimiter PropertyTokenizer Prop = New PropertyTokenizer (имя); 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); }} Конкретный анализ не будет объяснен здесь. Как получить строку SQL, принадлежащую оператору, можно получить с помощью getValue("delegate.boundSql.sql") , а атрибуты в нем должны быть внутренними атрибутами (чувствительный к случаю).
MetaObject#setValue()
Принцип такой же, как метод MetaObject#getValue()
Суммировать
Выше приведено учебник по использованию плагина Spring Mybatis Paging, представленного вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!