一、Maven

1.1 项目管理问题

项目中jar包资源越来越多,jar包的管理越来越沉重。

1.1.1 繁琐

要为每个项目手动导入所需的jar,需要搜集全部jar

1.1.2 复杂

项目中的jar如果需要版本升级,就需要再重新搜集jar

1.1.3 冗余

相同的jar在不同的项目中保存了多份

1.1.4 项目管理方案

java项目需要一个统一的便捷的管理工具:Maven

1.2 什么是Maven

Maven这个单词来自于意第绪语(犹太语),意为知识的积累.

Maven是一个基于项目对象模型(POM)的概念的纯java开发的开源的项目管理工具。主要用来管理java项目,进行依赖管理(jar包依赖管理)和项目构建(项目编译、打包、测试、部署)。此外还能分模块开发,提高开发效率。

Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。

Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。

1.3 Maven的作用

  • 依赖管理
    • 统一对jar包进行管理,避免从外部拷贝jar包,只需要从maven仓库中通过坐标获取,减小项目体积
  • 项目构建
    • maven提供一套对项目生命周期管理的标准。开发人员、和测试人员统一使用maven进行项目构建。项目生命周期管理:编译、测试、打包、部署、运行。
  • 统一项目结构
  • 拆分项目模块

二、 Maven安装和下载

2.1 下载

通过Maven官网进行下载http://maven.apache.org/download.cgi
在这里插入图片描述

在这里插入图片描述

2.2 所有版本

全部的maven版本地址:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/

2.3 Maven安装

2.3.1 解压

Maven解压即可使用

注意: 解压文件尽量不要放在含有中文或者特殊字符的目录下。

解压后,有如下目录:

bin:含有mvn运行的脚本
boot:含有plexus-classworlds类加载器框架,Maven 使用该框架加载自己的类库。
conf:含有settings.xml配置文件
lib:含有Maven运行时所需要的java类库

2.3.2 环境变量

系统变量:MAVEN_HOME =maven的解压路径

系统变量:path = %MAVEN_HOME%\bin

在这里插入图片描述

测试是否配置成功

在这里插入图片描述

三、Maven配置

3.1 配置maven本地仓库

maven的setting配置文件 (maven的安装目录下的conf文件夹下)

3.1.1 配置本地仓库的位置

在这里插入图片描述

3.1.2 配置公共仓库(阿里云的公共仓库)
<!--setting.xml中添加如下配置-->
<mirrors>
	<mirror>
        <id>aliyun</id>  
        <!-- 中心仓库的 mirror(镜像) -->
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <!-- aliyun仓库地址 以后所有要指向中心仓库的请求,都会指向aliyun仓库-->
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
    </mirror>
</mirrors>

3.2 JDK配置

标签中 增加 一个 标签,限定maven项目默认的jdk版本.

内容如下:

<profiles>
    <!-- 在已有的profiles标签中添加profile标签 -->
	<profile>    
        <id>myjdk</id>    
        <activation>    
            <activeByDefault>true</activeByDefault>    
            <jdk>1.8</jdk>    
        </activation>    
        <properties>    
            <maven.compiler.source>1.8</maven.compiler.source>    
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> 
        </properties>    
    </profile>
</profiles>
<!-- 让增加的 profile生效 -->
<activeProfiles>
    <activeProfile>myjdk</activeProfile>
</activeProfiles>

四、仓库

4.1 概念

  • 存储依赖的地方,体现形式就是本地的一个目录。
  • 仓库中不仅存放依赖,而且管理着每个依赖的唯一标识(坐标),Java项目凭坐标获取依赖。

4.2 仓库分类

仓库分类如下:

仓库分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A3lIegcd-1620607712787)(image/仓库分类.jpg)]

当需要依赖时,会从仓库中取查找,优先顺序为:

本地仓库 > 私服(如果配置了的话) > 公共仓库(如果配置了的话) > 中央仓库

4.3 本地仓库

即在settings.xml 中配置的目录。

使用过了的依赖都会自动存储在本地仓库中,后续可以复用。

4.4 远程仓库

