NO.06 自定义映射resultMap

news/2024/11/17 5:28:18/

目录

1、前言

2、resultMap处理字段和属性的映射关系

2.1 通过resultMap为字段起别名的方式,保证和实体类中的属性名保持一致。

2.2在MyBatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase

3、 多对一映射

3.1 前置工作

3.2 级联方式处理映射关系

3.3 使用association处理映射关系

3.4 分步查询

3.4.1 延迟加载

4、一对多映射

4.1 前置工作

4.2 级联方式处理映射关系

4.3 分步查询

4.3.1 延迟加载

5、 测试方法


1、前言

在之前的博客中,实体类的属性名和数据库表的字段名是一致的,因此能正确地查询出所需要的数据。当实体类的属性名与数据库表的字段名不一致时,会导致查询出来的数据为空指针。要解决这个问题就需要使用resultMap自定义映射。

使用的表分别为:t_minister、t_dutie,结构如下:

  

  使用的实体类分别为:Minister类

public class Minister {private Integer id;private String ministerName;private String age;private char gender;private Integer ministerDutie;private Dutie dutie;public Minister() {}public Minister(Integer id, String ministerName, String age, char gender, Integer ministerDutie) {this.id = id;this.ministerName = ministerName;this.age = age;this.gender = gender;this.ministerDutie = ministerDutie;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getMinisterName() {return ministerName;}public void setMinisterName(String ministerName) {this.ministerName = ministerName;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}public Integer getMinisterDutie() {return ministerDutie;}public void setMinisterDutie(Integer ministerDutie) {this.ministerDutie = ministerDutie;}@Overridepublic String toString() {return "Minister{" +"id=" + id +", ministerName='" + ministerName + '\'' +", age='" + age + '\'' +", gender=" + gender +", ministerDutie='" + ministerDutie + '\'' +", dutie=" + dutie +'}';}
}

 Dutie类

public class Dutie {private Integer dutieId;private String dutieName;public Dutie() {}public Dutie(Integer dutieId, String dutieName) {this.dutieId = dutieId;this.dutieName = dutieName;}public Integer getDutieId() {return dutieId;}public void setDutieId(Integer dutieId) {this.dutieId = dutieId;}public String getDutieName() {return dutieName;}public void setDutieName(String dutieName) {this.dutieName = dutieName;}@Overridepublic String toString() {return "Dutie{" +"dutieId=" + dutieId +", dutieName='" + dutieName + '\'' +'}';}
}

2、resultMap处理字段和属性的映射关系

对于查询操作,若字段名和实体类中的属性名一致时,可以通过resultType指定结果类型;若字段名和实体类中的属性名不一致,则通过resultMap设置自定义映射。

若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用_),实体类中的属性 名符合Java的规则(使用驼峰),此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系。

2.1 通过resultMap为字段起别名的方式,保证和实体类中的属性名保持一致。

在MinisterMapper接口中声明方法getMalMinisterByVague(@Param("gender") String gender),该方法的返回值类型为List集合,List集合中存储Minister类型的数据,采用@Param注解的方式获取参数。

    //采用模糊查询,查找性别为男的人员List<Minister> getMalMinisterByVague(@Param("gender") String gender);

在映射文件中实现Sql语句,采用resultMap自定义映射。通过resultMap的value值匹配自定义映射resultMap中id的value值。

<!--    List<Minister> getMalMinisterByVague(@Param("gender") String gender);--><select id="getMalMinisterByVague" resultMap="MinisterMaperr">select *from t_minister where gender like '%${gender}%'</select>

对于自定义映射resultMap标签,resultMap:设置自定义映射

属性:     id:表示自定义映射的唯一标识                    type:查询的数据要映射的实体类的类型

子标签:   id:设置主键的映射关系                             result:设置普通字段的映射关系

子标签中的属性:  property:实体类的属性名      column:表的字段名

    <resultMap id="MinisterMaperr" type="Minister"><id property="id" column="id"></id><result property="ministerName" column="minister_name"></result><result property="age" column="age"></result><result property="ministerDutie" column="minister_dutie"></result></resultMap>

完整的映射文件: 

