mybatis动态生成sql语句

Java 程序中使用 Map实现动态传参

在 Java 编程中,我们常常需要将数据传递给 SQL 查询,特别是在动态生成 SQL 语句时,通常会用到 Map 这种集合类。Map 可以将多个键值对传递给 SQL 语句的占位符,完成动态参数绑定的功能。我们下面详细讲解图中的知识点。

1. Map 的基本用法

Map 是 Java 集合框架中的一种数据结构,它以键值对 (key-value) 的形式存储数据。Map 中的键唯一且不能重复,而值可以重复。常用的实现类包括 HashMapTreeMap 等。

示例代码

Map<String, Object> map = new HashMap<>();
map.put("k1", "1111");
map.put("k2", "比亚迪汉");
map.put("k3", 10.0);
map.put("k4", "2020-11-11");
map.put("k5", "电车");

这里我们创建了一个 HashMap,并通过 put 方法将一些数据存入 Map。键是 String 类型,值是 Object 类型,意味着可以存放不同类型的数据(如字符串、数字、日期等)。

2. 占位符 #{} 的使用

在执行 SQL 语句时,为了防止 SQL 注入和简化代码,我们经常使用占位符将 SQL 参数动态地传入。( ? 是 JDBC 中的占位符,用于预编译 SQL 语句中的参数。在使用 JDBC 时,SQL 语句通常是预编译的,? 用于表示一个位置,在执行时由具体的参数替换。占位符 #{} 这一语法主要用于一些持久化框架,如 MyBatis。

SQL 语句示例

insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) 
values(null, #{k1}, #{k2}, #{k3}, #{k4}, #{k5});

在这个 SQL 语句中,#{k1}#{k2} 等占位符将会在运行时被替换为 Map 中对应的值。框架会根据占位符的键来查找 Map 中的值并动态替换。如果键不存在,则返回 null这个语句通常配置在通常用于 MyBatis 的 SQL 映射的XML文件中

注意

  • 如果 Map 中没有提供某个占位符对应的值,查询执行时可能会插入 null,这可能导致意外的行为。
  • 使用占位符 #{} 可以防止 SQL 注入,因为框架在执行时会自动进行预处理。

3. Map 键名与数据库字段名的对应关系

为了使代码更加易读、维护更加方便,我们通常建议将 Map 中的键名与数据库字段名保持一致。这样一来,不仅能够直观地映射参数,还能避免因键名不统一而导致的问题。

map.put("carNum", "1111");
map.put("brand", "比亚迪汉2");
map.put("guidePrice", 10.0);
map.put("produceTime", "2020-11-11");
map.put("carType", "电车");

在这个例子中,我们将 Map 的键名改为 carNumbrand 等,和数据库表的列名一致。这样一来,代码就更容易理解和维护。

SQL 语句

insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) 
values(null, #{carNum}, #{brand}, #{guidePrice}, #{produceTime}, #{carType});

POJO 类实现动态传参

1. POJO 类与 SQL 占位符传递

POJO(Plain Old Java Object) 是指普通的 Java 对象,通常用作数据传输对象。在 Java 应用中,我们可以通过 POJO 类的属性来传递 SQL 语句中的参数。

Car car = new Car(null, "3333", "比亚迪秦", 30.0, "2020-11-11", "新能源");

在这个例子中,Car 是一个 POJO 类,包含一些车辆信息的属性。通过实例化这个类,我们可以将具体的值传入到 SQL 语句中的占位符。

2. 占位符 #{} 的使用

在 MyBatis 等持久化框架中,使用占位符 #{} 来表示将 POJO 的属性值注入到 SQL 语句中。大括号 {} 里面填写的内容是 POJO 类的属性名(严格意义上来说:如果使用P0J0对象传递值的话,这个{}里面写的是get方法的方法名去掉get,然后将剩下的单词首字母小写,然后放进去。

SQL 语句示例

insert into t_car(id,car_num,brand,guide_price,produce_time,car_type) 
values(null, #{carNum}, #{brand}, #{guidePrice}, #{produceTime}, #{carType});

3. 占位符与属性对应的规则

MyBatis 会自动根据 POJO 类中的属性名来查找对应的 getter 方法。如果 POJO 类中没有提供对应的 getter 方法,则会报错。

错误示例

There is no getter for property named 'xyz' in 'class com.powernode.mybatis.pojo.Car'

这是因为 MyBatis 尝试通过 getXyz() 方法来获取 xyz 属性的值,但 POJO 类中没有定义这个方法。为了避免这种错误,我们需要在 POJO 类中提供每个属性的 gettersetter 方法。

4. 如何解决没有 getter 方法的问题?

如果遇到没有对应 getter 方法的情况,可以通过在 POJO 类中手动添加相应的 getter 方法来解决。比如:

public String getXyz() {return xyz;
}

5. 占位符 #{} 的使用规则

通过这个错误示例,我们可以总结出占位符的使用规则:MyBatis 是通过反射机制来调用 getter 方法。也就是说,在 #{} 占位符中写的内容(如 #{carNum})并不直接对应 POJO 的属性名,而是对应属性的 getter 方法。

规则

  • 占位符 #{} 中的内容是首字母小写形式。
  • 占位符内部自动调用属性的 getter 方法,因此命名应符合 Java 的命名规范。例如:
    • getUsername() 对应的占位符为 #{username}
    • getEmail() 对应的占位符为 #{email}

占位符 #{} 中的内容确实是与 POJO 类的属性相关,但 MyBatis 实际上是通过 调用 POJO 类的 getter 方法 来获取这些值的,而不是直接访问属性本身。因此,为了确保 MyBatis 能正确地映射 SQL 参数,POJO 类中的 getter 方法必须与占位符中的名字相匹配。 

删除DELETE操作:

 1. 删除操作的实现

int count = sqlSession.delete("deleteById", 59);

这行代码展示了通过 sqlSession.delete() 方法来执行删除操作,其中:

  • sqlSession:MyBatis中的会话对象,允许我们与数据库进行交互。
  • "deleteById":这是Mapper XML文件中定义的SQL语句的唯一标识符,用来指定删除操作。
  • 59:这是要传递给SQL语句的参数,即要删除的记录的ID

2. MyBatis Mapper 文件中的SQL语句 

<delete id="deleteById">delete from t_car where id = #{fdsfd}
</delete>

这是在MyBatis的Mapper XML文件中定义的删除操作,具体解释如下:

  • <delete id="deleteById">:这是定义一个删除操作的方法,id 是这个方法的唯一标识符,名称为 deleteById,与Java代码中调用的 deleteById 相对应。
  • delete from t_car where id = #{fdsfd}:这是一个标准的SQL删除语句,意思是从表 t_car 中删除 id#{fdsfd} 的记录。
    • #{fdsfd}:这是MyBatis的参数占位符,表示将传递的参数(在Java代码中传递的 59)注入到这个位置。fdsfd 是参数名,可以根据需要定义。

3. 占位符的说明

注意:如果占位符只有一个,那么 #{} 的大括号里可以随意。但是最好见名知意。

这里说明了 #{} 是MyBatis的占位符,用于绑定参数。虽然在某些情况下可以随意使用参数名(如 fdsfd),但是为了代码的可读性和维护性,建议使用有意义的名称,比如 id

例如,改为:

<delete id="deleteById">delete from t_car where id = #{id}
</delete>

这样更直观,容易理解。

4. 整体流程总结

  • 在Java代码中,我们通过 sqlSession.delete("deleteById", 59) 来调用Mapper文件中定义的 deleteById 删除方法,并传递 id = 59
  • MyBatis会将 59 替换到 delete from t_car where id = #{id} 的SQL语句中,生成最终的SQL语句 delete from t_car where id = 59 并执行,最终删除 t_car 表中 id59 的记录。

更新操作:

1. 更新操作的SQL语句

<update id="updateById">update t_car setcar_num=#{carNum},brand=#{brand},guide_price=#{guidePrice},produce_time=#{produceTime},car_type=#{carType}whereid = #{id}
</update>

这是在MyBatis的Mapper XML文件中定义的更新操作。解释如下:

  • <update id="updateById">:定义一个更新操作,id 是唯一标识符,这里使用 updateById,与Java代码中的方法名一致。
  • update t_car set ... where id = #{id}:这是SQL的更新语句,意图是将 t_car 表中的某条记录进行更新,具体是通过 id 来定位记录,然后对表中的多个字段进行更新。

这里使用 #{} 作为MyBatis的占位符,类似于之前的删除操作。它会在执行时将参数替换为实际值。具体字段说明:

  • #{carNum}:汽车编号
  • #{brand}:品牌
  • #{guidePrice}:指导价格
  • #{produceTime}:生产日期
  • #{carType}:汽车类型
  • #{id}:记录的唯一标识符,即要更新的汽车记录的 id

2. Java代码中的更新操作

Car car = new Car(4L, "9999", "凯美瑞", 30.3, "1999-11-10", "燃油车");
int count = sqlSession.update("updateById", car);
  • 这里通过 new Car() 创建了一辆 Car 对象,包含了所有要更新的属性。各个属性与Mapper XML中的占位符对应。

    • 4L:表示汽车的 id,也就是SQL语句中 id 字段要更新的记录。null 不能赋值给基本类型 long,但可以赋值给 Long 这样的包装类,所以使用)
    • "9999":对应 carNum,汽车编号。
    • "凯美瑞":对应 brand,汽车品牌。
    • 30.3:对应 guidePrice,指导价格。
    • "1999-11-10":对应 produceTime,生产日期。
    • "燃油车":对应 carType,汽车类型。
  • 然后调用 sqlSession.update("updateById", car); 进行更新操作。MyBatis会将 car 对象的属性传递给对应的SQL语句中的占位符,生成最终的SQL语句并执行更新。

3. 详细流程说明

  • MyBatis会根据Java代码中的 car 对象的属性,替换Mapper XML中的占位符,生成最终的SQL语句。
  • 假设 car 对象的 id 是4,那么生成的SQL语句大致如下
    update t_car setcar_num='9999',brand='凯美瑞',guide_price=30.3,produce_time='1999-11-10',car_type='燃油车'
    whereid = 4;
    
  • 执行这条SQL语句后,t_car 表中 id 为4的记录就会被更新成新值。
  • 更新后,sqlSession.update() 方法会返回受影响的行数,即 count

select查找操作 

1. MyBatis 中的 select 标签

  • 作用:MyBatis 使用 select 标签来编写 SQL 查询语句,定义如何从数据库中获取数据。在这个例子中,它用于根据 id 字段查询 t_car 表中的记录。

  • SQL 语句解释

    <select id="selectById" resultType="com.powernode.mybatis.pojo.Car">select * from t_car where id = #{id}
    </select>
    
  • id 属性id="selectById" 是一个唯一标识符,表示这条 SQL 语句在 MyBatis 配置中的 ID。当你在代码中调用 sqlSession.selectOne("selectById", 参数) 时,MyBatis 会根据这个 ID 找到对应的 SQL 语句。
  • SQL 查询select * from t_car where id = #{id} 是实际的 SQL 语句。#{id} 是 MyBatis 的动态 SQL 占位符,它会在运行时将你传入的参数(比如 1)替换为实际的查询条件。
    • #{} 是 MyBatis 语法,用于从传递的参数中获取值,防止 SQL 注入。
    • select * 是查询所有列,你可以根据需要替换为具体的列名(例如:select id, name, brand)。

2. resultType 属性

  • 作用resultType 属性告诉 MyBatis 查询结果应该映射成什么样的 Java 对象。也就是说,当从数据库中获取到数据后,MyBatis 会根据 resultType 中指定的类型来创建该类型的对象,并将查询结果封装到这个对象中。

  • 在此例子中的使用

    resultType="com.powernode.mybatis.pojo.Car"
    
  • 这里 resultType="com.powernode.mybatis.pojo.Car" 指定了 Car 类为查询结果的映射对象类型。即查询到的 t_car 表中的记录会被封装成 Car 类的实例。
  • 全限定类名:com.powernode.mybatis.pojo.CarCar 类的全限定类名,即包括了包名和类名。这是 MyBatis 推荐的写法,因为这样可以确保避免类名冲突,并确保 MyBatis 能找到正确的类。
  • resultType 的作用机制

    • 查询结果(即数据库中的一条记录)会被转换为 Java 对象。MyBatis 会根据数据库表中的列名与 Car 类的属性名进行匹配,如果列名与属性名相同,MyBatis 就会自动将查询结果中的列值赋给对应的属性。
    • 例如:假设 t_car 表有以下列:
      • idnamebrand
      • 对应 Car 类的属性为:idnamebrand,MyBatis 会自动将数据库中的 id 列的值赋给 Car 类中的 id 属性,依此类推。
  • 注意事项

    • 如果数据库中的列名和 Java 类中的属性名不一致,你需要使用别名(AS)或者 resultMap 进行手动映射。
      • 1. 假设的数据库表 t_car
        CREATE TABLE t_car (car_id INT PRIMARY KEY,car_name VARCHAR(50),car_brand VARCHAR(50)
        );
        
      • 在这个表中,列名是 car_id, car_name, 和 car_brand
      • Java 类 Car

        public class Car {private int id;private String name;private String brand;// Getters and setterspublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}
        }
        

        在 Java 类 Car 中,属性名分别是 id, name, 和 brand,显然与数据库表 t_car 的列名不一致。

        解决办法:使用 resultMap 进行手动映射

        由于列名和属性名不一致,直接使用 resultType 是无法自动映射的,这时我们可以使用 resultMap 进行手动映射。

    • 3. MyBatis 映射配置:起别名

      <select id="selectById" resultType="com.powernode.mybatis.pojo.Car">select car_id as id, car_name as name, car_brand as brandfrom t_carwhere car_id = #{id}
      </select>
      

      在这个配置中:

      • car_id as id:把 car_id 列的查询结果映射为 id,从而与 Java 类 Carid 属性对应。
      • car_name as name:把 car_name 列的查询结果映射为 name,与 Car 类中的 name 属性对应。
      • car_brand as brand:把 car_brand 列的查询结果映射为 brand,与 Car 类中的 brand 属性对应。
      • SQL 查询select * from t_car where car_id = #{id},通过 #{id} 来传递 Java 方法中的参数。

    • 这样,通过使用 AS 设置别名,可以直接在 SQL 语句中将数据库的列名与 Java 类的属性名进行对应,而无需修改数据库或 Java 类。

3. selectOne 方法

  • 作用selectOne 是 MyBatis 提供的一个方法,用于执行返回单条记录的查询。当我们确定查询的结果是唯一的(例如,查询主键),可以使用这个方法。如果查询结果返回多条记录,MyBatis 会抛出异常(TooManyResultsException)。

  • 用法解释

Car car = sqlSession.selectOne("selectById", 1);
  • sqlSession 是 MyBatis 中操作数据库的会话对象,类似于 JDBC 中的 Connection 对象。
  • selectOne("selectById", 1):调用了 selectById 这个 SQL 查询,并传递了参数 1。这个 1 会替换 SQL 中的 #{id} 占位符,最终执行的 SQL 会是:
    select * from t_car where id = 1;
    

    返回的结果会是一个 Car 对象,存储在变量 car 中。

 select查所有的数据

sql语句

<select id="selectAll" resultType="com.powernode.mybatis.pojo.Car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefrom t_car
</select>

在这个查询中,使用了别名将数据库表中的列名映射到 Java 类 Car 中的属性名:

  • car_num as carNum:将数据库中的 car_num 列映射到 Car 类中的 carNum 属性。
  • guide_price as guidePrice:将数据库中的 guide_price 列映射到 Car 类中的 guidePrice 属性。
  • produce_time as produceTime:将数据库中的 produce_time 列映射到 Car 类中的 produceTime 属性。
  • car_type as carType:将数据库中的 car_type 列映射到 Car 类中的 carType 属性。

Java 代码中的 selectList 调用 

List<Car> cars = sqlSession.selectList("selectAll");
  • selectList 方法:MyBatis 中的 selectList 方法用于返回一个 List 集合,集合中的每个元素是从数据库查询到的每一条记录的 Java 对象。在这个例子中,查询结果将会封装为一个 Car 对象的列表。

  • resultType 属性:在 SQL 配置中,resultType 依然用于指定封装查询结果的 Java 类类型,这里是 com.powernode.mybatis.pojo.Car,表示查询结果会封装成 Car 类的对象。

注意事项

  • resultType 指定的类型:需要注意的是,resultType 并不是指定集合的类型,而是指定集合中的每个元素类型。在这个例子resultType="com.powernode.mybatis.pojo.Car",意味着 MyBatis 会将查询结果的每一条记录封装为 Car 对象。

  • selectList 返回的结果:调用 selectList("selectAll") 会返回一个 List 集合,集合中的每个元素对应于查询结果中的一条记录,并会封装为指定的 Car 对象。

 

 

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

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

相关文章

【STM32-HAL库】AHT10温湿度传感器使用(STM32F407ZGT6配置i2c)(附带工程下载连接)

一、温湿度传感器&#xff1a; 温湿度传感器是一种能够检测环境中的温度和湿度&#xff0c;并将其转化为电信号输出的装置。它在智能家居、工业自动化、气象监测、农业等领域有着广泛的应用。 原理&#xff1a; 温湿度传感器通常基于不同的物理原理&#xff0c;以下是一些常见…

前端vue-配置基地址并发送请求

1.首先&#xff0c;在HBuilder的终端下载安装luch-request 2.创建一个目录utils&#xff0c;以及下面的http.js文件&#xff0c;导入安装包&#xff0c;在new一下request&#xff0c;配置接口的基地址 3.在测试文件目录里面进行测试&#xff0c;看看请求能否发送成功&#xff…

Activity

文章目录 1.启停活动页面1.Activity启动和结束2.Activity生命周期3. Activity启动模式 2.在活动之间传递信息1.显示Intent和隐式Intent显示Intent隐式Intent 2.向下一个Activity发送数据3.向上一个Activity返回数据 3.为活动补充附加信息1.利用资源文件配置字符串2.利用元数据传…

零基础入门AI大模型应用开发,你需要一个系统的学习路径!

前言 随着人工智能技术的迅猛发展&#xff0c;特别是在大型语言模型&#xff08;LLMs&#xff09;领域的突破&#xff0c;AI大模型已经成为当今科技领域的热门话题。不论是对于希望转型进入AI行业的职场人士&#xff0c;还是对未来充满憧憬的学生&#xff0c;掌握AI大模型的应…

在java中使用redis

Redis Java使⽤ 引入依赖 Java 操作redis的客⼾端有很多.其中最知名的是jedis. 创建maven项⽬,把jedis的依赖拷⻉到pom.xml中 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency><groupId>redis.clients</groupId><…

基于SpringBoot的音乐网站系统

本地测试环境&#xff1a;eclipse或idea&#xff0c;数据库MySQL5.7&#xff0c; jdk1.8 使用技术&#xff1a;SpringBootMyBatis 主要功能&#xff1a;分类管理、音乐管理、系统管理等

ASR的King:我又回来了,更小,且更快——openai/whisper-large-v3-turbo

Whisper 是用于自动语音识别&#xff08;ASR&#xff09;和语音翻译的最先进模型&#xff0c;由来自 OpenAI 的 Alec Radford 等人在论文《通过大规模弱监督实现鲁棒语音识别》中提出。 Whisper 在超过 500 万小时的标注数据上进行了训练&#xff0c;证明了其在零点场景下对许多…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07目录1. Evaluation of Large Language Models for Summarization Tasks in the Medical Domain: A Narrative Review摘要研究…

【大语言模型-论文精读】谷歌-BERT:用于语言理解的预训练深度双向Transformers

【大语言模型-论文精读】谷歌-BERT&#xff1a;用于语言理解的预训练深度双向Transformers 目录 文章目录 【大语言模型-论文精读】谷歌-BERT&#xff1a;用于语言理解的预训练深度双向Transformers目录0. 引言1. 简介2 相关工作2.1 基于特征的无监督方法2.2 无监督微调方法2.3…

基于深度学习的多焦点图像融合系统【数据集+深度学习模型+源码+PyQt5界面】

深度学习多焦点聚焦图像融合 文章目录 研究背景代码下载链接一、效果演示1.1 界面设计1.2 图像融合演示11.3 图像融合演示21.4 图像融合演示3 二、技术原理2.1 引言2.2 融合策略2.3 深度特征的提取2.4 融合策略2.4.1 利用深度特征计算模糊度2.4.2 去噪与平滑2.4.3 图像融合 三、…

【MYSQL】mysql约束---自增长约束(auto_increment)

1、概念 在Mysql中&#xff0c;当主键为自增长后&#xff0c;这个主键的值就不再需要用户输入数据了&#xff0c;而由数据库系统根据定义自动赋值。每增加一条记录&#xff0c;主键会自动以相同的步长进行增长。 注意&#xff1a;自增长约束通常与主键放在一起使用。 通过给…

【CKA】十七、集群故障排查-node节点kubelet服务异常

17、集群故障排查-node节点kubelet服务异常 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 1、考试环境就是&#xff1a;kubelet这个服务没有设置开机自启&#xff0c;导致node节点状态异常。 2、只需要切换环境&#xff0c;登录到指定主机&#xff0c;获取root权限后&am…

LeetCode 54 Spiral Matrix 解题思路和python代码

题目&#xff1a; Given an m x n matrix, return all elements of the matrix in spiral order. Example 1: Input: matrix [[1,2,3],[4,5,6],[7,8,9]] Output: [1,2,3,6,9,8,7,4,5] Example 2: Input: matrix [[1,2,3,4],[5,6,7,8],[9,10,11,12]] Output: [1,2,3,4,8,1…

73.【C语言】C/C++的内存区域划分

目录 1.内存里的几个区域 2.示意图 3.解释 1.内存里的几个区域 除了耳熟能详的栈区,堆区,静态区,还有内核空间,内存映射段,数据段,代码段 2.示意图 3.解释 栈区(stack area):局部变量,函数参数,返回数据,返回地址 内存映射段:将文件映射到内存 映射的含义: 如果看过李忠…

【python实操】python小程序之对象的属性操作

引言 python小程序之对象的属性操作 文章目录 引言一、对象的属性操作1.1 题目1.2 代码1.3 代码解释 二、思考2.1 添加属性2.2 获取属性 一、对象的属性操作 1.1 题目 给对象添加属性 1.2 代码 class Cat:# 在缩进中书写⽅法def eat(self):# self 会⾃动出现,暂不管print(f…

OpenAI 推出全新 “Canvas” 工具的系统提示词泄露

OpenAI 推出了一款叫做 Canvas 的新工具&#xff0c;用来帮助用户更好地与 ChatGPT 协作写作和编程。 Canvas 允许用户和 ChatGPT 在一个独立的窗口中协作&#xff0c;实时修改内容。这个工具可以帮助改进文本、调整语言、审查和修复代码&#xff0c;甚至转换成不同编程语言。…

大模型之RAG-关键字检索的认识与实战(混合检索进阶储备)

前言 按照我们之前的分享&#xff08;大模型应用RAG系列3-1从0搭建一个RAG&#xff1a;做好文档切分&#xff09;&#xff1a; RAG系统搭建的基本流程 准备对应的垂域资料文档的读取解析&#xff0c;进行文档切分将分割好的文本灌入检索引擎&#xff08;向量数据库&#xff…

【单例模式】

单例模式是指在内存中只会创建且仅创建一次对象的设计模式。 一、实现方式 1. 饿汉式 在类加载的时候就创建实例&#xff0c;无论是否使用&#xff0c;实例都会被创建。优点是实现简单&#xff0c;线程安全。缺点是可能造成资源浪费&#xff0c;而程序可能不一定会使用这个实例…

【Linux】自主shell编写

如果学习了常见的Linux命令&#xff0c;exec*函数&#xff0c;环境变量&#xff0c;那你就可以尝试一下写一个简单的shell; 下面跟着我的步骤来吧&#xff01;&#xff01;&#x1f929;&#x1f929; 输入命令行 既然要写一个shell&#xff0c;我们第一步先把这个输入命令行…

Java中数组的应用

Java中数组的应用 数组数组的使用使用方式1-动态初始化数组的定义&#xff1a;数组的引用&#xff08;使用/访问/获取数组元素&#xff09;&#xff1a;快速入门案例 使用方式2-动态初始化**先声明**数组**再创建**数组使用方式1和2的比较 使用方式3-静态初始化初始化数组快速入…