Free MyBatis Tool插件的进阶使用指南(消灭dao层的繁琐编码)

目录

  • 零、起因
  • 一、怎么使用Free MyBatis Tool插件?
    • 1 基本使用
    • 2 进阶使用(搞清楚Options的用法)
      • 2.1 概览
      • 2.2 详述
        • 2.2.0 Options(一项都不勾选)
        • 2.2.1 Use-Lombok【消除UserDO中的getter和setter代码】
        • 2.2.2 Comment(实体注释)【和“2.2.1”相比,没任何变化...】
        • 2.2.3 Use-Schema(使用Schema前缀)【和“2.2.1”相比,没任何变化...】
        • 2.2.4 Overwrite-Java【和“2.2.1”相比,没任何变化...】
        • 2.2.5 Overwrite-Xml【和“2.2.1”相比,没任何变化...】
        • 2.2.6 Repository-Annotation(Repository注解)【在UserMapper.java中打上@Repository注解】
        • 2.2.7 toString/hashCode/equals【给UserDO增加这些方法】
        • 2.2.8 Parent-Interface(Dao公共父接口)【别勾选这个!】
        • 2.2.9 JSR310:Date and Time API【UserDO的Date会变成LocalDateTime】
        • 2.2.10 JPA-Annotation(JPA注解)【UserDO会带上JPA注解】
        • 2.2.11 Actual-Column(实际的列名)【UserDO字段名和表的列名一致】
        • 2.2.12 Use-Alias(启用别名查询)【UserMapper.xml的列名会发生变化】
        • 2.2.13 Use-Example【别勾选这个!】
        • 2.2.14 Page(分页,需开启Use-Example)【自己实现分页吧,别勾选这个!】
        • 2.2.15 Add-ForUpdate(需开启Use-Example)【自己实现悲观锁吧,别勾选这个!】
      • 2.3 结论【推荐勾选哪些呢?】

零、起因

  • 后端开发少不了设计表(例如:xxx表)。
  • 设计好表后,少不了需要去实现xxxDO、xxxMapper.java、xxxMapper.xml(ORM框架选Mybatis的情况)。
    • 这些都是模板代码,让人来写真费劲啊! 【问题】
  • 【解决办法】:利用“Free MyBatis Tool插件”消灭dao层的繁琐编码。
    在这里插入图片描述

一、怎么使用Free MyBatis Tool插件?

1 基本使用

在这里插入图片描述

  • Options中那么多选项,具体是啥意思?

2 进阶使用(搞清楚Options的用法)

2.1 概览

  • Use-Lombok
  • Comment(实体注释)
  • Use-Schema(使用Schema前缀)
  • Overwrite-Java
  • Overwrite-Xml
  • Repository-Annotation(Repository注解)
  • toString/hashCode/equals
  • Parent-Interface(Dao公共父接口)
  • JSR310:Date and Time API
  • JPA-Annotation(JPA注解)
  • Actual-Column(实际的列名)
  • Use-Alias(启用别名查询)
  • Use-Example
  • Page(分页,需开启Use-Example)
  • Add-ForUpdate(需开启Use-Example)

2.2 详述

2.2.0 Options(一项都不勾选)
  • UserDO