<!--    List<Minister> getMalMinisterByVague(@Param("gender") String gender);--><select id="getMalMinisterByVague" resultMap="MinisterMaperr">select *from t_minister where gender like '%${gender}%'</select><resultMap id="MinisterMaperr" type="Minister"><id property="id" column="id"></id><result property="ministerName" column="minister_name"></result><result property="age" column="age"></result><result property="ministerDutie" column="minister_dutie"></result></resultMap>

2.2在MyBatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase

可以在MyBatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase,可以在查询表中数据时,自动将_类型的字段名转换为驼峰。

例如:字段名user_name,设置了mapUnderscoreToCamelCase,此时字段名就会转换为 userName。

此时不需要使用resultMap自定义映射,只需要使用resultType指定结果类型即可。

在MinisterMapper接口中声明方法getMaleMinisterByProfile(@Param("gender") String gender),该方法的返回值类型为List集合,List集合中存储Minister类型的数据,采用@Param注解的方式获取参数。

    //通过配置文件,使用模糊查询获得所有男性人员信息List<Minister> getMaleMinisterByProfile(@Param("gender") String gender);

在映射文件中实现Sql语句,采用resultType指定结果类型。

<!--    List<Minister> getMaleMinisterByProfile(@Param("gender") String gender);--><select id="getMaleMinisterByProfile" resultType="Minister">select *from t_minister where gender like '%${gender}%'</select>

3、 多对一映射

3.1 前置工作

在MinisterMapper类中添加一个private Dutie dutie属性,添加对应的GET和SET方法,重写toString方法。

3.2 级联方式处理映射关系

在MinisterMapper接口中声明方法getGeneralMinisterByCascade(@Param("ministerDutie") Integer ministerDutie),该方法的返回值类型为List集合,List集合中存储Minister类型的数据,采用@Param注解的方式获取参数。

    //查询职称为武将的人员信息,级联方式实现多对一映射List<Minister> getGeneralMinisterByCascade(@Param("ministerDutie") Integer ministerDutie);

在映射文件中实现Sql语句,采用resultMap自定义映射。通过resultMap的value值匹配自定义映射resultMap中id的value值

<!--    List<Minister> getGeneralMinisterByCascade(@Param("ministerDutie") Integer ministerDutie);--><select id="getGeneralMinisterByCascade" resultMap="GeneralMinisterByCascade">select  t_minister.*,t_dutie.* from t_minister left join t_dutie  on t_minister.minister_dutie=t_dutie.dutie_id where t_minister.minister_dutie=#{ministerDutie}</select>

 配置文件中property="dutie.dutieId"h和property="dutie.dutieName"中的dutie是Minister类的属性名dutie,”.“后的属性名是Dutie类中的属性名;column="dutie_id"和column="dutie_name"中的value值对应的是t_dutie表的字段名。

    <resultMap id="GeneralMinisterByCascade" type="Minister"><id property="id" column="id"></id><result property="ministerName" column="minister_name"></result><result property="age" column="age"></result><result property="gender" column="gender"></result><result property="ministerDutie" column="minister_dutie"></result><result property="dutie.dutieId" column="dutie_id"></result><result property="dutie.dutieName" column="dutie_name"></result></resultMap>

 完整的映射文件: 

<!--    List<Minister> getGeneralMinisterByCascade(@Param("ministerDutie") Integer ministerDutie);--><select id="getGeneralMinisterByCascade" resultMap="GeneralMinisterByCascade">select  t_minister.*,t_dutie.* from t_minister left join t_dutie  on t_minister.minister_dutie=t_dutie.dutie_id where t_minister.minister_dutie=#{ministerDutie}</select><resultMap id="GeneralMinisterByCascade" type="Minister"><id property="id" column="id"></id><result property="ministerName" column="minister_name"></result><result property="age" column="age"></result><result property="gender" column="gender"></result><result property="ministerDutie" column="minister_dutie"></result><result property="dutie.dutieId" column="dutie_id"></result><result property="dutie.dutieName" column="dutie_name"></result></resultMap>

3.3 使用association处理映射关系

通过在映射文件配置resultMap标签中的子标签association实现多对一映射。

