Mybatis-plus代碼生成AutoGenerator使用,已經基本配置使用

首先,引入依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wm</groupId>
    <artifactId>plus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>plus</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--mybatis-plus使用到下面的依賴,在代碼生成階段先註釋掉,生成好了之後再放開-->
      <!--  <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>-->

        <!--代碼生成需要用到下面這個依賴,生成之後註釋掉-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.0.5</version>
        </dependency>

        <!-- velocity 模板引擎, 默認 -->
        <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity-engine-core -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

注意需要用到默認的模板依賴:

 <!-- velocity 模板引擎, 默認 -->
        <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity-engine-core -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>

如下,在代碼生成階段使用的完整依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wm</groupId>
    <artifactId>plus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>plus</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--代碼生成需要用到下面這個依賴,生成之後註釋掉-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.0.5</version>
        </dependency>

        <!-- velocity 模板引擎, 默認 -->
        <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity-engine-core -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

新建一個生成啓動類:  位置隨便的(沒有限定)
 

package com.wm.plus.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

/**
 * @class_name: testGenerator
 * @description:
 * @author: wm_yu
 * @create: 2019/10/09
 **/
public class testGenerator {


    public static void main(String[] args){
        AutoGenerator mpg = new AutoGenerator();

        //全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir("D:\\ideaworkspace\\plus\\src\\main\\java");  //生成路徑(一般都是生成在此項目的src/main/java下面)
        gc.setFileOverride(true);  //第二次生成會把第一次的覆蓋
        gc.setActiveRecord(false);//不需要ActiveRecord特性的請改爲false
        gc.setEnableCache(false);//XML二級緩存
        gc.setBaseResultMap(true);//XML ResultMap
        gc.setBaseColumnList(true);//XML columList  在xml中生產基礎列
        gc.setAuthor("wm_yu");//作者

        //自定義文件命名,注意%s 會自動填充表實體屬性
        gc.setControllerName("%sController");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");
        mpg.setGlobalConfig(gc);

        //數據源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);  //數據庫類型
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        dsc.setUrl("jdbc:mysql://localhost:3306/exercise?serverTimezone=GMT%2B8");
        mpg.setDataSource(dsc);

        //策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setTablePrefix(new String[]{});//此處可以修改您的表前綴
        strategy.setNaming(NamingStrategy.underline_to_camel);//表名生成策略,下劃線到駝峯的命名規則
        strategy.setCapitalMode(true); //開啓全局大寫命名
        strategy.setDbColumnUnderline(true);//表名字段名使用下劃線
        strategy.setInclude(new String[]{"student","sc","course","teacher"});//需要生成的表

        strategy.setSuperServiceClass(null);
        strategy.setSuperServiceImplClass(null);
        strategy.setSuperMapperClass(null);
        mpg.setStrategy(strategy);

        //包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.wm.plus");
        pc.setController("controller");
        pc.setService("service");
        pc.setServiceImpl("serviceImpl");
        pc.setMapper("mapper");
        pc.setEntity("model");
        pc.setXml("xml");
        mpg.setPackageInfo(pc);

        //執行生成
        mpg.execute();
    }


}

注意仔細配置其中的參數,基本上都有說明的,點擊main方法運行,生成的結果如下:


圖中可以看到,controller,service,model,mapper,已經xml的全部生成了,

看下controller層:

看下service層:

其中Iservice接口,實現了通用CURD的接口:

看下mapper層:

同樣的BaseMapper接口,實現了,一些通用的接口,具體後面給出官方的通用接口的介紹

看下xml層:

看下model層:

 

 

 

將xml中的文件移到resource中吧:

 

下面我們開始使用mybatis-plus來測試,首先,註釋掉依賴:

  <!--代碼生成需要用到下面這個依賴,生成之後註釋掉-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.0.5</version>
        </dependency>

添加依賴:

<!--mybatis-plus使用到下面的依賴,在代碼生成階段先註釋掉,生成好了之後再放開-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

最終項目的依賴如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wm</groupId>
    <artifactId>plus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>plus</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--mybatis-plus使用到下面的依賴,在代碼生成階段先註釋掉,生成好了之後再放開-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>


        <!-- velocity 模板引擎, 默認 -->
        <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity-engine-core -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

配置application.yml如下:

# DataSource Config

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/exercise?serverTimezone=GMT%2B8
      username: root
      password: root
      
      
      
# 配置slq打印日誌,mybati-plus的日誌配置,是寫死的
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

添加測試類:

package com.wm.plus.service;

import com.wm.plus.model.Student;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @class_name: StudentServiceTest
 * @description:
 * @author: wm_yu
 * @create: 2019/10/09
 **/
@RunWith(SpringRunner.class)
@SpringBootTest
public class StudentServiceTest {

    @Autowired
    private StudentService studentService;

    @Test
    public void selectByIdTest(){
        Student student = studentService.getById("01");
        System.out.println(student.toString());
    }


}

執行如下:

 

可以看到執行結果已經查詢出來了,基本的整合

官方給出的通用接口介紹:

官方文檔

 

下面參照官網給出mybatis-plus的執行sql性能分析,能輸出完整的sql語句,包括入參,供分析sql問題,此方法生產勿用,測試開發使用:

官方文檔如下:

https://mp.baomidou.com/guide/p6spy.html

 

添加依賴:

 

<!--p6spy依賴-->
        <dependency>
            <groupId>p6spy</groupId>
            <artifactId>p6spy</artifactId>
            <version>3.8.1</version>
        </dependency>

 

修改配置:   application-test.yml
 

# DataSource Config

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      ### sql性能分析配置,生成勿用
      driver-class-name: com.p6spy.engine.spy.P6SpyDriver
      ### sql性能分析配置,生成勿用
      url: jdbc:p6spy:mysql://localhost:3306/exercise?serverTimezone=GMT%2B8
      username: root
      password: root

添加配置:   spy.properties: 

注意,參照官方寫的,嘗試修改爲yml格式的,但是失敗了.....

module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定義日誌打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日誌輸出到控制檯
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日誌系統記錄 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 設置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前綴
useprefix=true
# 配置記錄 Log 例外,可去掉的結果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,batch,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 實際驅動可多個
#driverlist=org.h2.Driver
# 是否開啓慢SQL記錄
outagedetection=true
# 慢SQL記錄標準 2 秒
outagedetectioninterval=2

修改application.yml:

spring:
  profiles:
    active: test

 

運行測試類:

package com.wm.plus.service;

import com.wm.plus.model.Student;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @class_name: StudentServiceTest
 * @description:
 * @author: wm_yu
 * @create: 2019/10/09
 **/
@RunWith(SpringRunner.class)
@SpringBootTest
public class StudentServiceTest {

    @Autowired
    private StudentService studentService;

    @Test
    public void selectByIdTest(){
        Student student = studentService.getById("01");
        System.out.println(student.toString());
    }


}

 

查看控制檯的結果:

 

可以看到完整的sql執行語句,以及耗時

 

 

下面,整合mybatis-plus的分頁(物理分頁非內存分頁):

 

添加分頁配置:

package com.wm.plus.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * @class_name: MybatisPlusConfig
 * @description:
 * @author: wm_yu
 * @create: 2019/10/09
 **/
//Spring boot方式
@EnableTransactionManagement
@Configuration
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 設置請求的頁面大於最大頁後操作, true調回到首頁,false 繼續請求  默認false
        // paginationInterceptor.setOverflow(false);
        // 設置最大單頁限制數量,默認 500 條,-1 不受限制
        // paginationInterceptor.setLimit(500);
        return paginationInterceptor;
    }

}

 

在mapper接口中添加需要分頁的接口:

package com.wm.plus.mapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wm.plus.model.Student;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author wm_yu
 * @since 2019-10-09
 */
public interface StudentMapper extends BaseMapper<Student> {

    /**
     * <p>
     * 查詢 : 根據state狀態查詢用戶列表,分頁顯示
     * 注意!!: 如果入參是有多個,需要加註解指定參數名才能在xml中取值
     * </p>
     *
     * @param page 分頁對象,xml中可以從裏面進行取值,傳遞參數 Page 即自動分頁,必須放在第一位(你可以繼承Page實現自己的分頁對象)
     * @param Sage 狀態
     * @return 分頁對象
     */
    IPage<Student> selectPageVo(Page page, @Param("Ssex") String Ssex);

}

