JDBC学习笔记(1)

连接数据库

下载mysql-connector-java,这里我是看的这个连接mysql-connector-java下载。
下载后并且导入了Idea中的lib文件下。
在这里插入图片描述
导入成功后,为了验证可以通过CTRL+n来搜索Driver看看有没有添加进来。
在这里插入图片描述

随后在MySQL中创建一个数据库,我这里直接使用的是Navicat,创建了一个java_learn的数据库
在这里插入图片描述
在测试类中的测试代码
参考文档元动力

package com;import org.junit.Test;import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;public class TestJDBC {@Testpublic void testConnnection1() throws SQLException {//定义要素String driverName="com.mysql.cj.jdbc.Driver";//后面加上时区String url="jdbc:mysql://127.0.0.1:3306/java_learn?serverTimezone=GMT%2B8";String username="root";String password="200625";//加载驱动Driver driver= new com.mysql.cj.jdbc.Driver();//注册驱动DriverManager.registerDriver(driver);//获取连接Connection connection=DriverManager.getConnection(url,username,password);System.out.println(connection);}
}//输出
com.mysql.cj.jdbc.ConnectionImpl@1de76cc7

如上,就说明了数据库连接成功。

也可以更加简洁如下

    @Testpublic void testConnnection2() throws SQLException {//定义要素String driverName="com.mysql.cj.jdbc.Driver";//后面加上时区String url="jdbc:mysql://127.0.0.1:3306/java_learn?serverTimezone=GMT%2B8";String username="root";String password="200625";//加载驱动//new com.mysql.cj.jdbc.Driver();//jdk会默认创建,也可以去掉下面的代码Class.forName(driverName);//获取连接Connection connection=DriverManager.getConnection(url,username,password);System.out.println(connection);}

如果在上面不创建 Class.forName(driverName);这个类的话,会通过SPI自动创建,如下的源码。
在这里插入图片描述
其中会自动读取下面文件中的内容
在这里插入图片描述
在这里插入图片描述

访问数据库

package com.entity;import java.util.Date;public class User {private int id;private String username;private String password;private Date data;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Date getData() {return data;}public void setData(Date data) {this.data = data;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", data=" + data +'}';}
}
 @Testpublic void testStatement2() throws SQLException {//定义要素String driverName="com.mysql.cj.jdbc.Driver";//后面加上时区String url="jdbc:mysql://127.0.0.1:3306/java_learn?serverTimezone=GMT%2B8";String username="root";String password="200625";//让jvm加载一下就行了//Class.forName(driverName);//获取连接Connection connection= DriverManager.getConnection(url,username,password);System.out.println(connection);Statement statement=connection.createStatement();String sql="select * from user_sql";ResultSet resultSet = statement.executeQuery(sql);System.out.println(resultSet);ArrayList<User> users=new ArrayList<>();while(resultSet.next()){User user =new User();int id = resultSet.getInt(1);String name =resultSet.getString(2);String password_sql=resultSet.getString(3);Date birthday=resultSet.getDate(4);user.setId(id);user.setUsername(name);user.setPassword(password_sql);user.setData(birthday);users.add(user);}System.out.println(users);}

优化代码

@Testpublic void testStatement3() throws SQLException {//定义要素String driverName="com.mysql.cj.jdbc.Driver";//后面加上时区String url="jdbc:mysql://127.0.0.1:3306/java_learn?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";String username="root";String password="200625";String sql="select * from user_sql";Connection conn=null;Statement statement =null;ResultSet resultSet = null;try{Driver driver=new com.mysql.cj.jdbc.Driver();DriverManager.registerDriver(driver);conn = DriverManager.getConnection(url,username,password);statement =conn.createStatement();resultSet=statement.executeQuery(sql);ArrayList<User> users=new ArrayList<>();while(resultSet.next()){User user =new User();int id = resultSet.getInt(1);String name =resultSet.getString(2);String password_sql=resultSet.getString(3);Date birthday=resultSet.getDate(4);user.setId(id);user.setUsername(name);user.setPassword(password_sql);user.setData(birthday);users.add(user);}System.out.println(users);}catch (Exception exception){exception.printStackTrace();}finally {if(conn!=null){try{conn.close();}catch (SQLException e){e.printStackTrace();}}if(statement!=null){try{statement.close();}catch (SQLException e){e.printStackTrace();}}if(resultSet!=null){try{resultSet.close();}catch (SQLException e){e.printStackTrace();}}}}

进一步进行优化
对函数进行封装

package com.util;import java.sql.*;public class DBUtil {public static Connection getConnection(){String url="jdbc:mysql://127.0.0.1:3306/java_learn?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";String username="root";String password="200625";String sql="select * from user_sql";Connection conn=null;Statement statement =null;ResultSet resultSet = null;try{Driver driver = new com.mysql.cj.jdbc.Driver();DriverManager.registerDriver(driver);return DriverManager.getConnection(url, username, password);}  catch (Exception exception){exception.printStackTrace();}return null;}public static void closeAll(Connection conn,Statement statement,ResultSet resultSet){if(conn!=null){try{conn.close();}catch (SQLException e){e.printStackTrace();}}if(statement!=null){try{statement.close();}catch (SQLException e){e.printStackTrace();}}if(resultSet!=null){try{resultSet.close();}catch (SQLException e){e.printStackTrace();}}}}
 @Testpublic void testStatement3() throws SQLException {String sql="select * from user_sql";Connection conn=null;Statement statement =null;ResultSet resultSet = null;try{conn = DBUtil.getConnection();statement =conn.createStatement();resultSet=statement.executeQuery(sql);List<User> users=new ArrayList<>();while(resultSet.next()){User user =new User();int id = resultSet.getInt(1);String name =resultSet.getString(2);String password_sql=resultSet.getString(3);Date birthday=resultSet.getDate(4);user.setId(id);user.setUsername(name);user.setPassword(password_sql);user.setData(birthday);users.add(user);}System.out.println(users);}catch (Exception exception){exception.printStackTrace();}finally {DBUtil.closeAll(conn,statement,resultSet);}}

登录的例子

public static void main(String[] args) {//输入用户名和密码Scanner sc= new Scanner(System.in);System.out.println("请输入用户名:");String username = sc.nextLine();System.out.println("请输入密码:");String password=sc.nextLine();String sql = "select * from user_sql where name='"+username+"' and password = '"+password+"'";Connection conn = null;Statement statement = null;ResultSet resultSet = null;try{System.out.println("sql------>"+sql);conn=DBUtil.getConnection();statement=conn.createStatement();resultSet=statement.executeQuery(sql);if(resultSet.next()){System.out.println("登录成功");return;}else {System.out.println("登录失败");}} catch (SQLException throwables) {System.out.println("登录失败");throwables.printStackTrace();}finally {DBUtil.closeAll(conn,statement,resultSet);}}

//输出
请输入用户名:
root
请输入密码:
123
sql------>select * from user_sql where name=‘root’ and password = ‘123’
登录成功

但是其中也有很严重的问题,比如如下的例子:(sql注入,会绕开逻辑)
请输入用户名:
root
请输入密码:
132432423’ or 1='1
sql------>select * from user_sql where name=‘root’ and password = ‘132432423’ or 1=‘1’
登录成功

因为在输入密码的时候后面加上了or 1='1,使得sql代码执行了1=‘1’,这样就会导致结果是true。

PreparedStatement的使用

mysql的预编译:
通常我们发送一条SQL语句给MySQL服务器时,MySQL服务器每次都需要对这条SQL语句进行校验、解析等操作。
但是有很多情况下,我们的一条SQL语句可能需要反复的执行,每次执行可能仅仅是传递的参数不同而已,类似于这样的SQL语句如果每次都需要进行校验、解析等操作,未免太过于浪费性能了,因此产生了SQL语句的预编译。

所谓预编译就是将一些灵活的参数值以占位符?的形式给代替掉,我们把参数值给抽取出来,把SQL语句进行模板化。让MySQL服务器执行相同的SQL语句时,不需要在校验、解析SQL语句上面花费重复的时间。

在这里插入图片描述

-- 预编译 --
PREPARE statement from 'SELECT * FROM user_sql WHERE id=? and name=?';set @id=6;
set @name='root';execute statement using @id,@name;

查看mysql的通用查询日志。

show VARIABLES like '%general_log%'

在这里插入图片描述
发现其中的general_log是OFF,所以这里要增加一个打开的语句。

set GLOBAL general_log=1

如果其中要永久打开通用查询日志,需要在配置文件中进行修改,其中配置文件的路径是C:\ProgramData\MySQL\MySQL Server 8.0
打开其中的my.ini文件,并且将其中的general-log改为1
在这里插入图片描述
改为防止sql注入的方法

    public static void main(String[] args) {String sql = "select * from user_sql where id=?";Connection conn = null;PreparedStatement statement = null;ResultSet resultSet = null;try{System.out.println("sql------>"+sql);conn=DBUtil.getConnection();statement=conn.prepareStatement(sql);statement.setInt(1,3);resultSet=statement.executeQuery();ArrayList<User> users=new ArrayList<>();while(resultSet.next()){User user =new User();int id = resultSet.getInt(1);String name =resultSet.getString(2);String password_sql=resultSet.getString(3);Date birthday=resultSet.getDate(4);user.setId(id);user.setUsername(name);user.setPassword(password_sql);user.setData(birthday);users.add(user);}System.out.println(users);} catch (SQLException throwables) {throwables.printStackTrace();}finally {DBUtil.closeAll(conn,statement,resultSet);}}

改为登录的代码

public static void main(String[] args) {String sql = "select * from user_sql where id=? and password =?";Connection conn = null;PreparedStatement statement = null;ResultSet resultSet = null;try{System.out.println("sql------>"+sql);conn=DBUtil.getConnection();statement=conn.prepareStatement(sql);Scanner sc=new Scanner(System.in);System.out.println("请输入账号");int id_in=sc.nextInt();System.out.println("请输入密码");String psw=sc.next();statement.setInt(1,id_in);statement.setString(2,psw);resultSet=statement.executeQuery();User user =new User();if(resultSet.next()) {int id = resultSet.getInt(1);String name = resultSet.getString(2);String password_sql = resultSet.getString(3);Date birthday = resultSet.getDate(4);user.setId(id);user.setUsername(name);user.setPassword(password_sql);user.setData(birthday);System.out.println(user);}else {System.out.println("登录失败");}} catch (SQLException throwables) {throwables.printStackTrace();}finally {DBUtil.closeAll(conn,statement,resultSet);}}

注解,其中resultSet.next()的具体解释

boolean java.sql.ResultSet.next() throws SQLException Moves the cursor
forward one row from its current position. A ResultSet cursor is
initially positioned before the first row; the first call to the
method next makes the first row the current row; the second call makes
the second row the current row, and so on. When a call to the next
method returns false, the cursor is positioned after the last row. Any
invocation of a ResultSet method which requires a current row will
result in a SQLException being thrown. If the result set type is
TYPE_FORWARD_ONLY, it is vendor specified whether their JDBC driver
implementation will return false or throw anSQLException on a
subsequent call to next. If an input stream is open for the current
row, a call to the method next will implicitly close it. A ResultSet
object’s warning chain is cleared when a new row is read.

将指针移动到当前位置的下一行。
ResultSet指针的初始位置位于第一行之前;
第一次调用next()方法将会把第一行设置为当前行;
第二次调用next()方法指针移动到第二行,以此类推。
当对next()方法调用返回 false,说明此时指针位于最后一行之后。所有对 ResultSet需要使用当前行的方法[注:如getString()、getInt()等等]的调用都将导致next()方法抛出 SQLException异常。如果返回的 ResultSet 集合的类型被设置为 TYPE_FORWARD_ONLY ,会在随后对next()方法的调用中返回false 或抛出 SQLException 异常,因不同的数据库提供者的 JDBC 驱动实现而异。
如果为当前行打开了一个输入流,对next()方法的调用将会隐式地关闭它。 当新的一行读入时,ResultSet对象的警告链将被清空。

小结,PreparedStatement 有一下有点:

1、sql的可读性更强,参数更加灵活更加面向对象,不再是简单的拼接字符串。

2、sql会进行预编译,性能高,可以进行重复利用。

3、sql的预编译同样可以防止sql注入。

增删改查

首先创建如下类
在这里插入图片描述
创建一个用户类

package com.entity;import java.sql.Date;public class User {private Integer id;private String username;private String password;private Date date;public User() {}public User(Integer id, String username, String password, Date date) {this.id = id;this.username = username;this.password = password;this.date = date;}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 getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", date=" + date +'}';}
}

写一个接口

package com.dao;import com.entity.User;import java.util.List;public interface UserDao {/*** 插入数据* @param user 用户实例* @return 受影响的行数*/int insertUser(User user);/*** 根据id删除用户* @param id* @return 受影响的行数*/int deleterUser(int id);/*** 修改用户* @param user 需要修改的用户* @return 修改后的用户*/int updateUser(User user);/*** 根据id选择用户* @param id* @return 结果*/User selectUser(int id);/*** 查询所有的用户* @return 用户列表*/List<User> selectAllUsers();}

对接口中的函数进行重写

package com.dao.impl;import com.dao.UserDao;
import com.entity.User;
import com.util.DBUtil;import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class UserDaoImpl implements UserDao {@Overridepublic int insertUser(User user) {String sql = "insert into user_sql(name,password,birthday) value(?,?,?)";Connection conn = null;PreparedStatement statement = null;ResultSet resultSet = null;try{System.out.println("sql------>"+sql);conn= DBUtil.getConnection();statement=conn.prepareStatement(sql);statement.setString(1,user.getUsername());statement.setString(2,user.getPassword());statement.setDate(3, new Date(new java.util.Date().getTime()));int rows=statement.executeUpdate();return rows;} catch (SQLException throwables) {throwables.printStackTrace();return -1;}finally {DBUtil.closeAll(conn,statement,null);}}@Overridepublic int deleterUser(int id) {String sql = "delete from user_sql where id=?";Connection conn = null;PreparedStatement statement = null;ResultSet resultSet = null;try{System.out.println("sql------>"+sql);conn= DBUtil.getConnection();statement=conn.prepareStatement(sql);statement.setInt(1, id);int rows=statement.executeUpdate();return rows;} catch (SQLException throwables) {throwables.printStackTrace();return -1;}finally {DBUtil.closeAll(conn,statement,null);}}@Overridepublic int updateUser(User user) {String sql = "update user_sql set name =?,password=?,birthday=? where id=? ";Connection conn = null;PreparedStatement statement = null;ResultSet resultSet = null;try{System.out.println("sql------>"+sql);conn= DBUtil.getConnection();statement=conn.prepareStatement(sql);statement.setString(1,user.getUsername());statement.setString(2,user.getPassword());statement.setDate(3,  user.getDate());statement.setInt(4,user.getId());return statement.executeUpdate();} catch (SQLException throwables) {throwables.printStackTrace();return 0;}finally {DBUtil.closeAll(conn,statement,null);}}@Overridepublic User selectUser(int id) {String sql = "select * from user_sql where id=?";Connection conn = null;PreparedStatement statement = null;ResultSet resultSet = null;try{System.out.println("sql------>"+sql);conn= DBUtil.getConnection();statement=conn.prepareStatement(sql);statement.setInt(1,id);resultSet=statement.executeQuery();User user =new User();if(resultSet.next()) {String name = resultSet.getString("name");String password_sql = resultSet.getString("password");Date birthday = resultSet.getDate("birthday");user.setId(id);user.setUsername(name);user.setPassword(password_sql);user.setDate(birthday);return user;}else {return null;}} catch (SQLException throwables) {throwables.printStackTrace();return null;}finally {DBUtil.closeAll(conn,statement,resultSet);}}@Overridepublic List<User> selectAllUsers() {String sql = "select id,name,password,birthday from user_sql";Connection conn = null;PreparedStatement statement = null;ResultSet resultSet = null;List<User> L=new ArrayList<>();try{System.out.println("sql------>"+sql);conn= DBUtil.getConnection();statement=conn.prepareStatement(sql);resultSet=statement.executeQuery();while (resultSet.next()) {User user =new User();int id=resultSet.getInt(1);String name = resultSet.getString(2);String password_sql = resultSet.getString(3);Date birthday = resultSet.getDate(4);user.setId(id);user.setUsername(name);user.setPassword(password_sql);user.setDate(birthday);L.add(user);}} catch (SQLException throwables) {throwables.printStackTrace();}finally {DBUtil.closeAll(conn,statement,resultSet);}return L;}
}

增删改查测试

    @Testpublic  void TestInsert() {User user =new User(null,"lym","123",new Date(new java.util.Date().getTime()));UserDao userDao=new UserDaoImpl();userDao.insertUser(user);}@Testpublic  void TestDelete() {int id=11;//打算删除的用户UserDao userDao=new UserDaoImpl();userDao.deleterUser(11);}@Testpublic  void TestUpdate() {User user =new User(8,"lym","123",new Date(new java.util.Date().getTime()));UserDao userDao=new UserDaoImpl();userDao.updateUser(user);}@Testpublic  void TestSelect() {UserDao userDao=new UserDaoImpl();User user=userDao.selectUser(3);System.out.println(user);}@Testpublic  void TestSelectAll() {UserDao userDao=new UserDaoImpl();List<User> L=userDao.selectAllUsers();System.out.println(L);}

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

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

相关文章

uboot启动流程-涉及_main汇编函数

一. uboot启动流程涉及函数 本文简单分析一下 save_boot_params_ret调用的函数&#xff1a;_main汇编函数。 本文继之前文章的学习&#xff0c;地址如下&#xff1a; uboot启动流程-涉及s_init汇编函数_凌肖战的博客-CSDN博客 二. uboot启动流程涉及的 _main汇编函数 经过之…

Beats Studio Buds 连接 Windows 11 声音输出不显示设备

Beats Studio Buds 连接 Windows 11 声音输出不显示设备 Beats Studio Buds 蓝牙耳机连接Windows 11电脑后&#xff0c;无法通过耳机播放声音&#xff0c;在声音输出选项中也没有耳机选项。 问题 蓝牙耳机连接电脑。 在声音输出中查看输出设备选项。 解决方法 以管理员身…

Python中匹配模糊的字符串

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 如何使用thefuzz 库&#xff0c;它允许我们在python中进行模糊字符串匹配。 此外&#xff0c;我们将学习如何使用process 模块&#xff0c;该模块允许我们在模糊…

淘宝天猫渠道会员购是什么意思?如何开通天猫淘宝渠道会员购有什么用?

淘宝天猫渠道会员购是什么意思&#xff1f; 淘宝天猫渠道会员购与淘宝天猫粉丝福利购意思基本相同&#xff0c;都可以领取淘宝天猫大额内部隐藏优惠券、通过草柴APP开通绑定渠道会员还可以获得购物返利。 草柴APP如何绑定开通淘宝天猫渠道会员&#xff1f; 1、手机下载安装「…

【改进哈里鹰算法(NCHHO)】使用混沌和非线性控制参数来提高哈里鹰算法的优化性能,解决车联网相关的路由问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

数学建模三大类模型适用场景及建模方法(纯干货)(3)

目录 一&#xff0c;评价类算法 1&#xff0c;层次分析法 ●基本思想: ●基本步骤: ●优点: ●缺点 ●适用范围: ●改进方法: 2&#xff0c;灰色综合评价法&#xff08;灰色关联度分析&#xff09; ●基本思想: ●基本步骤: ●优点: ●缺点: ●适用范围: ●改进方…

游戏制作资源推荐

教程 创建僵尸第一人称射击游戏 | 虚幻引擎 5 初学者教程https://www.youtube.com/watch?vqOam3QjGE8g ​​​​​​​ 虚幻商城免费资产 人物资产 各种角色应有尽有 关键词&#xff1a;paragon &#xff1b;推荐程度&#xff1a;三颗星

CBA球员注册管理系统(计科课设)

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;数据结构初阶 ⭐代码仓库&#xff1a;Data Structure 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff…

SpringBoot注册web组件

目录 前言 一、注册Servlet组件 1.1 使用SpringBoot注解加继承HttpServet类注册 1.2 通过继承HttpServet类加配置类来进行注册 二、注册Listener组件 2.1 使用SpringBoot注解和实现ServletContextListener接口注册 2.2 ServletContextListener接口和配置类来进行注册 …

算法框架-LLM-1-Prompt设计(一)

原文&#xff1a;算法框架-LLM-1-Prompt设计&#xff08;一&#xff09; - 知乎 目录 收起 1 prompt-engineering-for-developers 1.1 Prompt Engineering 1.1.1 提示原则 1. openai的环境 2. 两个基本原则 3. 示例 eg.1 eg.2 结构化输出 eg.3 模型检验 eg.4 提供示…

uwb人员定位系统:人员轨迹实时定位

UWB定位系统是一种基于超宽带技术的定位系统。它与传统的通信技术不同&#xff0c;不需要使用载波&#xff0c;而是通过发送和接收具有纳秒或微妙级以下的极窄脉冲来实现无线传输。这种系统的优势包括低功耗、对信道衰落不敏感、抗环境能力强、不会对同一环境下的其他设备造成影…

深度学习(1)---卷积神经网络(CNN)

文章目录 一、发展历史1.1 CNN简要说明1.2 猫的视觉实验1.3 新认知机1.4 LeNet-51.5 AlexNet 二、卷积层2.1 图像识别特点2.2 卷积运算2.3 卷积核2.4 填充和步长2.5 卷积计算公式2.6 多通道卷积 三、池化层 一、发展历史 1.1 CNN简要说明 1. 卷积神经网络&#xff08;Convolut…

淘宝/天猫获得淘宝商品详情API(含测试示例)

taobao.item_get 调用说明 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中进入测试&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]c…

【计算机网络】HTTP协议详解(举例解释,超级详细)

文章目录 一、HTTP协议简单介绍 1、1 什么是HTTP协议 1、2 再次理解“协议” 二、HTTP请求 2、1 HTTP的工作过程 2、1、1 demo代码 2、2 URL 介绍 2、2、1 urlencode 和 urldecode 2、3 HTTP 请求格式 三、HTTP响应 3、1 响应demo 3、2 HTTP 响应格式 四、HTTP 请求和响应中的…

Leetcode.965 单值二叉树

本专栏内容为&#xff1a;leetcode刷题专栏&#xff0c;记录了leetcode热门题目以及重难点题目的详细记录 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;八大排序汇总 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &…

HTML之如何下载网页中的音频(二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

一篇博客学会系列(3) —— 对动态内存管理的深度讲解以及经典笔试题的深度解析

目录 动态内存管理 1、为什么存在动态内存管理 2、动态内存函数的介绍 2.1、malloc和free 2.2、calloc 2.3、realloc 3、常见的动态内存错误 3.1、对NULL指针的解引用操作 3.2、对动态开辟空间的越界访问 3.3、对非动态开辟内存使用free释放 3.4、使用free释放一块动态…

Vue中如何进行多语言处理

Vue中的多语言处理 在开发多语言Web应用程序时&#xff0c;处理文本翻译和国际化是一个重要的任务。Vue.js提供了多种方法来实现多语言处理&#xff0c;以确保您的应用程序能够支持不同语言的用户。本文将深入探讨在Vue中进行多语言处理的方法&#xff0c;并提供示例代码来帮助…

基于Dijkstra、A*和动态规划的移动机器人路径规划(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

(c++)类和对象 下篇

目录 1.再次了解构造函数 2. Static成员 3. 友元 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 1.再次了解构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { pub…