4.4.1 中央仓库
  • Maven 中央仓库是由 Maven 社区提供的仓库,不用任何配置,maven中内置了中央仓库的地址。

其中包含了绝大多数流行的开源Java构件。

  • https://mvnrepository.com/ 可以搜索需要的依赖的相关信息(仓库搜索服务)

http://repo.maven.apache.org/maven2/ 中央仓库地址

4.4.2 公共仓库【重点
  • 除中央仓库之外,还有其他远程仓库。
    比如aliyun仓库(http://maven.aliyun.com/nexus/content/groups/public/)
  • 中央仓库在国外,下载依赖速度过慢,所以都会配置一个国内的公共仓库替代中央仓库。
<!--setting.xml中添加如下配置-->
<mirrors>
	<mirror>
        <id>aliyun</id>  
        <!-- 中心仓库的 mirror(镜像) -->
        <mirrorOf>central</mirrorOf>    
        <name>Nexus aliyun</name>
        <!-- aliyun仓库地址 以后所有要指向中心仓库的请求,都会指向aliyun仓库-->
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
    </mirror>
</mirrors>
4.4.3 私服【了解】

公司范围内共享的仓库,不对外开放。

可以通过 Nexus来创建、管理一个私服。

五、IDEA中使用Maven

5.1 maven 关联IDEA

在idea中关联本地安装的maven,后续就可以通过idea使用maven,管理项目啦。

全局设置:File ---- > other setting ----> setting for new Projects

在这里插入图片描述

5.2 使用maven创建Java工程

在这里插入图片描述在这里插入图片描述

5.3 Maven项目的结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LJzYbiS4-1620607712792)(image\image-20200810142600320.png)]

5.4 使用Maven创建Web工程

5.4.1 通过java项目改造成Web项目
  • 1、将项目的打包方式改为war
  • 2、手动添加webapp目录、WEB-INF目录、web.xml配置文件在这里插入图片描述

使用Maven创建的Web工程缺少WEB-INF以及web.xml文件,需要自行补齐可以创建一个web.xml文件模板
在这里插入图片描述

5.4.2 使用骨架创建Web项目

在这里插入图片描述

  • 1、补充java目录、resource目录、test目录(java、resource)
    在这里插入图片描述

5.5 启动Web项目

5.5.1 打包到外部tomcat中运行
5.5.2 IDEA中添加tomcat运行
5.5.3 使用maven中tomcat插件运行
  • pom中添加maven插件
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <!-- 指定端口 -->
                <port>8888</port>
                <!-- 请求路径 -->
                <path>/</path>
            </configuration>
        </plugin>
    </plugins>
</build>

在这里插入图片描述

  • 配置maven启动
    在这里插入图片描述

六、Maven的核心概念

6.1 坐标

6.1.1 Maven的坐标

在平面几何中坐标(x,y)可以标识平面中唯一的一点。在maven中坐标就是为了定位一个唯一确定的jar包。Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范,拥有了统一规范,就可以把查找工作交给机器

Maven坐标主要组成(GAV) -确定一个jar在互联网位置

groupId:定义当前Maven组织名称(公司域名倒置)

artifactId:定义实际项目名称

version:定义当前项目的当前版本

6.1.2 查找坐标

访问http://www.mvnrepository.com或者http://search.maven.org/网站

在这里插入图片描述

6.2 依赖(了解)

6.2.1 依赖范围
依赖范围 编译 测试 运行 举例
compile druid
test junit
provided servlet-api
runtime mysql
  • compile
    • 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
  • test
    • 测试依赖范围。只对于测试classpath有效
  • provided
    • 已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效
  • runtime
    • 运行时提供。例如:jdbc驱动
<dependencies>
    <dependency>
        <groupId>com.qf</groupId>
        <artifactId>maven01</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <!-- 依赖范围   provided表示运行期无效,编译、测试期有效 -->
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <!-- 依赖范围  测试期间有效。编译、运行期无效           -->
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
        <!-- 依赖范围  只在测试、运行期有效。编译期无效           -->
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.16</version>
        <!--依赖范围: 在编译、运行、测试都有效。默认选项-->
        <scope>compile</scope>
    </dependency>
