当前位置: 首页 > news >正文

MySQL之JDBC

我们在学习完了数据库的基本操作后,希望和我们的Java程序建立连接,那么我们今天就来一探究竟JDBC是如何让Java程序与数据库建立连接的

1. 什么是JDBC

JDBC(Java Data Base Connectivity, Java数据库连接) 是Java程序和数据库之间的桥梁,包含了⼀套Java定义的用于执⾏SQL语句的接口,使开发者能够编写数据库的程序。JDBC 的主要作⽤是:与数据库建⽴连接、发送SQL语句和处理数据库执行结果。

2. 为什么要使用JDBC

⾸先回顾⼀下使⽤客户端操作数据库的过程,主要分为以下几步:

a. 确定数据库服务器的地址,端口号,指定用户名密码
b.连接到数据库服务
c. 发送SQL语句
d. 得到返回结果并显示
e. 断开连接

  • 同样如果使用程序操作数据库也会经历以上几步,⼤家应该可以想到,为实现上述步骤,可以编写相应的代码实现数据库连接,发送SQL语句,处理结果并显示,最后关闭连接。

  • 但是不同的数据库服务器对于同⼀个操作不论是协议还是参数都各有不同,如果让程序员自己去实现,那就必须针对不同的数据库进行编码实现,这个⼯作量和维护成本显然太大。

  • Java采取的做法是把以上操作步骤定义了相应的接⼝,具体的实现交给数据库厂商去做,Java程序员只需要按照需要调用接⼝中定义的方法即可,这样不论使用什么数据库,都对于Java程序没有任何影响,即便是换⼀个数据库,也只需要换⼀下相应厂商的实现依赖即可。
    在这里插入图片描述

  • JDBC使⽤过程可以概括为:加载数据库厂商的驱动包、建立连接、创建Statement、执行SQL、 处理结果释放资源和关闭连接。

3. 使用JDBC

3.1 获取MySQL厂商的驱动包(依赖,JAR包)

由于数据库厂商的驱动包过多,不好查询,我们推荐一个网址,里面有所有的数据库厂商提供的驱动包:MAVEN

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.2 创建Maven⼯程

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.3 配置国内镜像

在这里插入图片描述

在这里插入图片描述

 <mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿⾥云公共仓库</name><url>https://maven.aliyun.com/repository/public</url></mirror><mirror><id>central</id><mirrorOf>*</mirrorOf><name>aliyun central</name><url>https://maven.aliyun.com/repository/central</url></mirror>

3.4 加载数据库厂商的驱动包

//固定写法,其中Driver是一个Java实现的类
Class.forName("com.mysql.cj.jdbc.Driver");

在这里插入图片描述

3.5 建立连接

  • 使用驱动管理类DriverManager 的静态方法获取数据库连接
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/yu?" "characterEncoding=utf8" +"&allowPublicKeyRetrieval=true&useSSL=false", "root", "123456");

在这里插入图片描述

MySQL数据库连接URL格式:jdbc:mysql://127.0.0.1:3306/数据库名?characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false

其中:
jdbc:mysql://-> 固定写法
127.0.0.1:3306/ -> IP+端口号,直接使用即可,无需修改
yu为我本地数据库 -> 根据自己要连接的数据库写即可
characterEncoding=utf8 -> 字符集编码
&allowPublicKeyRetrieval=true&useSSL=false-> 默认即可
root -> 本地数据库名
123456 -> 我的数据库连接密码

  • 通过数据源DataSource 对象获取,推荐在实际开发中应用这种方式

3.6 创建Statement

Statement是⽤于执⾏静态SQL语句并返回执行结果的对象

 // 通过connection获取statement对象
Statement statement = connection.createStatement();

QQ20241125-232419

3.7 定义SQL语句

//可根据相关需求定义,此处仅是示例
String sql = "select * from student";

3.8 执行SQL

  • 执行select查询时返回的是⼀个结果集,⽤ResultSet接收
//接受查询结果
ResultSet resultSet = statement.executeQuery(sql);

接受完后,我们可以对接受的结果集进行打印

