1. 程式人生 > >spring-boot 整合mybatis的分頁外掛PageHelper和Generator (番外)

spring-boot 整合mybatis的分頁外掛PageHelper和Generator (番外)

分頁外掛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中可以看到如下內容

    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);
        }
    }
可以看出,com.github.pagehelper.PageHelper是攔截器預設的Dialect。也可以選擇其它的Dialect實現,可以在application.properties中如下配置。
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註解。