</dependencies>
6.2.2 依赖传递

pro3 依赖pro2 ,pro2 依赖 pro1

pro3中可以使用pro2和pro1中的依赖(jar包)

如果pro1中的依赖是test或者provided,那么pro2和pro3无法使用pro1中依赖

6.2.3 依赖冲突

pro3 依赖pro2 ,pro2 依赖 pro1

如果pro2中有与pro1中相同的依赖,但是版本不一样,pro3优先依赖于pro2中的依赖

6.2.4 可选依赖

pro2 依赖 pro1

如果pro1中的依赖不想被pro2使用,可以将依赖设置为可选依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.10</version>
    <!-- 设置为可选依赖,依赖此工程的其他工程将无法依赖到此jar包-->
    <optional>true</optional>
</dependency>
6.2.5 排除依赖

pro3 依赖pro2 ,pro2 依赖 pro1

pro3中可以排除对pro1的依赖

<dependency>
    <groupId>org.example</groupId>
    <artifactId>mavenproject02</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 排除依赖传递下来的依赖,可以写多个 -->
    <exclusions>
        <exclusion>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </exclusion>
    </exclusions>
</dependency>

七、 Maven常用命令【生命周期】

7.1 命令说明

  • mvn compile

完成编译操作
执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件。

  • mvn clean

执行完毕后,会将target目录删除。

  • mvn test

完成单元测试操作

执行完毕后,会在target目录中生成三个文件夹:surefire、surefire-reports(测试报告)、test-classes(测试的字节码文件)

  • mvn package

完成打包操作
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

  • mvn install

install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库

  • mvn deploy

deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库

7.2 使用Maven面板

  • 在IDEA中使用插件执行maven命令
    在这里插入图片描述

7.3 使用命令行

在IDEA中使用命令行执行maven命令

在这里插入图片描述

八、聚合工程

8.1 项目打包方式

jar:是为了创建java工程

war:是为了创建web工程

pom:就是在聚合工程中创建管理我们jar和war工程的管理类的工程

8.2 项目结构

  • 创建shop(父工程pom)
  • commons(通用模块jar)
  • entity(实体类模块jar)
  • dao(数据访问模块jar)
  • service(业务逻辑模块jar)
  • portal(前台系统模块war)
  • manager(后台系统模块war)

依赖说明

dao 依赖 commons、entity

service 依赖 dao

portal 依赖 service

manager 依赖 service

项目结构

在这里插入图片描述

8.3 父工程管理版本

统一管理依赖以及版本号

父工程的pom文件

<!-- 集中定义依赖版本号 -->
<properties>
    <junit.version>4.12</junit.version>
    <spring.version>5.2.2.RELEASE</spring.version>
    <mybatis.version>3.5.6</mybatis.version>
    <mysql.version>5.1.47</mysql.version>
    <jackson.version>2.4.2</jackson.version>
    <druid.version>1.0.9</druid.version>
    <jstl.version>1.2</jstl.version>
</properties>
 <!-- 管理jar包,不会引入 ,如果子工程需要哪些jar包,则具体地在子工程中引入,不需要写版本号-->
<dependencyManagement>
    <dependencies>
        <!-- 单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
         <!-- 数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>    

子工程中的pom文件

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

九、私服【了解】

9.1 概念
  • 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。
  • 有了私服之后,当 Maven 需要下载依赖时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。
  • 私服可以解决在企业做开发时每次需要的jar包都要在中心仓库下载,且每次下载完只能被自己使用,不能被其他开发人员使用
  • 所谓私服就是一个服务器,但是不是本地层面的,是公司层面的,公司中所有的开发人员都在使用同一个私服
9.2 架构
无私服 有私服
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQo4fN3X-1620607712802)(image/私服1.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rBgmlgQ2-1620607712803)(image/私服2.png)]

我们可以使用专门的 Maven 仓库管理软件来搭建私服,比如:Apache ArchivaArtifactorySonatype Nexus。这里我们使用 Sonatype Nexus

9.3 Nexus安装【了解】
9.3.1 下载
9.3.2 安装