在MinisterMapper接口中声明方法getGeneralMinisterByDutie(@Param("ministerDutie") Integer ministerDutie),该方法的返回值类型为List集合,List集合中存储Minister类型的数据,采用@Param注解的方式获取参数。

    //查询职称为武将的人员信息,实现多对一映射List<Minister> getGeneralMinisterByDutie(@Param("ministerDutie") Integer ministerDutie);

在映射文件中实现Sql语句,采用resultMap自定义映射。通过resultMap的value值匹配自定义映射resultMap中id的value值。

<!--    List<Minister> getGeneralMinisterByDutie(@Param("ministerDutie") Integer ministerDutie);--><select id="getGeneralMinisterByDutie" resultMap="GeneralMinisterByDutie">select *from t_minister where minister_dutie=#{ministerDutie}</select>

对于自定义映射resultMap标签中的子标签association属性: 

property:实体类的属性名                          javaType:设置property对象对应的实体类类型

association标签中的子标签属性:

property:javaType实体类的属性名              column:javaType实体类对应表的字段名

    <resultMap id="GeneralMinisterByDutie" type="Minister"><id property="id" column="id"></id><result property="ministerName" column="minister_name"></result><result property="age" column="age"></result><result property="gender" column="gender"></result><result property="ministerDutie" column="minister_dutie"></result><association property="dutie" javaType="Dutie"><id property="dutieId" column="dutie_id"></id><result property="dutieName" column="dutie_name"></result></association></resultMap>

完整的映射文件: 

<!--    List<Minister> getGeneralMinisterByDutie(@Param("ministerDutie") Integer ministerDutie);--><select id="getGeneralMinisterByDutie" resultMap="GeneralMinisterByDutie">select *from t_minister where minister_dutie=#{ministerDutie}</select><resultMap id="GeneralMinisterByDutie" type="Minister"><id property="id" column="id"></id><result property="ministerName" column="minister_name"></result><result property="age" column="age"></result><result property="gender" column="gender"></result><result property="ministerDutie" column="minister_dutie"></result><association property="dutie" javaType="Dutie"><id property="dutieId" column="dutie_id"></id><result property="dutieName" column="dutie_name"></result></association></resultMap>

3.4 分步查询

目标:使用分步查询获取人员的信息,再通过人员的minister_dutie的属性值获取人员的部门信息。

分步查询的实质就是执行两条Sql语句,在MinisterMapper的映射文件中使用分步查询之前需要实现DutieMapper接口中部门信息的查询方法。

下面是实现DutieMapper接口中部门信息的查询方法。

在DutieMapper接口中声明getDutieByDutieId(@Param("dutieId") Integer dutieId)方法,该方法的返回值类型为Dutie类型,采用@Param注解的方式获取参数值。

    //通过dutieId查询人员的部门信息,分步查询第二步Dutie getDutieByDutieId(@Param("dutieId") Integer dutieId);

在对应的映射文件中实现Sql语句,采用resultMap自定义映射的方式指定结果类型。

<!--    Dutie getDutieByDutieId(@Param("dutieId") Integer dutieId);--><select id="getDutieByDutieId" resultMap="DutieByDutieId">select *from t_dutie where dutie_id=#{dutieId}</select><resultMap id="DutieByDutieId" type="Dutie" ><id property="dutieId" column="dutie_id"></id><result property="dutieName" column="dutie_name"></result></resultMap>

下面是实现MinisterMapper接口中分步查询。

在MinisterMapper接口声明getMinisterByStep(@Param("dutieId") Integer dutieId)方法,方法的返回值为List集合,存储的数据类型为Minister类型,采用@Param注释的方法获取参数值。

    //采用分步查询获取dutieId为3的人员信息,分步查询第一步List<Minister> getMinisterByStep(@Param("dutieId") Integer dutieId);

在对应的映射文件中实现Sql语句,采用resultMap自定义映射。

<!--    Minister getMinisterByStep(@Param("dutieId") Integer dutieId);--><select id="getMinisterByStep" resultMap="MinisterByStep">select *from t_minister where minister_dutie=#{dutieId}</select><resultMap id="MinisterByStep" type="Minister"><id property="id" column="id"></id><result property="ministerName" column="minister_name"></result><result property="age" column="age"></result><result property="gender" column="gender"></result><result property="ministerDutie" column="minister_dutie"></result><association property="dutie" select="com.review.mybaties.mapper.DutieMapper.getDutieByDutieId" column="minister_dutie"></association></resultMap>

