首先,引入依賴:
<?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