spring-boot 整合mybatis的分頁外掛PageHelper和Generator (番外)
阿新 • • 發佈:2019-01-02
分頁外掛PageHelper
新增maven依賴
根據上面地址中的說明,只需要新增如下依賴,並且可以不再mybatis的依賴
<!--分頁外掛-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
攔截器PageInterceptor
PageInterceptor是PageHelper-5.0版本中新的攔截器,com.github.pagehelper.PageHelper則成為了介面Dialect的一個實現類
在攔截器PageInterceptor中可以看到如下內容
可以看出,com.github.pagehelper.PageHelper是攔截器預設的Dialect。也可以選擇其它的Dialect實現,可以在application.properties中如下配置。private Dialect dialect; private String default_dialect_class = "com.github.pagehelper.PageHelper"; public void setProperties(Properties properties) { this.msCountMap = CacheFactory.createCache(properties.getProperty("msCountCache"), "ms", properties); String dialectClass = properties.getProperty("dialect"); if(StringUtil.isEmpty(dialectClass)) { dialectClass = this.default_dialect_class; } try { Class e = Class.forName(dialectClass); this.dialect = (Dialect)e.newInstance(); } catch (Exception var5) { throw new PageException(var5); } this.dialect.setProperties(properties); try { this.additionalParametersField = BoundSql.class.getDeclaredField("additionalParameters"); this.additionalParametersField.setAccessible(true); } catch (NoSuchFieldException var4) { throw new PageException(var4); } }
pagehelper.dialect=com.github.pagehelper.dialect.helper.MySqlDialect
其它的Dialect實現在com.github.pagehelper.dialect下找到,不過一般不需要進行特殊配置,使用預設的com.github.pagehelper.PageHelper即可。而在com.github.pagehelper.PageHelper中有以下兩個引數。
private PageParams pageParams;
private PageAutoDialect autoDialect;
public void setProperties(Properties properties) {
this.pageParams = new PageParams();
this.autoDialect = new PageAutoDialect();
this.pageParams.setProperties(properties);
this.autoDialect.setProperties(properties);
}
其中PageParams中有以下屬性。
protected boolean offsetAsPageNum = false;
protected boolean rowBoundsWithCount = false;
protected boolean pageSizeZero = false;
protected boolean reasonable = false;
protected boolean supportMethodsArguments = false;
PageAutoDialect中有以下屬性。
private boolean autoDialect = true;
private boolean closeConn = true;
以上內容都可以在application.properties中進行修改,如下所示。
pagehelper.autoDialect=true
pagehelper.closeConn=false
pagehelper.reasonable=true
Pagehelper的使用
我增加了如下測試程式碼。
@RequestMapping("/find/mybatis/page")
public String findUserPageFromMybatis(HttpServletRequest request, Integer pageNum, Integer pageSize) {
pageNum = pageNum == null ? 1 : pageNum;
pageSize = pageSize == null ? 10 : pageSize;
PageHelper.startPage(pageNum, pageSize);
List<UserMo> list = userMapper.selectUserList();
PageInfo pageInfo = new PageInfo(list);
Page page = (Page) list;
return "PageInfo: " + JSON.toJSONString(pageInfo) + ", Page: " + JSON.toJSONString(page);
}
執行程式後在瀏覽器輸入 http://127.0.0.1:8080/find/mybatis/page,會看到如下輸出。
PageInfo: {
"endRow": 1,
"firstPage": 1,
"hasNextPage": true,
"hasPreviousPage": false,
"isFirstPage": true,
"isLastPage": false,
"lastPage": 8,
"list": [
{
"createDate": 1483586613000,
"id": 1,
"isDeleted": 0,
"modifyDate": 1483586613000,
"money": 1.20,
"name": "sss"
}
],
"navigateFirstPage": 1,
"navigateLastPage": 8,
"navigatePages": 8,
"navigatepageNums": [1,2,3,4,5,6,7,8],
"nextPage": 2,
"pageNum": 1,
"pageSize": 1,
"pages": 11,
"prePage": 0,
"size": 1,
"startRow": 1,
"total": 11
},
Page: [
{
"createDate": 1483586613000,
"id": 1,
"isDeleted": 0,
"modifyDate": 1483586613000,
"money": 1.20,
"name": "sss"
}
]
對於其它的呼叫方式,可以參看https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md
重要提示
- 只有緊跟在 PageHelper.startPage 方法後的第一個 MyBatis 的查詢(select)方法會被分頁。
- 請不要在系統中配置多個分頁外掛(使用 spring 時,mybatis-config.xml 和 Spring<bean> 配置方式,請選擇其中一種,不要同時配置多個分頁外掛)。
- 對於帶有 for update 的 sql,會丟擲執行時異常,對於這樣的 sql 建議手動分頁,畢竟這樣的 sql 需要重視。
- 由於巢狀結果方式會導致結果集被摺疊,因此分頁查詢的結果在摺疊後總數會減少,所以無法保證分頁結果數量正確。
Mybatis-Generator
新增maven依賴及外掛
<!-- Mybatis generator. -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator</artifactId>
<version>1.3.5</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<!-- 配置這個依賴主要是為了等下在配置MG的時候可以不用配置classPathEntry這樣的一個屬性 -->
<!-- 避免程式碼的耦合度太高 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.5</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
新增Mybatis Generator的配置檔案
在resources下增加generatorConfig.properties和generatorConfig.xml兩個檔案。
首先是generatorConfig.xml,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 配置檔案路徑 -->
<properties resource="generatorConfig.properties"/>
<context id="DB2Tables" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="false"/>
<property name="javaFileEncoding" value="UTF-8"/>
</commentGenerator>
<jdbcConnection driverClass="${jdbc.driver}"
connectionURL="${jdbc.url}"
userId="${jdbc.username}"
password="${jdbc.password}">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<javaModelGenerator targetPackage="${model.package}" targetProject="${target.project}">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
<property name="javaExampleTargetPackage" value="${model.package}"/>
<property name="javaExampleTargetProject" value="${target.project}"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="${xml.package}" targetProject="${xml.target.project}">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER"
targetPackage="${mapper.package}"
targetProject="${target.project}">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<table tableName="test_user" >
<generatedKey column="id" sqlStatement="Mysql" type="post" identity="true"/>
</table>
</context>
</generatorConfiguration>
然後是generatorConfig.properties,如下所示。
# 資料庫連線引數
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://ip:3306/db?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=xxxxxx
# 包路徑配置
model.package=com.generator.model
mapper.package=com.generator.mapper
xml.package=mybatis/mapper
target.project=src/main/java
xml.target.project=src/main/resources
生成程式碼
通過選中如下圖片中的外掛執行來生成程式碼。
生成的TestUserMapper中需要自己手動加上@Mapper註解。
測試
對上面的程式碼稍作修改,如下所示。
@Autowired
private TestUserMapper testUserMapper;
@RequestMapping("/find/mybatis/page")
public String findUserPageFromMybatis(HttpServletRequest request, Integer pageNum, Integer pageSize) {
pageNum = pageNum == null ? 1 : pageNum;
pageSize = pageSize == null ? 10 : pageSize;
PageHelper.startPage(pageNum, pageSize);
List<TestUser> list = testUserMapper.selectByExample(new TestUserExample());
PageInfo pageInfo = new PageInfo(list);
Page page = (Page) list;
return "PageInfo: " + JSON.toJSONString(pageInfo) + ", Page: " + JSON.toJSONString(page);
}
執行後結果與上面的測試結果一致。
對於有特殊需求的可以修改mybatis-generator的原始碼來實現,比如自動新增@Mapper註解。