上述映射文件中association标签中的property="dutie"属性的value是Minister类的属性名,select的value定位分步查询第二步的方法位置,column的属性值是实体类Minister对应表的字段名minister_dutie,也是传给第二步查询参数的值。

3.4.1 延迟加载

分步查询的优点是可以实现延迟加载,如果要开启延迟加载需要在MyBatis的核心配置文件的settings的子标签setting的name属性设置为lazyLoadingEnabled,value值为true,默认值为false关闭延迟加载;设置lazyLoadingEnabled后,还需设置aggressiveLazyLoading开启按需加载,当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载,aggressiveLazyLoading的默认值为false开启按需加载。

    <settings>
<!--        开启延迟加载--><setting name="lazyLoadingEnabled" value="true"/>
<!--        开启按需加载--><setting name="aggressiveLazyLoading" value="false"/></settings>

对于【3.4】的操作 ,如果输出的结果不包含dutie属性,则程序仅仅执行第一步,不会执行分步查询第二步。除非输出结果包含dutie属性,程序才会执行分步查询第二步。

值得注意的是不是所有的分步加载都需要延迟加载,对于不需要延迟加载的分布操作,可以在association标签中设置fetchType属性的值,value为eager时,为立即加载,不支持延迟加载;为lazy时可以延迟加载。

如下resultMap自定义映射,分步查询支持延迟加载。

    <resultMap id="MinisterByStep" type="Minister"><id property="id" column="id"></id><result property="ministerName" column="minister_name"></result><result property="age" column="age"></result><result property="gender" column="gender"></result><result property="ministerDutie" column="minister_dutie"></result><association property="dutie" 
fetchType="lazy" select="com.review.mybaties.mapper.DutieMapper.getDutieByDutieId" column="minister_dutie"></association></resultMap>

4、一对多映射

4.1 前置工作

在Dutie类中添加一个private List<Minister> minister属性,添加对应的GET和SET方法,重写toString方法。

处理一对多的关系需要使用resultMap中的子标签collection,collection中的属性 ofType:设置collection标签所处理的集合属性中存储数据的类型。

4.2 级联方式处理映射关系

在DutieMapper接口中创建getAllMinisterByDutieId(@Param("dutieId") Integer dutieId)方法,方法的返回值类型是Dutie类型,采用@Param注解的方式获取参数。

    //根据部门dutie_id查询该部门所有员工Dutie getAllMinisterByDutieId(@Param("dutieId") Integer dutieId);

在映射文件中实现Sql语句,采用resultMap自定义映射。

<!--    Dutie getAllMinisterByDutieId(@Param("dutieId") Integer dutieId);--><select id="getAllMinisterByDutieId" resultMap="MinisterByDutieId">select * from t_dutie d left join t_minister m on d.dutie_id=m.minister_dutie where d.dutie_id=#{dutieId}</select><resultMap id="MinisterByDutieId" type="Dutie"><id property="dutieId" column="dutie_id"></id><result property="dutieName" column="dutie_name"></result><collection property="minister" ofType="Minister" ><id property="id" column="id"></id><result property="ministerName" column="minister_name"></result><result property="age" column="age"></result><result property="gender" column="gender"></result><result property="ministerDutie" column="minister_dutie"></result></collection></resultMap>

4.3 分步查询

目标:使用分步查询查询官职信息,人员信息。

分步查询的实质就是执行两条Sql语句,在DutieMapper的映射文件中使用分步查询之前需要实现MinisterMapper接口中人员信息的查询方法。

下面是实现MinisterMapper接口中人员信息查询方法。

    //根据ministerDutie查询人员信息,分步查询第二步List<Minister> getMinisterByMinisterDutie(@Param("ministerDutie") Integer ministerDutie);

在映射文件中实现Sql语句,采用resultMap自定义映射

<!--    List<Minister> getMinisterByMinisterDutie(@Param("ministerDutie") Integer ministerDutie);--><select id="getMinisterByMinisterDutie" resultMap="MinisterMaperr">select *from t_minister where minister_dutie=#{ministerDutie}</select><resultMap id="MinisterMaperr" type="Minister"><id property="id" column="id"></id><result property="ministerName" column="minister_name"></result><result property="age" column="age"></result><result property="ministerDutie" column="minister_dutie"></result></resultMap>