package com.forrest.demo.model;import java.io.Serializable;
import java.util.Date;/*** user*/
public class UserDO implements Serializable {private Integer id;private String username;private String passwordHash;private String email;private Date registrationDate;private Date lastLoginTime;private static final long serialVersionUID = 1L;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPasswordHash() {return passwordHash;}public void setPasswordHash(String passwordHash) {this.passwordHash = passwordHash;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Date getRegistrationDate() {return registrationDate;}public void setRegistrationDate(Date registrationDate) {this.registrationDate = registrationDate;}public Date getLastLoginTime() {return lastLoginTime;}public void setLastLoginTime(Date lastLoginTime) {this.lastLoginTime = lastLoginTime;}
}
  • UserMapper.java
package com.forrest.demo.dao;import com.forrest.demo.model.UserDO;public interface UserMapper {int deleteByPrimaryKey(Integer id);int insert(UserDO record);int insertSelective(UserDO record);UserDO selectByPrimaryKey(Integer id);int updateByPrimaryKeySelective(UserDO record);int updateByPrimaryKey(UserDO record);
}
  • UserMapper.xml
<?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.forrest.demo.dao.UserMapper"><resultMap id="BaseResultMap" type="com.forrest.demo.model.UserDO"><id column="id" jdbcType="INTEGER" property="id" /><result column="username" jdbcType="VARCHAR" property="username" /><result column="password_hash" jdbcType="VARCHAR" property="passwordHash" /><result column="email" jdbcType="VARCHAR" property="email" /><result column="registration_date" jdbcType="TIMESTAMP" property="registrationDate" /><result column="last_login_time" jdbcType="TIMESTAMP" property="lastLoginTime" /></resultMap><sql id="Base_Column_List">id, username, password_hash, email, registration_date, last_login_time</sql><select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">select <include refid="Base_Column_List" />from userwhere id = #{id,jdbcType=INTEGER}</select><delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">delete from userwhere id = #{id,jdbcType=INTEGER}</delete><insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.forrest.demo.model.UserDO" useGeneratedKeys="true">insert into user (username, password_hash, email, registration_date, last_login_time)values (#{username,jdbcType=VARCHAR}, #{passwordHash,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, #{registrationDate,jdbcType=TIMESTAMP}, #{lastLoginTime,jdbcType=TIMESTAMP})</insert><insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.forrest.demo.model.UserDO" useGeneratedKeys="true">insert into user<trim prefix="(" suffix=")" suffixOverrides=","><if test="username != null">username,</if><if test="passwordHash != null">password_hash,</if><if test="email != null">email,</if><if test="registrationDate != null">registration_date,</if><if test="lastLoginTime != null">last_login_time,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="username != null">#{username,jdbcType=VARCHAR},</if><if test="passwordHash != null">#{passwordHash,jdbcType=VARCHAR},</if><if test="email != null">#{email,jdbcType=VARCHAR},</if><if test="registrationDate != null">#{registrationDate,jdbcType=TIMESTAMP},</if><if test="lastLoginTime != null">#{lastLoginTime,jdbcType=TIMESTAMP},</if></trim></insert><update id="updateByPrimaryKeySelective" parameterType="com.forrest.demo.model.UserDO">update user<set><if test="username != null">username = #{username,jdbcType=VARCHAR},</if><if test="passwordHash != null">password_hash = #{passwordHash,jdbcType=VARCHAR},</if><if test="email != null">email = #{email,jdbcType=VARCHAR},</if><if test="registrationDate != null">registration_date = #{registrationDate,jdbcType=TIMESTAMP},</if><if test="lastLoginTime != null">last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP},</if></set>where id = #{id,jdbcType=INTEGER}</update><update id="updateByPrimaryKey" parameterType="com.forrest.demo.model.UserDO">update userset username = #{username,jdbcType=VARCHAR},password_hash = #{passwordHash,jdbcType=VARCHAR},email = #{email,jdbcType=VARCHAR},registration_date = #{registrationDate,jdbcType=TIMESTAMP},last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP}where id = #{id,jdbcType=INTEGER}</update>
</mapper>
2.2.1 Use-Lombok【消除UserDO中的getter和setter代码】
  • 看了“2.2.0”很自然就知道Use-Lombok的好处了:可以消除UserDO中的getter和setter代码
  • UserDO
/*** user*/
@Data
public class UserDO implements Serializable {private Integer id;private String username;private String passwordHash;private String email;private Date registrationDate;private Date lastLoginTime;private static final long serialVersionUID = 1L;
}
  • UserMapper.java
    • 没变化,和“2.2.0”一样
  • UserMapper.xml
    • 没变化,和“2.2.0”一样
2.2.2 Comment(实体注释)【和“2.2.1”相比,没任何变化…】
  • 我以为会给UserDO增加注释…但并没有。
  • 和“2.2.1”相比,没任何变化…
2.2.3 Use-Schema(使用Schema前缀)【和“2.2.1”相比,没任何变化…】
  • 在“2.2.2”基础上没有增加任何内容。
  • 这个Schema可以被简单理解为user表在哪个数据库中。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
2.2.4 Overwrite-Java【和“2.2.1”相比,没任何变化…】
  • 即使已经有UserDO.java和UserMapper.java了,让开发者选择是否覆写这两个文件。
    在这里插入图片描述
2.2.5 Overwrite-Xml【和“2.2.1”相比,没任何变化…】
  • 同理,即使已经有UserMapper.xml了,让开发者选择是否覆写这个xml文件。
2.2.6 Repository-Annotation(Repository注解)【在UserMapper.java中打上@Repository注解】
  • 在UserMapper.java中打上@Repository注解。
    在这里插入图片描述
2.2.7 toString/hashCode/equals【给UserDO增加这些方法】
  • 给UserDO增加toString/hashCode/equals方法:
package com.forrest.demo.model;import java.io.Serializable;
import java.util.Date;
import lombok.Data;/*** user*/
@Data
public class UserDO implements Serializable {...@Overridepublic boolean equals(Object that) {if (this == that) {return true;}if (that == null) {return false;}if (getClass() != that.getClass()) {return false;}UserDO other = (UserDO) that;return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))&& (this.getUsername() == null ? other.getUsername() == null : this.getUsername().equals(other.getUsername()))&& (this.getPasswordHash() == null ? other.getPasswordHash() == null : this.getPasswordHash().equals(other.getPasswordHash()))&& (this.getEmail() == null ? other.getEmail() == null : this.getEmail().equals(other.getEmail()))&& (this.getRegistrationDate() == null ? other.getRegistrationDate() == null : this.getRegistrationDate().equals(other.getRegistrationDate()))&& (this.getLastLoginTime() == null ? other.getLastLoginTime() == null : this.getLastLoginTime().equals(other.getLastLoginTime()));}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((getId() == null) ? 0 : getId().hashCode());result = prime * result + ((getUsername() == null) ? 0 : getUsername().hashCode());result = prime * result + ((getPasswordHash() == null) ? 0 : getPasswordHash().hashCode());result = prime * result + ((getEmail() == null) ? 0 : getEmail().hashCode());result = prime * result + ((getRegistrationDate() == null) ? 0 : getRegistrationDate().hashCode());result = prime * result + ((getLastLoginTime() == null) ? 0 : getLastLoginTime().hashCode());return result;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();sb.append(getClass().getSimpleName());sb.append(" [");sb.append("Hash = ").append(hashCode());sb.append(", id=").append(id);sb.append(", username=").append(username);sb.append(", passwordHash=").append(passwordHash);sb.append(", email=").append(email);sb.append(", registrationDate=").append(registrationDate);sb.append(", lastLoginTime=").append(lastLoginTime);sb.append(", serialVersionUID=").append(serialVersionUID);sb.append("]");return sb.toString();}
}
  • @Data注解会自动生成一个类的toString、hashCode和equals方法。**因此,没必要勾选“toString/hashCode/equals”。**即使有特殊需求,也是自己去覆写这些方法,而不是用“Free MyBatis Tool插件”生成的。