下载nexus-2.x-bundle.zip,解压即可

nexus安装目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RJHyEZ7i-1620607712804)(image/私服3.jpg)]
9.4 启动【了解】
  • 解压后在bin目录中执行:
    • nexus install 在系统中安装nexus服务
    • nexus uninstall 卸载nexus服务
    • nexus start 启动服务
    • nexus stop 停止服务
9.5 Nexus登录【了解】

访问私服:http://localhost:8081/nexus/

登录Nexus才可以使用Nexus管理功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WEGZV4h7-1620607712804)(image/私服_login.jpg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R4uYBiga-1620607712805)(image/私服_login2.jpg)]
9.6 仓库列表【了解】
仓库类型 描述
group 包含多个仓库,通过group库的地址可以从包含的多个仓库中查找构件
hosted 私服 服务器本地的仓库,其中存储诸多构件
proxy 代理仓库,其会关联一个远程仓库, 比如中央仓库,aliyun仓库,向该仓库查找构件时,如果没有会从其关联的仓库中下载
仓库名 描述
Releases 存放项目的稳定发布版本,一个模块做完后如果需要共享给他人,可以上传到私服的该库
Snapshots 对应不稳定的发布版本
3rd party 存放中央仓库没有的 ,如ojdbc.jar,可以上传到私服的该库中
仓库列表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S39fFq9n-1620607712806)(image/私服_list.jpg)]
9.7 Maven配置私服 (搭建)【重点

在maven中配置私服,使得maven可以从私服上获取构件

9.7.1 仓库组

而此时就有问题,私服中有很多仓库,每个仓库都有自己的url,则项目中配置哪个仓库呢 ?

私服中有一个仓库组,组中包含多个仓库,可以指定仓库组的url,即可从多个仓库中获取构件

仓库组 注意:proxy的仓库排序在最后
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PcoZDmdf-1620607712806)(image/私服_deploy2.jpg)]
9.7.2 Maven关联私服

配置settings.xml,设置私服地址、认证等信息

<servers>
	<server> 
		<id>nexus-public</id> <!-- nexus的认证id -->
		<username>admin</username> <!--nexus中的用户名密码-->
		<password>admin123</password> 
	</server>
</servers>
<profiles>
	<profile> 
        <id>nexus</id> 
        <repositories> 
            <repository> 
                <!--nexus认证id 【此处的repository的id要和 <server>的id保持一致】-->
                <id>nexus-public</id> 
                <!--name随便-->
                <name>Nexus Release Snapshot Repository</name> 
                <!--地址是nexus中仓库组对应的地址-->
                <url>http://localhost:8081/nexus/content/groups/public/</url>
                <releases><enabled>true</enabled></releases> 
                <snapshots><enabled>true</enabled></snapshots> 
            </repository>
        </repositories> 
        <pluginRepositories> <!--插件仓库地址,各节点的含义和上面是一样的-->
            <pluginRepository> 
                <!--nexus认证id 【此处的repository的id要和 <server>的id保持一致】-->
                <id>nexus-public</id> 
                <!--地址是nexus中仓库组对应的地址-->
                <url>http://localhost:8081/nexus/content/groups/public/</url>
                <releases><enabled>true</enabled></releases> 
                <snapshots><enabled>true</enabled></snapshots> 
            </pluginRepository> 
        </pluginRepositories> 
    </profile>
</profiles>
<activeProfiles>
    <activeProfile>yourjdk</activeProfile>
    <!-- 使私服配置生效 -->
    <activeProfile>nexus</activeProfile>
</activeProfiles>

至此,Maven项目中需要依赖时,Maven会从私服中下载

9.8 Maven项目部署到私服
  • 执行 :mvn deploy 即可将项目部署到私服对应的仓库中,此时项目中的打包方式多为jar
  • 但需要提前在项目的pom.xml中配置部署私服仓库位置,如下:
    ...
	<dependencies>
		.....
	</dependencies>
	
	<!-- 在项目的pom.xml中 配置私服的仓库地址,可以将项目打jar包部署到私服 -->
	<distributionManagement>
        <repository>
            <id>nexus-public</id> <!-- nexus认证id -->
            <url>http://localhost:8081/nexus/content/repositories/releases</url>
        </repository>
        <snapshotRepository>
            <id>nexus-public</id> <!-- nexus认证id -->
            <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
        </snapshotRepository>
	</distributionManagement>
