真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MyBatis之?dāng)r截器分頁

魯春利的工作筆記,好記性不如爛筆頭

成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的盤州網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!


數(shù)據(jù)庫的分頁主要有物理分頁和邏輯分頁。
    物理分頁:數(shù)據(jù)庫本身提供的分頁方式,如MySQL的limit、Oracle的rownum、SqlServer的top,好處是效率高,不好的地方就是不同數(shù)據(jù)庫有不同的查詢方式。
    邏輯分頁:從數(shù)據(jù)庫將所有記錄查詢出來,存儲到內(nèi)存中,然后數(shù)據(jù)再直接從內(nèi)存中獲取并篩選分頁,好處是能夠統(tǒng)一查詢方式,不好的地方是效率低,因為每次都要把全部數(shù)據(jù)查詢出來再處理。

常用orm框架采用的分頁技術(shù):
①:hibernate采用的是物理分頁;
②:MyBatis使用RowBounds實現(xiàn)的分頁是邏輯分頁,也就是先把數(shù)據(jù)記錄全部查詢出來,然在再根據(jù)offset和limit截斷記錄。

MetaObject

org.apache.ibatis.reflection.MetaObject是Mybatis提供的一個的工具類,Mybatis在sql參數(shù)設(shè)置和結(jié)果集映射里經(jīng)常使用到這個對象。

  • 屬性:

  // 原始對象
  private Object originalObject;
  // 對原始對象的一個封裝
  private ObjectWrapper objectWrapper;
  // org.apache.ibatis.reflection.factory.DefaultObjectFactory的父類
  private ObjectFactory objectFactory;
  // org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory的父類
  private ObjectWrapperFactory objectWrapperFactory;

  • 方法:

// 用于包裝對象
MetaObject forObject(Object object,ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory)
// 用于獲取屬性的值(支持OGNL的方法)
Object getValue(String name)
// 用于設(shè)置屬性的值(支持OGNL的方法)
void setValue(String name, Object value)

構(gòu)造方法

  private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory) {
    this.originalObject = object;
    this.objectFactory = objectFactory;
    this.objectWrapperFactory = objectWrapperFactory;

    if (object instanceof ObjectWrapper) {
      this.objectWrapper = (ObjectWrapper) object;
    } else if (objectWrapperFactory.hasWrapperFor(object)) {
      this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);
    } else if (object instanceof Map) {
      this.objectWrapper = new MapWrapper(this, (Map) object);
    } else if (object instanceof Collection) {
      this.objectWrapper = new CollectionWrapper(this, (Collection) object);
    } else {
      this.objectWrapper = new BeanWrapper(this, object);
    }
  }

forObject方法

  public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory) {
    if (object == null) {
      return SystemMetaObject.NULL_META_OBJECT;
    } else {
      return new MetaObject(object, objectFactory, objectWrapperFactory);
    }
  }

getValue

  public Object getValue(String name) {
    PropertyTokenizer prop = new PropertyTokenizer(name);
    if (prop.hasNext()) {
      MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());
      if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
        return null;
      } else {
          // 這里相當(dāng)于遞歸調(diào)用,直到最后一層。例如user.cust.custId  
                // 第一次遞歸cust.custId  
                // 第二次遞歸custId,這個就是真正訪問要返回的 
        return metaValue.getValue(prop.getChildren());
      }
    } else {
      return objectWrapper.get(prop);
    }
  }

setValue

  public void setValue(String name, Object value) {
    PropertyTokenizer prop = new PropertyTokenizer(name);
    if (prop.hasNext()) {
      MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());
      if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
        if (value == null && prop.getChildren() != null) {
          return; // don't instantiate child path if value is null
        } else {
          metaValue = objectWrapper.instantiatePropertyValue(name, prop, objectFactory);
        }
      }
      metaValue.setValue(prop.getChildren(), value);
    } else {
      objectWrapper.set(prop, value);
    }
  }

攔截器簽名

@Intercepts({
        @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class})
    })
public class PreparePaginationInterceptor extends BaseInterceptor {

從簽名里可以看出,要攔截的目標(biāo)類型是StatementHandler(注意:type只能配置成接口類型),攔截的方法是名稱為prepare參數(shù)為Connection類型的方法。

說明:關(guān)于為什么要把攔截器加到StatementHandler請參閱MyBatis之SqlSession介紹


當(dāng)前標(biāo)題:MyBatis之?dāng)r截器分頁
文章源于:http://weahome.cn/article/jgpeop.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部