//执行返回结果while (resultSet.next()) {long id = resultSet.getLong("id");String name = resultSet.getString("name");String sno = resultSet.getString("sno");int age = resultSet.getInt("age");short gender = resultSet.getShort("gender");Date enrollDate = resultSet.getDate("enroll_date");long classId = resultSet.getLong("class_id");System.out.println(MessageFormat.format("学生编号={0}, 姓名={1}, 学号={2}, 年龄={3}, 性别={4}, 入学时间={5}, " +"班级编号={6}", id, name, sno, age, gender, enrollDate, classId));}
  • 执行insert,update,delete操作时,返回的是受影响的⾏数,⽤int类型接收(int接受的值用于判断更新操作是否成功,1表示成功,0表示失败)

3.9 处理结果释放资源和关闭连接

在整个数据库访问过程中创建的对象都需要释放,包括:ResultSet,Statement和Connection,后创建的先释放,建议在try
catch 语句后的finally代码块中写入,以便程序无论最后是否执行成功,都能保证释放资源和关闭连接

if(resultSet!=null){resultSet=null;}if(statement!=null){statement =null;}if(connection!=null){connection =null;}

4. JDBC常用接口和类

4.1 DriverManager 和DataSource

  • DataSource驱动管理类,⽤于管理JDBC驱动程序,可以从驱动程序中获取数据库连接,始于JDK1.1。
  • DataSource数据源是DriverManager的替代⽅案,始于JDK1.4,是获取数据库连接的首选方法,推荐使用。

4.2 DriverManager 与DataSource的区别

  • DriverManager和DataSource都可以获取到数据库连接,但它们之间存着着⼀些区别,主要在于连接的管理方式和资源利用效率
  • 连接管理方式不同:
    ①DriverManager每次调用getConnection方法都会初始化⼀个新的连接(上文Driver类中,我们注意到过源码中就有new Driver()),使用完成后会关闭真实连接,导致资源浪费
    ②DataSource使用了连接池的技术,会在初始化时创建⼀定数量的数据库连接,这些连接可以重复使用,关闭时并不是真正关闭连接,而是将连接归还给连接池,以供后续使用,有效地提高资源利用率和和性能

4.3 Connection 数据库连接

数据库连接(会话)对象,在连接的上下文中执行SQL语句并返回结果

4.3.1 Statement对象

  • ⽤于执⾏静态SQL语句并返回执⾏结果,由于只能执⾏静态语句,所以这⾥会有⼀个问题,假设⼀个语句中需要动态的参数,⽐如where⼦句中的条件,那么只能通过字符串拼接的⽅式组装完成的SQL语句,比如:
String sql = "select * from student where name = '" + name + "' and class_id = 
" + classId;
  • 字符串拼接形式构造SQL语句时,如果不处理参数中的特殊字符就会造成SQL注⼊,这是⼀个非常严重的安全性问题。

4.3.2 SQL注入

4.3.3 PreparedStatement

  • 预编译SQL语句对象,SQL语句被预编译并存储在PreparedStatement对象中,可以使用该对象多次执行SQL语句,同时可以解决SQL注入问题

示例:通过Connection对象获取到PreparedStatement对象,需要传⼊SQL模板,动态参数用占位符表示

 // 获取了个处理SQL的PrepareStatement对象