</project>

注意:如上的 repository的 id 依然是要和settings.xml中配置的server中的id 一致,才能通过私服的认证

10、mybatis缓存

mybatis一共有两级缓存,分别是一级缓存和二级缓存。默认开启了一级缓存

10.1 一级缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一级缓存是mybatis中默认开启的

生命周期:在同一个SqlSession下

  • 一级缓存何时生效
    • 默认生效
  • 一级缓存何时失效
    • 1、两次查询使用不是同一个SqlSession
    • 2、手动将缓存清空
    • 3、当sqlSession关闭之后
    • 4、当两次查询操作中间,如果执行了增删改的操作,缓存失效
10.2 二级缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-To8S16kK-1621263802906)(image\二级缓存.png)]

mybatis中二级缓存是需要手动开启

生命周期: 二级缓存是在namespace级别

  • 二级缓存生效:
    • 1、在主配置文件中开启二级缓存
    • 2、在mapper映射文件中添加标签
    • 3、在查询之间,SqlSession需要提交
    • 4、如果没有缓存配置,那么这个类需要实现序列化接口
  • 二级缓存失效
    • 1、当两次查询操作中间,如果执行了增删改的操作,二级缓存失效

开启二级缓存

<configuration>
    <!-- 开启二级缓存(当前这个版本是默认开启的)   -->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    ...
</configuration>

mapper映射配置缓存

<!--
      eviction:缓存淘汰策略 FIFO(先进先出)  LRU(最近最少使用)
      flushInterval:缓存的刷新时间
      size:缓存的大小
      readOnly:缓存只读
-->
<cache  eviction="LRU"
        flushInterval="60000"
        size="512"
        readOnly="true"/>

11 、分页插件

11.1 概念

PageHelper是适用于MyBatis框架的一个分页插件,使用方式极为便捷,支持任何复杂的单表、多表分页查询操作。

11.2 访问与下载

官方网站:https://pagehelper.github.io/

下载地址:https://github.com/pagehelper/Mybatis-PageHelper

11.3 开发步骤
11.3.1 引入依赖

pom.xml中引入PageHelper依赖。

 <!-- 引入分页插件依赖 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.10</version>
</dependency>
11.3.2 配置MyBatis-config.xml

在MyBatis-config.xml中添加< plugins >。

<configuration>
  	<typeAliases></typeAliases>
  
   <plugins>
        <!-- 添加分页拦截器查询   -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>
  
  	<environments>...</environments>
</configuration>
11.3.3 PageHelper使用
@Test
public void test01() throws IOException {
    SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
    SqlSessionFactory sf = sfb.build(Resources.getResourceAsReader("mybatis-config.xml"));
    SqlSession sqlSession = sf.openSession();
    EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
    //在查询之前执行!!!!
    PageHelper.startPage(3,3);
    List<Emp> empList = empMapper.getAll();
    PageInfo pageInfo = new PageInfo(empList);
    //empList.stream().forEach(System.out::println);
    System.out.println(pageInfo);
}
11.4 PageInfo对象

PageInfo对象中包含了分页操作中的所有相关数据。

PageInfo结构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HGVeXOQj-1621263802909)(image/image-20200116145234073.png)]
11.4.1 PageInfo应用方式

使用PageInfo保存分页查询结果。

/**
 *  分页插件(物理分页 (sql语句中添加limit))
 *  1、导入pageHelper依赖
 *  2、在mybatis核心配置文件中添加插件(配置分页拦截器)
 *  3、在执行查询操作之前执行 PageHelper.startPage(当前页,每页条数)
 *  4、如果要获取完整结果,创建一个PageInfo对象即可(PageInfo pageInfo = new PageInfo(empList);)
 */

//创建一个分页信息类
PageInfo<Product> pageInfo = new PageInfo<>(productList);
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