下面在DutieMapper接口中声明getAllMinisterByDutieId(@Param("dutieId") Integer dutieId)方法。

    //根据部门dutie_id查询该部门所有员工,分步查询第一步Dutie getAllMinisterByDutieId(@Param("dutieId") Integer dutieId);

在映射文件中实现Sql语句,标签collection表示一个集合,因此需要使用ofType属性指定集合中存储的类型

<!--    Dutie getAllMinisterByStep(@Param("dutieId") Integer dutieId);--><select id="getAllMinisterByStep" resultMap="AllMinisterByStep">select * from t_dutie where dutie_id=#{dutieId}</select><resultMap id="AllMinisterByStep" type="Dutie"><id property="dutieId" column="dutie_id"></id><result property="dutieName" column="dutie_name"></result><collection property="minister" select="com.review.mybaties.mapper.MinisterMapper.getMinisterByMinisterDutie" column="dutie_id"></collection></resultMap>

4.3.1 延迟加载

 参考本篇博客的【3.4.1】

5、 测试方法

    @Testpublic void getMalMinisterByVague() {SqlSession sqlSession= JdbcUtiles.getSqlSession();//创建MinisterMapper的代理实现类对象MinisterMapper ministerMapper=sqlSession.getMapper(MinisterMapper.class);List<Minister> list=ministerMapper.getMalMinisterByVague("男");for(Minister minister:list){System.out.println(minister);}JdbcUtiles.closeSqlSession(sqlSession);}@Testpublic void getMaleMinisterByProfile() {SqlSession sqlSession= JdbcUtiles.getSqlSession();//创建MinisterMapper的代理实现类对象MinisterMapper ministerMapper=sqlSession.getMapper(MinisterMapper.class);List<Minister> list=ministerMapper.getMaleMinisterByProfile("男");for(Minister minister:list){System.out.println(minister);}JdbcUtiles.closeSqlSession(sqlSession);}@Testpublic void getGeneralMinisterByDutie() {SqlSession sqlSession= JdbcUtiles.getSqlSession();//创建MinisterMapper的代理实现类对象MinisterMapper ministerMapper=sqlSession.getMapper(MinisterMapper.class);List<Minister> list=ministerMapper.getGeneralMinisterByDutie(2);for(Minister minister:list){System.out.println(minister);}JdbcUtiles.closeSqlSession(sqlSession);}@Testpublic void getGeneralMinisterByCascade() {SqlSession sqlSession= JdbcUtiles.getSqlSession();//创建MinisterMapper的代理实现类对象MinisterMapper ministerMapper=sqlSession.getMapper(MinisterMapper.class);List<Minister> list=ministerMapper.getGeneralMinisterByCascade(2);for(Minister minister:list){System.out.println(minister);}JdbcUtiles.closeSqlSession(sqlSession);}@Testpublic void getDutieByDutieId() {SqlSession sqlSession= JdbcUtiles.getSqlSession();//创建MinisterMapper的代理实现类对象DutieMapper dutieMapper=sqlSession.getMapper(DutieMapper.class);Dutie dutie=dutieMapper.getDutieByDutieId(2);System.out.println(dutie);JdbcUtiles.closeSqlSession(sqlSession);}@Testpublic void getMinisterByStep() {SqlSession sqlSession= JdbcUtiles.getSqlSession();//创建MinisterMapper的代理实现类对象MinisterMapper ministerMapper=sqlSession.getMapper(MinisterMapper.class);List<Minister> list=ministerMapper.getMinisterByStep(2);for(Minister minister:list){System.out.println(minister);}JdbcUtiles.closeSqlSession(sqlSession);}@Testpublic void getMinisterByNeedStep() {SqlSession sqlSession= JdbcUtiles.getSqlSession();//创建MinisterMapper的代理实现类对象MinisterMapper ministerMapper=sqlSession.getMapper(MinisterMapper.class);List<Minister> list=ministerMapper.getMinisterByStep(2);for(Minister minister:list){System.out.println(minister.getMinisterName());}JdbcUtiles.closeSqlSession(sqlSession);}@Testpublic void getAllMinisterByDutieId() {SqlSession sqlSession= JdbcUtiles.getSqlSession();//创建MinisterMapper的代理实现类对象DutieMapper dutieMapper=sqlSession.getMapper(DutieMapper.class);Dutie dutie=dutieMapper.getAllMinisterByDutieId(2);System.out.println(dutie);JdbcUtiles.closeSqlSession(sqlSession);}@Testpublic void getAllMinisterByStep() {SqlSession sqlSession= JdbcUtiles.getSqlSession();//创建MinisterMapper的代理实现类对象DutieMapper dutieMapper=sqlSession.getMapper(DutieMapper.class);Dutie dutie=dutieMapper.getAllMinisterByStep(2);System.out.println(dutie);JdbcUtiles.closeSqlSession(sqlSession);}


http://www.ppmy.cn/news/1055709.html

相关文章

【自动驾驶】TI SK-TDA4VM 开发板上电调试,AI Demo运行

1. 设备清单 TDA4VM Edge AI 入门套件【略】USB 摄像头(任何符合 V4L2 标准的 1MP/2MP 摄像头,例如:罗技 C270/C920/C922)全高清 eDP/HDMI 显示屏最低 16GB 高性能 SD 卡连接到互联网的 100Base-T 以太网电缆【略】UART电缆外部电源或电源附件要求: 标称输出电压:5-20VDC…

Linux线程 --- 生产者消费者模型(C语言)

在学习完线程相关的概念之后&#xff0c;本节来认识一下Linux多线程相关的一个重要模型----“ 生产者消费者模型” 本文参考&#xff1a; Linux多线程生产者与消费者_红娃子的博客-CSDN博客 Linux多线程——生产者消费者模型_linux多线程生产者与消费者_两片空白的博客-CSDN博客…

AI 绘画Stable Diffusion 研究(十四)SD 图生图+剪映制作人物说话视频

大家好&#xff0c;我是风雨无阻。 前一篇&#xff0c;我们详细介绍了使用 SadTlaker制作数字人视频案例&#xff0c;感兴趣的朋友请前往查看:AI 绘画Stable Diffusion 研究&#xff08;十三&#xff09;SD数字人制作工具SadTlaker使用教程。 对于没有安装 SadTlaker 插件的朋友…

Anaconda安装pytorch-cuda

1 查看电脑对应cuda版本 【win-R】> 【cmd】> 确定 执行nvidia-smi&#xff0c;可以从图中看出&#xff0c;该电脑的CUDA Version为&#xff1a;11.6 2 官网查找对应的版本的安装语句 PyTorch官网&#xff1a;https://pytorch.org/ 2.1 可以直观的选择对应的版本 如…

GAN(生成对抗网络)

简介&#xff1a;GAN生成对抗网络本质上是一种思想&#xff0c;其依靠神经网络能够拟合任意函数的能力&#xff0c;设计了一种架构来实现数据的生成。 原理&#xff1a;GAN的原理就是最小化生成器Generator的损失&#xff0c;但是在最小化损失的过程中加入了一个约束&#xff0…

uniapp 使用 mui-player 插件播放 m3u8/flv 视频流

在UniApp中使用mui-player插件播放M3U8/FLV视频流&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 安装mui-player插件 &#xff1a;在UniApp项目根目录下&#xff0c;使用命令行工具执行以下命令安装mui-player插件&#xff1a; npm install mui-player --save2. 在需…

github出现的2FA的问题

github出现的2FA的问题 首先是收到的邮件提醒: 关键的信息是: 这提醒我们&#xff0c;我们宣布&#xff0c;我们要求用户贡献代码o n GitHub.com启用双因素身份验证 (2FA)。您收到此通知是因为您的帐户符合此标准&#xff0c;并且需要在00:00 (UTC) 2023年9月15日注册2FA。 …

C++|使用int数组实现一个栈类,为这个栈类增加getMaxValue方法

面试题&#xff1a; 使用int数组实现一个栈类&#xff0c;为这个栈类增加getMaxValue方法 做法&#xff1a; 在实现好的栈类里面&#xff0c;维护一个子栈&#xff0c;用来存储所有入栈时当过最大值的数字 比如栈&#xff1a;3 2 5 1 2 4 那么维护的子栈中存储的是&#xff1…