編寫xml中的sql語句:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wm.plus.mapper.StudentMapper">

    <!-- 通用查詢映射結果 -->
    <resultMap id="BaseResultMap" type="com.wm.plus.model.Student">
        <result column="SId" property="SId" />
        <result column="Sname" property="Sname" />
        <result column="Sage" property="Sage" />
        <result column="Ssex" property="Ssex" />
    </resultMap>



    <select id="selectPageVo" resultType="com.wm.plus.model.Student">
        select * from student <where> Ssex = #{Ssex}</where>
    </select>

</mapper>

 

 

同樣的在Service中也添加:

package com.wm.plus.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wm.plus.model.Student;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * <p>
 *  服務類
 * </p>
 *
 * @author wm_yu
 * @since 2019-10-09
 */
public interface StudentService extends IService<Student> {
     IPage<Student> selectUserPage(Page<Student> page, String state);

}

 

實現類中:

package com.wm.plus.serviceImpl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wm.plus.model.Student;
import com.wm.plus.mapper.StudentMapper;
import com.wm.plus.service.StudentService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  服務實現類
 * </p>
 *
 * @author wm_yu
 * @since 2019-10-09
 */
@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {

    @Autowired
    private StudentMapper studentMapper;

    @Override
    public IPage<Student> selectUserPage(Page<Student> page, String state) {
        // 不進行 count sql 優化,解決 MP 無法自動優化 SQL 問題,這時候你需要自己查詢 count 部分
        // page.setOptimizeCountSql(false);
        // 當 total 爲小於 0 或者設置 setSearchCount(false) 分頁插件不會進行 count 查詢
        // 要點!! 分頁返回的對象與傳入的對象是同一個
        return studentMapper.selectPageVo(page, state);
    }


}

 

使用的IPage是mybatis-plus中的定義好的,我們可以看下這個類中有啥:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.baomidou.mybatisplus.core.metadata;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public interface IPage<T> extends Serializable {
    /** @deprecated */
    @Deprecated
    default String[] descs() {
        return null;
    }

    /** @deprecated */
    @Deprecated
    default String[] ascs() {
        return null;
    }

    List<OrderItem> orders();

    default Map<Object, Object> condition() {
        return null;
    }

    default boolean optimizeCountSql() {
        return true;
    }

    default boolean isSearchCount() {
        return true;
    }

    default long offset() {
        return this.getCurrent() > 0L ? (this.getCurrent() - 1L) * this.getSize() : 0L;
    }

    default long getPages() {
        if (this.getSize() == 0L) {
            return 0L;
        } else {
            long pages = this.getTotal() / this.getSize();
            if (this.getTotal() % this.getSize() != 0L) {
                ++pages;
            }

            return pages;
        }
    }

    default IPage<T> setPages(long pages) {
        return this;
    }

    List<T> getRecords();

    IPage<T> setRecords(List<T> records);

    long getTotal();

    IPage<T> setTotal(long total);

    long getSize();

    IPage<T> setSize(long size);

    long getCurrent();

    IPage<T> setCurrent(long current);

    default <R> IPage<R> convert(Function<? super T, ? extends R> mapper) {
        List<R> collect = (List)this.getRecords().stream().map(mapper).collect(Collectors.toList());
        return this.setRecords(collect);
    }
}

用到的封裝的PageResult和StudentVo

package com.wm.plus.Result;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * @class_name: PageResult
 * @description: 分頁返回結果集
 * @create: 2019/10/09
 **/
public class PageResult<T> implements Serializable {
    private static final long serialVersionUID = -7163787780152843975L;

    private int totalCount;
    private int pageSize;
    private int currPage;
    private List<T> list;
    private boolean hasMore;

    public PageResult() {
    }

    public PageResult(List<T> list, int totalCount, int pageSize, int currPage) {
        this.list = list;
        this.totalCount = totalCount;
        this.pageSize = pageSize;
        this.currPage = currPage;
    }

    public PageResult(List<T> list, int totalCount, int pageSize) {
        this.list = list;
        this.totalCount = totalCount;
        this.pageSize = pageSize;
    }

    public PageResult(int currPage, int pageSize) {
        this.currPage = currPage;
        this.pageSize = pageSize;
    }