PreparedStatement preparedStatement = connection.prepareStatement("select id, 
name, sno, age, gender, enroll_date, class_id from student where name = ? and 
class_id = ?");
  • 为动态参数设置真实值,下标从1开始
 // ⽤真实值去替换占位符 
preparedStatement.setString(1, "宋江");
preparedStatement.setLong(2, 2);
  • 执行SQL语句
// select 操作 
ResultSet resultSet = statement.executeQuery();
// insert, update, delete操作
//増 删 改 返回的是受影响的行数
int result = statement.executeUpdate();
//1 表示插入成功,0表示错误

4.3.4 CallableStatement

用于执行SQL存储过程的接⼝。

4.3.5 executeQuery()

执行结果返回的是⼀个结果集,通常⽤于select操作

4.3.6 executeUpdate()

执行结果返回的是⼀个整形,通常用于insert,update,delete操作

4.3.7 ResultSet结果集

  • 是⼀个查询结果集的数据表,通常由执行查询操作的语句生成。
  • ResultSet对象维护了⼀个指向当前数据行的游标,最初游标位于第⼀行之前,调用next方法将游标移动到下⼀行,当ResultSet中没有更多的数据行时返回false,所以可以在while循环中使用它来遍历结果集。
  • ResultSet接⼝提供了getter方法(getBoolean、getLong等),用于从当前行检索列值,可以使用列的索引号或列的名称来检索值。⼀般来说,使用列索引会更有效率,索引编号从1开始,按照从左到右的顺序读取。

5. 示例

查询名字为唐三藏的信息

import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;
public class TestDataSource {public static void main(String[] args) {// 定义MYSQL数据源对象MysqlDataSource mysqlDataSource = new MysqlDataSource();// 设置数据库连接串mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/yu?characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false");// 用户名mysqlDataSource.setUser("root");// 密码mysqlDataSource.setPassword("123456");// 定义JDBC的数据源对象DataSource dataSource = mysqlDataSource;// 定义数据库连接对象Connection connection = null;// 定义预处理SQL执行对象PreparedStatement statement = null;// 定义结果集对象ResultSet resultSet = null;try {// 1. 通过数据源对象获取数据库连接connection = dataSource.getConnection();// 定义SQL语String sql = "select id, name, sno, age, gender, enroll_date, class_id from student where name = ?";// 2. 预处理SQL执行对象statement = connection.prepareStatement(sql);// 接收用户的输入System.out.println("请输入学生姓名:");Scanner scanner = new Scanner(System.in);String inName = scanner.next();// 3. 用真实的值替换占位符statement.setString(1, inName);// 4. 执行SQL 获取结果resultSet = statement.executeQuery();// 5. 遍历结果集// 6. 遍历结果集,获取数据行while (resultSet.next()) {// 获取ID列的值long id = resultSet.getLong(1);// 获取name列的值String name = resultSet.getString(2);String sno = resultSet.getString(3);int age = resultSet.getInt(4);byte gender = resultSet.getByte(5);Date enrollDate = resultSet.getDate(6);long classId = resultSet.getLong(7);System.out.println(MessageFormat.format("学生编号={0}, 姓名={1}, 学号={2}, 年龄={3}, 性别={4}, 入学时间={5}, " +"班级编号={6}", id, name, sno, age, gender, enrollDate, classId));}} catch (SQLException e) {e.printStackTrace();} finally {// 释放结果集对象if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}// 释放Statementif (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}// 关闭数据库连接if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}

相关文章:

MySQL之JDBC

我们在学习完了数据库的基本操作后&#xff0c;希望和我们的Java程序建立连接&#xff0c;那么我们今天就来一探究竟JDBC是如何让Java程序与数据库建立连接的 1. 什么是JDBC JDBC&#xff08;Java Data Base Connectivity, Java数据库连接&#xff09; 是Java程序和数据库之间…...

音视频入门基础:MPEG2-TS专题(10)——PAT简介

一、引言 当某个transport packet的TS Header中的PID属性的值为0x0000时&#xff0c;该transport packet的payload为Program association table &#xff0c;即 PAT表。PAT表包含所有PMT表的目录列表&#xff0c;将program_number和PMT表的PID相关联&#xff0c;获取数据的起始…...

ElementUI:el-drawer实现在父组件区域内打开抽屉组件非全屏

我们在开发ElementUI的时候遇到抽屉组件全屏的问题&#xff0c;但是我们需要在指定div中展示出来&#xff0c;上代码&#xff1a; 1、在el-drawer中增加属性 el-drawerstyle"position: absolute"z-index"-1":append-to-body"false">// do s…...

Vue教程|搭建vue项目|Vue-CLI2.x 模板脚手架

一、项目构建环境准备 在构建Vue项目之前&#xff0c;需要搭建Node环境以及Vue-CLI脚手架&#xff0c;由于本篇文章为上一篇文章的补充&#xff0c;也是为了给大家分享更为完整的搭建vue项目方式&#xff0c;所以环境准备部分采用Vue教程&#xff5c;搭建vue项目&#xff5c;V…...

jmeter学习(7)命令行控制

jmeter -n -t E:\IOT\test2.jmx -l E:\IOT\output\output.jtl -j E:\IOT\output\jmeter.log -e -o E:\IOT\output\report IOT下创建output 文件夹&#xff0c;jmx文件名避免中文&#xff0c;再次执行output.jtl不能有数据要删除...

BGP协议路由黑洞

一、实验环境 1、分公司与运营商AS自治系统内运行IGP路由协议OSPF、RIP或静态路由&#xff0c;AS自治系统内通过IBGP路由协议建立BGP邻居关系。 2、公司AS自治系统与运营商AS自治系统间运行EBGP路由协议。 3、通过loopback建立IBGP与EBGP邻居关系&#xff0c;发挥loopback建立…...

存储结构及关系(一)

学习目标 描述数据库的逻辑结构列出段类型及其用途列出控制块空间使用的关键字获取存储结构信息 段的类型 段是数据库中占用空间的对象。它们使用数据库数据文件中的空间。介绍不同类型的段。 表 表是在数据库中存储数据的最常用方法。表段用于存储既没有集群也没有分区的表…...

玄机应急:linux入侵排查webshell查杀日志分析

目录 第一章linux:入侵排查 1.web目录存在木马&#xff0c;请找到木马的密码提交 2.服务器疑似存在不死马&#xff0c;请找到不死马的密码提交 3.不死马是通过哪个文件生成的&#xff0c;请提交文件名 4.黑客留下了木马文件&#xff0c;请找出黑客的服务器ip提交 5.黑客留…...

python爬虫安装教程

Python爬虫是用于从网站上自动抓取信息的程序。在开始之前&#xff0c;请确保您了解并遵守目标网站的服务条款&#xff0c;尊重版权法&#xff0c;并且在合理合法的范围内使用爬虫技术。 安装环境 安装Python&#xff1a;首先确保您的计算机上已经安装了Python。推荐版本为3.…...

田忌赛马五局三胜问题matlab代码

问题描述&#xff1a;在可以随机选择出场顺序的情况下&#xff0c;如果把比赛规则从三局两胜制改为五局三胜制&#xff0c;齐王胜出的概率是上升了还是下降了&#xff1f;五局三胜的赛制下&#xff0c;大家的马重新分为5个等级。前提条件仍然是齐王每种等级的马都优于田忌同等级…...

Spring循环依赖问题的解决

项目启动提示如下异常&#xff1a; The dependencies of some of the beans in the application context form a cycle 这表明在我们的应用中存在了循环依赖&#xff0c;示例&#xff1a; Bean A 中注入了Bean B依赖&#xff0c;然后 Bean B 中注入了Bean A依赖。也就是说&…...

KAN-Transfomer——基于新型神经网络KAN的时间序列预测

1.数据集介绍 ETT(电变压器温度)&#xff1a;由两个小时级数据集&#xff08;ETTh&#xff09;和两个 15 分钟级数据集&#xff08;ETTm&#xff09;组成。它们中的每一个都包含 2016 年 7 月至 2018 年 7 月的七种石油和电力变压器的负载特征。 traffic(交通) &#xff1a;描…...

鸿蒙学习自由流转与分布式运行环境-价值与架构定义(1)

文章目录 价值与架构定义1、价值2、架构定义 随着个人设备数量越来越多&#xff0c;跨多个设备间的交互将成为常态。基于传统 OS 开发跨设备交互的应用程序时&#xff0c;需要解决设备发现、设备认证、设备连接、数据同步等技术难题&#xff0c;不但开发成本高&#xff0c;还存…...

【k8s深入理解之 Scheme 补充-2】理解 register.go 暴露的 AddToScheme 函数

AddToScheme 函数 AddToScheme 就是为了对外暴露&#xff0c;方便别人调用&#xff0c;将当前Group组的信息注册到其 Scheme 中&#xff0c;以便了解该 Group 组的数据结构&#xff0c;用于后续处理 项目版本用途使用场景k8s.io/apiV1注册资源某一外部版本数据结构&#xff0…...

uni-app写的微信小程序每次换账号登录时出现缓存上一个账号数据的问题

uni-app写的微信小程序每次更换另外账号登录时出现缓存上一个账号数据的问题&#xff1f; 清除缓存数据&#xff1a;在 onShow 钩子中&#xff0c;我们将 powerStations、list 和 responseRoles 的值重置为初始状态&#xff0c;以清除之前的缓存数据。重新获取数据&#xff1a…...

数据分析流程中的Lambda架构,以及数据湖基于Hadoop、Spark的实现

文章目录 一、Lambda架构1、Lambda的三层架构2、简单解释&#xff1a;3、Lambda架构的优缺点 二、数据湖基于Hadoop、Spark的实现1、架构2、数据管理&#xff08;存储层的辅助功能&#xff09; 一、Lambda架构 1、Lambda的三层架构 Batch View&#xff08;批处理视图层&#…...

Android 原生解析 Json 字符串

Android 原生解析 JSON 字符串 1. JSON 基础2. Android 原生 JSON 解析方法2.1 解析 JSON 字符串到 JSONObject关键方法 2.2 解析 JSON 数组到 JSONArray关键方法 2.3 解析嵌套的 JSON 对象 3. 处理异常4. 总结 在 Android 开发中&#xff0c;我们经常需要从服务器获取 JSON 格…...

Windsurf可以上传图片开发UI了

背景 曾经羡慕Cursor的“画图”开发功能&#xff0c;这不Windsurf安排上了。 Upload Images to Cascade Cascade now supports uploading images on premium models Ask Cascade to build or tweak UI from on image upload New keybindings Keybindings to navigate betwe…...

Qt UI设计 菜单栏无法输入名字

在UI界面“在这里输入”&#xff0c;直接双击填写名称&#xff0c;无论是中文还是英文都没有反应。解决方案 2个&#xff1a; 1.双击“在这里输入之后”&#xff0c;在可编辑状态下&#xff0c;空格→enter键&#xff0c;然后在右下角属性框的title中直接填写中文或英文名&…...

blender 视频背景

准备视频文件 首先&#xff0c;确保你有想要用作背景的视频文件。视频格式最好是 Blender 能够很好兼容的&#xff0c;如 MP4 等常见格式。 创建一个新的 Blender 场景或打开现有场景 打开 Blender 软件后&#xff0c;你可以新建一个场景&#xff08;通过点击 “文件” - “新建…...

【python】OpenCV—Tracking(10.5)—dlib

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数dlib.correlation_tracker() 6、参考 1、功能描述 基于 dlib 库&#xff0c;实现指定类别的目标检测和单目标跟踪 2、代码实现 caffe 模型 https://github.com/MediosZ/MobileNet-SSD/tree/master/…...

音视频入门基础:MPEG2-TS专题(9)——FFmpeg源码中,解码TS Header的实现

一、引言 FFmpeg源码对MPEG2-TS传输流/TS文件解复用时&#xff0c;在通过read_packet函数读取出一个transport packet后&#xff0c;会调用handle_packet函数来处理该transport packet&#xff1a; static int handle_packets(MpegTSContext *ts, int64_t nb_packets) { //..…...

解决“磁盘已插上,但Windows系统无法识别“问题

电脑上有2块硬盘&#xff0c;一块是500GB的固态硬盘&#xff0c;另一块是1000GB的机械硬盘&#xff0c;按下开机键&#xff0c;发现500G的固态硬盘识别了&#xff0c;但1000GB的机械硬盘却无法识别。后面为了描述方便&#xff0c;将"500GB的固态硬盘"称为X盘&#xf…...

论文笔记-WWW2024-ClickPrompt

论文笔记-WWW2024-ClickPrompt: CTR Models are Strong Prompt Generators for Adapting Language Models to CTR Prediction ClickPrompt: CTR模型是大模型适配CTR预测任务的强大提示生成器摘要1.引言2.预备知识2.1传统CTR预测2.2基于PLM的CTR预测 3.方法3.1概述3.2模态转换3.…...

53 基于单片机的8路抢答器加记分

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 首先有三个按键 分别为开始 暂停 复位&#xff0c;然后八个选手按键&#xff0c;开机显示四条杠&#xff0c;然后按一号选手按键&#xff0c;数码管显示&#xff13;&#xff10;&#xff0c;这…...

【java数据结构】二叉树OJ题

【java数据结构】二叉树OJ题 一、检查两颗树是否相同二、另一颗树的子树三、翻转二叉树四、对称二叉树五、判断一颗二叉树是否是平衡二叉树六、给定一个二叉树, 找到该树中两个指定节点的最近公共祖先七、根据一棵树的前序遍历与中序遍历构造二叉树练习&#xff1a;八、二叉树前…...

IIC和SPI的时序图

SCL的变化快慢决定了通信速率&#xff0c;当SCL为低电平的时候&#xff0c;无论SDA是1还是0都不识别&#xff1a; ACK应答&#xff1a;当从设备为低电平的时候识别为从设备有应答&#xff1a; 谁接收&#xff0c;谁应答&#xff1a; 起始位和停止位&#xff1a; IIC的时序图&am…...

MySQL数据库表的操作

1、总述 今天我跟大家分享MySQL数据库中表的创建&#xff0c;查看&#xff0c;修改&#xff0c;删除。 2、创建表 create table table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 说明&#xff1…...

.net core 创建linux服务,并实现服务的自我更新

目录 创建服务创建另一个服务&#xff0c;用于执行更新操作给你的用户配置一些systemctl命令权限 创建服务 /etc/systemd/system下新建服务配置文件&#xff1a;yourapp.service&#xff0c;内容如下&#xff1a; [Unit] Descriptionyourapp Afternetwork.target[Service] Ty…...

springboot338it职业生涯规划系统--论文pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;it职业生涯规划系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以…...

wordpress添加版块/指数基金是什么意思

Machine learning机器学习是Artificial inteligence的核心&#xff0c;分为四类&#xff1a; 1、Supervised learning监督学习 是有特征&#xff08;feature&#xff09;和标签&#xff08;label&#xff09;的&#xff0c;即便是没有标签的&#xff0c;机器也是可以通过特征和…...

四川建设工程网/seo顾问合同

1.例子 需求&#xff1a;设计一套生产冰激凌的系统&#xff0c;以满足顾客以下几种需求&#xff1a;水果冰激凌、奶酪冰激凌、巧克力冰激凌。。。新的需求&#xff1a;水果奶酪冰激凌、奶酪水果巧克力冰激凌。。。请注意食品添加的顺序~ 2.定义 动态地给一个对象添加一些额外的…...

做网站的程序员进什么公司好/深圳搜索竞价账户托管

闰年 经常会有人问你怎么判断闰年&#xff0c;其实很简单&#xff0c;就是如果年份能被4整除但是不能被100整除&#xff0c;或者是能被400整除&#xff0c;那么就是闰年&#xff0c;否则就不是。 输入格式: 输入一个正整数year&#xff08;1 <year <3000&#xff09;。…...

qiniu cloud for wordpress/惠州seo网站排名

和平精英体验服正在为和平精英体验服中秋版模式进行最后的测试更新。和平精英体验服中秋模式上线 中秋模式玩法抢鲜看《和平精英》体验服在最近一次更新中放出了全新的中秋模式&#xff0c;在这个中秋模式中出现了许多新奇的玩法&#xff0c;也拥有了更多可以互动的场景物品。也…...

在网站文章锚文本怎么做/西安网站外包

源码获取&#xff1a;俺的博客首页 "资源" 里下载&#xff01; 项目介绍 本项目为后台管理系统&#xff0c;分为管理员与学生两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,管理员管理,修改密码,教师管理,学生管理,评价指标管理,评价结果查…...

安徽建网站/电商卖货平台有哪些

webpack5配置react基础开发环境 1、前言 之前已经使用webpack5进行了react框架基础环境的搭建&#xff08;基础环境配置&#xff09;&#xff0c;但是每次修改完项目代码都需要重新执行npm run build指令进行构建&#xff0c;并且需要刷新浏览器中的页面查看最新修改的代码结…...