在spring-mybatis.xml 中配置pagehelper


maven導包:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>

<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.0</version>
</dependency>

spring-mybatis.xml 中:

注冊:
    <bean id="defaultSqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="你的數據源配置"/>
        <property name="configuration">
            <bean class="org.apache.ibatis.session.Configuration">
                <property name="logImpl" value="org.apache.ibatis.logging.log4j.Log4jImpl"/>
                <property name="aggressiveLazyLoading" value="false"/>
                <property name="autoMappingUnknownColumnBehavior" value="WARNING"/>
                <property name="databaseId" value="mysql"/>
                <property name="lazyLoadingEnabled" value="true"/>
                <property name="lazyLoadTriggerMethods" value="equals,hashCode,toString,clone,toJSON"/>
                <property name="localCacheScope" value="SESSION"/>
                <property name="useGeneratedKeys" value="true"/>
            </bean>
        </property> 
           <!-- 指定mybatis的全局配置文件 -->  
        <!-- <property name="configLocation" value="classpath:mybatis-config.xml"/> -->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <value>
                            helperDialect=sqlserver
                        </value>
                    </property>
                </bean>
            </array>
        </property>
        <property name="mapperLocations" value="classpath*:mybatis-mappers/*Mapper.xml"/>
        <!-- 設置包中類的別名 -->
        <property name="typeAliasesPackage" value="com.keepbreath.entity"/>
    </bean>

如此即可使用:在查詢語句的上一行代碼寫上:PageHelper.startPage(pageNumber, pageSize)

 

    1. 增加dialect屬性,使用時可以指定該屬性(不指定的情況下,分頁插件會自動判斷),可選值為oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012

    2. 增加offsetAsPageNum屬性,默認值為false,使用默認值時不需要增加該配置,需要設為true時,需要配置該參數。當該參數設置為true時,使用RowBounds分頁時,會將offset參數當成pageNum使用,可以用頁碼和頁面大小兩個參數進行分頁。

    3. 增加rowBoundsWithCount屬性,默認值為false,使用默認值時不需要增加該配置,需要設為true時,需要配置該參數。當該參數設置為true時,使用RowBounds分頁會進行count查詢。

    4. 增加pageSizeZero屬性,默認值為false,使用默認值時不需要增加該配置,需要設為true時,需要配置該參數。當該參數設置為true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果(相當於沒有執行分頁查詢,但是返回結果仍然是Page類型)。

    5. 增加reasonable屬性,默認值為false,使用默認值時不需要增加該配置,需要設為true時,需要配置該參數。具體作用請看上面配置文件中的注釋內容。

    6. 為了支持startPage(Object params)方法,增加了一個params參數來配置參數映射,用於從Map或ServletRequest中取值,可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默認值。

    7. supportMethodsArguments支持通過Mapper接口參數來傳遞分頁參數,默認值false,具體用法參考com.github.pagehelper.test.basic包下的ArgumentsMapTestArgumentsObjTest測試類。

    8. returnPageInfo用來支持直接返回PageInfo類型,默認值none,可選參數always總是返回PageInfo類型,check檢查返回類型是否為PageInfo,none返回Page(List)類型。用法和配置參考com.github.pagehelper.test.basic包下的PageInfoTest,特別要注意接口的返回值和xml中的resultType類型。

    9. 增加closeConn屬性,當使用動態數據源或沒有設置dialect屬性自動獲取數據庫類型時,會自動獲取一個數據庫連接,通過該屬性來設置是否關閉獲取的這個連接,默認true關閉。

重要提示:

offsetAsPageNum=false的時候,由於PageNum問題,RowBounds查詢的時候reasonable會強制為false。使用PageHelper.startPage方法不受影響。

另外使用RowBounds在這種情況下返回的Page對象由於沒有正確的pageNum屬性,所以也不能使用PageInfo處理。

如果你不理解為什么,可以看這樣一個例子:查詢offset=7,limit=10,這個時候pageNum=?,這種情況沒法計算pageNum,沒法判斷當前是第幾頁

 

實例編寫

public interface UserInfoMapper extends Mapper<UserInfo> {
  //其他必須手寫的接口...

}

  一旦繼承了Mapper<T>,繼承的Mapper就擁有了以下通用的方法:

//根據實體類不為null的字段進行查詢,條件全部使用=號and條件
List<T> select(T record);

//根據實體類不為null的字段查詢總數,條件全部使用=號and條件
int selectCount(T record);

//根據主鍵進行查詢,必須保證結果唯一
//單個字段做主鍵時,可以直接寫主鍵的值
//聯合主鍵時,key可以是實體類,也可以是Map
T selectByPrimaryKey(Object key);

//插入一條數據
//支持Oracle序列,UUID,類似Mysql的INDENTITY自動增長(自動回寫)
//優先使用傳入的參數值,參數值空時,才會使用序列、UUID,自動增長
int insert(T record);

//插入一條數據,只插入不為null的字段,不會影響有默認值的字段
//支持Oracle序列,UUID,類似Mysql的INDENTITY自動增長(自動回寫)
//優先使用傳入的參數值,參數值空時,才會使用序列、UUID,自動增長
int insertSelective(T record);

//根據實體類中字段不為null的條件進行刪除,條件全部使用=號and條件
int delete(T key);

//通過主鍵進行刪除,這里最多只會刪除一條數據
//單個字段做主鍵時,可以直接寫主鍵的值
//聯合主鍵時,key可以是實體類,也可以是Map
int deleteByPrimaryKey(Object key);

//根據主鍵進行更新,這里最多只會更新一條數據
//參數為實體類
int updateByPrimaryKey(T record);

//根據主鍵進行更新
//只會更新不是null的數據
int updateByPrimaryKeySelective(T record);

  

4. 泛型(實體類)<T>的類型必須符合要求

實體類按照如下規則和數據庫表進行轉換,注解全部是JPA中的注解:

  1. 表名默認使用類名,駝峰轉下划線,如UserInfo默認對應的表名為user_info.

  2. 表名可以使用@Table(name = "tableName")進行指定,對不符合第一條默認規則的可以通過這種方式指定表名.

  3. 字段默認和@Column一樣,都會作為表字段,表字段默認為Java對象的Field名字駝峰轉下划線形式.

  4. 可以使用@Column(name = "fieldName")指定不符合第3條規則的字段名

  5. 使用@Transient注解可以忽略字段,添加該注解的字段不會作為表字段使用.

  6. 建議一定是有一個@Id注解作為主鍵的字段,可以有多個@Id注解的字段作為聯合主鍵.

  7. 默認情況下,實體類中如果不存在包含@Id注解的字段,所有的字段都會作為主鍵字段進行使用(這種效率極低).

  8. 實體類可以繼承使用,可以參考測試代碼中的com.github.abel533.model.UserLogin2類.

  9. 由於基本類型,如int作為實體類字段時會有默認值0,而且無法消除,所以實體類中建議不要使用基本類型.

除了上面提到的這些,Mapper還提供了序列(支持Oracle)、UUID(任意數據庫,字段長度32)、主鍵自增(類似MySQL,Hsqldb)三種方式,其中序列和UUID可以配置多個,主鍵自增只能配置一個。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM