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)
-
增加
dialect
屬性,使用時可以指定該屬性(不指定的情況下,分頁插件會自動判斷),可選值為oracle
,mysql
,mariadb
,sqlite
,hsqldb
,postgresql
,db2
,sqlserver
,informix
,h2
,sqlserver2012
。 -
增加
offsetAsPageNum
屬性,默認值為false
,使用默認值時不需要增加該配置,需要設為true
時,需要配置該參數。當該參數設置為true
時,使用RowBounds
分頁時,會將offset
參數當成pageNum
使用,可以用頁碼和頁面大小兩個參數進行分頁。 -
增加
rowBoundsWithCount
屬性,默認值為false
,使用默認值時不需要增加該配置,需要設為true
時,需要配置該參數。當該參數設置為true
時,使用RowBounds
分頁會進行count查詢。 -
增加
pageSizeZero
屬性,默認值為false
,使用默認值時不需要增加該配置,需要設為true
時,需要配置該參數。當該參數設置為true
時,如果pageSize=0
或者RowBounds.limit = 0
就會查詢出全部的結果(相當於沒有執行分頁查詢,但是返回結果仍然是Page
類型)。 -
增加
reasonable
屬性,默認值為false
,使用默認值時不需要增加該配置,需要設為true
時,需要配置該參數。具體作用請看上面配置文件中的注釋內容。 -
為了支持
startPage(Object params)
方法,增加了一個params
參數來配置參數映射,用於從Map或ServletRequest中取值,可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默認值。 -
supportMethodsArguments
支持通過Mapper接口參數來傳遞分頁參數,默認值false
,具體用法參考com.github.pagehelper.test.basic
包下的ArgumentsMapTest
和ArgumentsObjTest
測試類。 -
returnPageInfo
用來支持直接返回PageInfo
類型,默認值none
,可選參數always總是返回PageInfo類型,check檢查返回類型是否為PageInfo,none返回Page(List)類型。用法和配置參考com.github.pagehelper.test.basic
包下的PageInfoTest
,特別要注意接口的返回值和xml中的resultType
類型。 -
增加
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中的注解:
-
表名默認使用類名,駝峰轉下划線,如
UserInfo
默認對應的表名為user_info
. -
表名可以使用
@Table(name = "tableName")
進行指定,對不符合第一條默認規則的可以通過這種方式指定表名. -
字段默認和
@Column
一樣,都會作為表字段,表字段默認為Java對象的Field
名字駝峰轉下划線形式. -
可以使用
@Column(name = "fieldName")
指定不符合第3條規則的字段名 -
使用
@Transient
注解可以忽略字段,添加該注解的字段不會作為表字段使用. -
建議一定是有一個
@Id
注解作為主鍵的字段,可以有多個@Id
注解的字段作為聯合主鍵. -
默認情況下,實體類中如果不存在包含
@Id
注解的字段,所有的字段都會作為主鍵字段進行使用(這種效率極低). -
實體類可以繼承使用,可以參考測試代碼中的
com.github.abel533.model.UserLogin2
類. -
由於基本類型,如int作為實體類字段時會有默認值0,而且無法消除,所以實體類中建議不要使用基本類型.
除了上面提到的這些,Mapper還提供了序列(支持Oracle)、UUID(任意數據庫,字段長度32)、主鍵自增(類似MySQL,Hsqldb)三種方式,其中序列和UUID可以配置多個,主鍵自增只能配置一個。