2.2.8 Parent-Interface(Dao公共父接口)【别勾选这个!】
  • UserMapper.java
package com.forrest.demo.dao;import org.springframework.stereotype.Repository;@Repository
public interface UserMapper {
}
  • MyBatisBaseDao
package com.forrest.demo.dao;import java.io.Serializable;
import java.util.List;
import org.apache.ibatis.annotations.Param;/*** DAO公共基类,由MybatisGenerator自动生成请勿修改* @param <Model> The Model Class 这里是泛型不是Model类* @param <PK> The Primary Key Class 如果是无主键,则可以用Model来跳过,如果是多主键则是Key类* @param <E> The Example Class*/
public interface MyBatisBaseDao<Model, PK extends Serializable, E> {int deleteByPrimaryKey(PK id);int insert(Model record);int insertSelective(Model record);Model selectByPrimaryKey(PK id);int updateByPrimaryKeySelective(Model record);int updateByPrimaryKey(Model record);
}
  • 很显然,别勾选“Parent-Interface(Dao公共父接口)”
2.2.9 JSR310:Date and Time API【UserDO的Date会变成LocalDateTime】
  • UserDO的变化
    在这里插入图片描述
  • 对比“2.2.1”,UserMapper.java和UserMapper.xml没变化。
  • JSR-310: Date and Time APIJava 8中引入的一个新日期和时间API,它提供了一系列用于日期、时间、时区和时钟的类和接口。这个API旨在解决旧版Date和Calendar类存在的问题,并提供了更加易用、更加强大、类型安全的日期和时间操作。

在使用Free MyBatis Tool插件时,如果选择了支持JSR-310,插件会根据这个新的日期时间API生成相应的代码。这意味着在xxxDO和Mapper接口日期时间字段将会使用JSR-310中的类,例如LocalDate、LocalTime、LocalDateTime、ZonedDateTime等,而不是Java 7及以前版本中使用的java.util.Date或java.sql.Date。

  • 按理来说,应该勾选“JSR310:Date and Time API”。但实际开发中,不少字段仍然用的是Date… (如果自己没有决策权,也只能被迫用Date,懂的都懂:))
2.2.10 JPA-Annotation(JPA注解)【UserDO会带上JPA注解】
  • UserDO会带上JPA注解:
package com.forrest.demo.model;import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;
import org.hibernate.validator.constraints.NotEmpty;/*** user*/
@Table(name="user")
@Data
public class UserDO implements Serializable {@Id@GeneratedValue@GeneratedValue(generator = "JDBC")private Integer id;@NotEmptyprivate String username;@NotEmptyprivate String passwordHash;@NotEmptyprivate String email;private LocalDateTime registrationDate;private LocalDateTime lastLoginTime;private static final long serialVersionUID = 1L;
}
  • 对比“2.2.9”,UserMapper.java和UserMapper.xml没变化。

JPA(Java Persistence API)是Java持久化API的简称,它是Java EE规范的一部分,旨在简化Java对象和关系数据库之间的映射和持久化操作。

实际开发中,我咋很少见到JPA注解…

2.2.11 Actual-Column(实际的列名)【UserDO字段名和表的列名一致】
  • UserDO字段名和表的列名一致:
    在这里插入图片描述

类似的,在UserMapper.xml和UserMapper.java中,也从passwordHash变成了password_hash(其他字段同理)。

  • 但这显然不符合Java命名习惯,因此,不要勾选“Actual-Column(实际的列名)”。
2.2.12 Use-Alias(启用别名查询)【UserMapper.xml的列名会发生变化】
  • UserMapper.xml的列名会发生变化:
    在这里插入图片描述
  • 一般来说,如果是单表查询,我们是不需要这么写的:select user.id from user where id = 1;。因此,没必要勾选“Use-Alias(启用别名查询)”。
2.2.13 Use-Example【别勾选这个!】
  • 会增加一个UserDOExample
public class UserDOExample {protected String orderByClause;protected boolean distinct;protected List<Criteria> oredCriteria;	...
}
  • UserMapper.java会这么写:
public interface UserMapper {long countByExample(UserDOExample example);int deleteByExample(UserDOExample example);int deleteByPrimaryKey(Integer id);...
}

只能说…别勾选这个!

2.2.14 Page(分页,需开启Use-Example)【自己实现分页吧,别勾选这个!】
2.2.15 Add-ForUpdate(需开启Use-Example)【自己实现悲观锁吧,别勾选这个!】

2.3 结论【推荐勾选哪些呢?】

  • 打开设置,如下图所示:
    在这里插入图片描述
  • 此外,我觉得生成的UserMapper.java中的方法命名不符合习惯,还得自行做一些调整。
public interface UserMapper {int deleteByPrimaryKey(Integer id);...
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/792646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT 在做什么,为什么有效?

原文&#xff1a;What Is ChatGPT Doing … and Why Does It Work? 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 这本简短的书试图从第一原理解释 ChatGPT 是如何工作的。在某种程度上&#xff0c;这是关于技术的故事。但它也是关于科学的故事。以及关于哲学…

item_search-按关键字搜索淘宝商品:如何通过获取以下关键字、搜索类型、排序方式参数提升用户体验、优化营销策略、提高转化率

在淘宝购物的过程中&#xff0c;搜索功能无疑是用户与商品之间的重要桥梁。通过输入关键字&#xff0c;用户可以迅速找到所需的商品&#xff0c;而搜索结果的准确性和相关性则直接关系到用户的购物体验和满意度。因此&#xff0c;如何通过优化关键字、搜索类型和排序方式参数&a…

应急响应实战笔记04Windows实战篇(5)

第5篇&#xff1a;挖矿病毒&#xff08;一&#xff09; 0x00 前言 ​ 随着虚拟货币的疯狂炒作&#xff0c;挖矿病毒已经成为不法分子利用最为频繁的攻击方式之一。病毒传播者可以利用个人电脑或服务器进行挖矿&#xff0c;具体现象为电脑CPU占用率高&#xff0c;C盘可使用空间…

解锁行业潜力:国内十大低代码平台全面盘点

在数字化转型的浪潮中&#xff0c;低代码开发平台以其快速开发、简化流程和降低技术门槛的优势&#xff0c;成为企业信息化建设的重要推手。 本篇文章将为您盘点十个低代码平台有&#xff1a;Zoho Creator、明道云、腾讯云低代码平台、华为云Astro、金蝶云苍穹、用友YonBuilder…

[lesson05]引用的本质分析

引用的本质分析 引用的意义 引用作为变量别名而存在&#xff0c;因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 注意&#xff1a; 函数中的引用形参不需要进行初始化&#xff01;&#xff01; 特殊的引用 const引用 在C中可以声明const引用 cons…

可能是最便宜的姿态传感器,国产三轴加速度计SC7A20

可能是最便宜的姿态传感器 三轴检测 批量参考价格&#xff1a;整盘单价&#xff1a;1.242&#xff0c;一个包装10K&#xff0c;希望厂家能出点数量少的包装&#xff0c;这一盘太多了&#xff1a;&#xff09; 特点 宽电压范围 1.71V-3.6V 1.8V 兼容数字 IO 口 低功耗模式下…

GNURadio 软件在windows环境下安装

一、软件下载 网址&#xff1a;InstallingGR - GNU Radio 我已经下载的软件安装包&#xff0c;radioconda-2024.01.26-Windows-x86_64.rar 网址&#xff1a;https://download.csdn.net/download/weixin_37728585/89082238 二、安装过程 所有用户均可以使用。 选择安装路径&a…

一文彻底搞清 Iterator(遍历器)概念及用法

目录 一、由来及意义 二、具体实现流程 三、具有默认 Iterator 接口的数据结构 四、调用 Iterator 接口的场合 五、总结 一、由来及意义 Javascript中表示“集合”的数据结构&#xff0c;主要是 Array、Object、Map、Set 这四种数据集合&#xff0c;除此之外&#xff0c;…

JVM基础二——类的生命周期

加载阶段 &#xff1a; 连接阶段&#xff1a; 初始化阶段&#xff1a; 总结&#xff1a;

【Linux】SSH协议应用

SSH协议 SSH简介实现OpenSSH ssh中的四个文件~/.ssh文件路径实验解析 SSH 简介 SSH&#xff08;secure shell&#xff09;只是一种协议&#xff0c;存在多种实现&#xff0c;既有商业实现&#xff0c;也有开源实现。本文针对的实现是OpenSSH&#xff0c;它是自由软件&#xf…

第18讲:数据在内存中的存储

⽬录 1. 整数在内存中的存储 2. ⼤⼩端字节序和字节序判断 3. 浮点数在内存中的存储 ——————————————————————————————————————————— 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#x…

力扣热题100_链表_21_合并两个有序链表

文章目录 题目链接解题思路解题代码 题目链接 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例…

jupyter Notebook 默认路径修改

1. anaconda prompt 中运行 jupyter notebook --generate-config 命令&#xff0c;将在 C:\Users\Think\.jupyter文件下生成 jupyter_notebook_config.py 文件。 2.在jupyter_notebook_config.py 文件中&#xff0c;找c.NotebookApp.notebook_dir 这个变量&#xff0c; (1)若…

Solana 线下活动回顾|多方创新实践,引领 Solana“文艺复兴”新浪潮

Solana 作为在过去一年里实现突破式飞跃的头部公链&#xff0c;究竟是如何与 Web3 行业共振&#xff0c;带来全新的技术发展与生态亮点的呢&#xff1f;在 3 月 24 日刚结束的「TinTin Destination Moon」活动现场&#xff0c;来自 Solana 生态的的专家大咖和 Web3 行业的资深人…

LeetCode - 移除石子使总数最小

1962. 移除石子使总数最小 当我看到这道题目的时候&#xff0c;第一时间想到的是&#xff1a;while循环 sort&#xff0c;时间复杂度 k*nlogn。题目要求执行k次操作后&#xff0c;剩下狮子的最小总数&#xff0c;我们是否可以考虑维护一个堆呢&#xff1f;堆顶值最大&#xff…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《台风灾害下考虑多类型故障不确定性的源网荷协同弹性提升模型》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Leetcode_2两数相加

文章目录 前言一、两数相加1.1 问题描述1.2 解法一&#xff1a;分别将链表转为数字&#xff0c;然后相加1.3 代码实现1.4 解法二&#xff1a;分别将对应位置数字相加1.5 代码实现 二、使用步骤1.引入库2.读入数据 前言 链表是一种物理内存非连续存储&#xff0c;非顺序的线性数…

AI论文速读 |【综述】 时序分析基础模型:教程与综述

论文标题&#xff1a;Foundation Models for Time Series Analysis: A Tutorial and Survey 作者&#xff1a; Yuxuan Liang&#xff08;梁宇轩&#xff09;, Haomin Wen&#xff08;温浩珉&#xff09;, Yuqi Nie&#xff08;PatchTST一作&#xff09;, Yushan Jiang, Ming J…

windows安装Openssl

openssl官网:[ Downloads ] - /source/index.html Windows 安装方法 OpenSSL 官网没有提供 Windows 版本的安装包&#xff0c;可以选择其他开源平台提供的工具 Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 等待下载完成 捐不起 配置环境变量 ope…

LC 111.二叉树的最小深度

111. 二叉树的最小深度 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a; 叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a; root [3,9,20,null,null,15,7] 输出&#xff1a;…