    public int getTotalCount() {
        return this.totalCount;
    }

    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }

    public int getPageSize() {
        return this.pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getCurrPage() {
        return this.currPage;
    }

    public void setCurrPage(int currPage) {
        this.currPage = currPage;
    }

    public List<T> getList() {
        if (this.list == null || this.list.isEmpty()) {
            this.list = new ArrayList(0);
        }

        return this.list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    public boolean isHasMore() {
        if (this.totalCount - this.currPage * this.pageSize > 0) {
            this.hasMore = true;
        } else {
            this.hasMore = false;
        }

        return this.hasMore;
    }

    public void setHasMore(boolean hasMore) {
        this.hasMore = hasMore;
    }

}

 

 

package com.wm.plus.vo;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * @class_name: StudentVo
 * @description:
 * @author: wm_yu
 * @create: 2019/10/09
 **/
@Data
public class StudentVo implements Serializable {
    private static final long serialVersionUID = -5635303374289607470L;
    private String SId;
    private String Sname;
    private Date Sage;
    private String Ssex;
}

 

使用函數式接口來處理IPage轉換爲PageResult,個人寫着玩的

定義一個函數式接口

package com.wm.plus.Function;

/**
 * @class_name: CommonFunction
 * @description: 函數式接口
 * @author: wm_yu
 * @create: 2019/10/09
 **/
@FunctionalInterface
public interface CommonFunction<T,R> {
    /**
     * 輸入T參數,執行邏輯返回R參數
     * @param var1
     * @return
     */
    R apply(T var1,R var2);

}

定義工具類,使用函數式接口:

package com.wm.plus.util;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.wm.plus.Function.CommonFunction;
import com.wm.plus.Result.PageResult;
import org.springframework.util.Assert;

import java.util.ArrayList;
import java.util.Optional;

/**
 * @class_name: CommonUtil
 * @description:
 * @author: wm_yu
 * @create: 2019/10/09
 **/
public class CommonUtil {


    /**
     * 輸入mybatis-plus返回的分頁參數,輸出自定義的PageResult結果
     * @param page
     * @param commonFunction
     * @return
     */
    public static<T> PageResult<T> createPageResult(IPage page, PageResult<T> pageResult,CommonFunction<IPage,PageResult<T>> commonFunction){
        Assert.notNull(commonFunction,"函數式接口不能傳入Null值...");
        return commonFunction.apply(page,pageResult);
    }

    public static<T> PageResult<T> dealPageResult(IPage page,Class<T> var){
        Assert.notNull(var,"傳入的泛型類型不能爲空....");
        PageResult<T> pageResult = new PageResult<>();
        PageResult<T> result = createPageResult(page, pageResult, (x, y) -> {
            y.setList(Optional.ofNullable(x.getRecords()).orElse(new ArrayList()));
            y.setCurrPage((int) x.getCurrent());
            y.setPageSize((int) x.getSize());
            y.setTotalCount((int) x.getTotal());
            y.setHasMore(x.getPages() > x.getCurrent());
            return y;
        });
        return result;
    }






}

編寫測試類:

package com.wm.plus.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wm.plus.Result.PageResult;
import com.wm.plus.model.Student;
import com.wm.plus.util.CommonUtil;
import com.wm.plus.vo.StudentVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @class_name: StudentServiceTest
 * @description:
 * @author: wm_yu
 * @create: 2019/10/09
 **/
@RunWith(SpringRunner.class)
@SpringBootTest
public class StudentServiceTest {

    @Autowired
    private StudentService studentService;

    @Test
    public void selectByIdTest(){
        Page<Student> page = new Page<>();
        page.setOptimizeCountSql(true);
        page.setSize(3);
        IPage<Student> userPage = studentService.selectUserPage(page, "男");
        PageResult<StudentVo> pageResult = CommonUtil.dealPageResult(userPage, StudentVo.class);
        System.out.println("當前頁:" + pageResult.getCurrPage());
        System.out.println("總條數:" + pageResult.getTotalCount());
        System.out.println("是否有下一頁:" + pageResult.isHasMore());
        System.out.println("返回的list的大小:" + pageResult.getList().size());




    }


}

 

執行查看結果:

可以看到執行了兩次sql,並且執行的sql有limit的,也就是物理分頁,好了ok了

 

下面是官方給出的分頁查詢處理:

https://mp.baomidou.com/guide/page.html

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章