MySQL数据库(数据库连接池)

文章目录

    • 1.批处理应用
        • 1.基本介绍
        • 2.批处理演示
          • 1.创建测试表
          • 2.修改url
          • 3.编写java代码
        • 3.批处理源码分析
    • 2.数据库连接池
        • 1.传统连接弊端分析
        • 2.数据库连接池基本介绍
          • 1.概念介绍
          • 2.数据库连接池示意图
          • 3.数据库连接池种类
    • 3.C3P0连接池
        • 1.环境配置
          • 1.导入jar包
          • 2.将整个lib添加到项目中
          • 3.配置代码提示
        • 2.C3P0方式一(java程序)
        • 3.C3P0方式二(配置文件)
          • 1.环境配置
            • 1.将c3p0-config.xml配置文件复制到src目录下
            • 2.修改配置文件的参数
          • 2.编写java代码
    • 4.德鲁伊连接池
        • 1.环境配置
          • 1.导入jar包
          • 2.将配置文件复制到src目录下,名字任意
          • 3.修改配置文件的参数
        • 2.编写java代码
    • 5.德鲁伊工具类
        • 1.编写代码
        • 2.测试使用
    • 6.Apache——DBUtils
        • 1.引出
        • 2.基本介绍
        • 3.Apache——DBUtils查询
          • 1.添加依赖
          • 2.编写java代码
            • 1.Actor.java(封装每一行的bean)
            • 2.查询多条记录
          • 3.查询单条记录
          • 4.查询单行单列记录
        • 4.DML操作
    • 7.BasicDao
        • 1.引出
        • 2.BasicDao分析
        • 3.代码实现
          • 1.文件目录
          • 2.BasicDao
          • 3.ActorDao
          • 4.Actor
          • 5.TestDao
          • 6.JDBCUtilsByDruid
          • 7.druid.properties

1.批处理应用

1.基本介绍

image-20240118195806605

image-20240118203024400

2.批处理演示

image-20240118203433909

1.创建测试表
-- 创建的测试表
CREATE TABLE admin2(id INT PRIMARY key auto_increment,username VARCHAR(32) NOT NULL,PASSWORD VARCHAR(32) NOT NULL
)
-- 查看表数据
SELECT * FROM admin2 
-- 查看行数
SELECT count(*) FROM admin2
2.修改url

image-20240118204517836

?rewriteBatchedStatements=true //添加这行代码
3.编写java代码
package jdbc_;import org.junit.jupiter.api.Test;
import utils.JDBCUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;/*** @author 孙显圣* @version 1.0*/
public class Batch_ {@Testpublic void testDML() {//建立连接Connection connection = JDBCUtils.getConnection();//编写sql语句进行插入String sql = "insert into admin2 values (null, ?, ?)";PreparedStatement preparedStatement = null;try {preparedStatement = connection.prepareStatement(sql);//循环进行预处理,并添加到处理包中for (int i = 0; i < 5000; i++) {preparedStatement.setString(1, "Tom");preparedStatement.setString(2, "666666");//1.添加到处理包中,先不执行preparedStatement.addBatch();if ((i + 1) % 1000 == 0) {//2.每执行1000次则执行一次preparedStatement.executeBatch();//3.执行之后清空处理包中的sql语句preparedStatement.clearBatch();}}} catch (SQLException e) {throw new RuntimeException(e);} finally {//关闭资源JDBCUtils.close(null, preparedStatement, connection);}}
}
3.批处理源码分析

image-20240118205608298

image-20240118205232540

2.数据库连接池

1.传统连接弊端分析

image-20240119091642286

image-20240119091627707

2.数据库连接池基本介绍
1.概念介绍

image-20240119091910403

2.数据库连接池示意图

image-20240119092246324

3.数据库连接池种类

image-20240119092345612

3.C3P0连接池

1.环境配置
1.导入jar包

image-20240119094059495

2.将整个lib添加到项目中

image-20240119094146794

3.配置代码提示

image-20240119094217187

2.C3P0方式一(java程序)
    @Testpublic void testC3P01() throws Exception  {//1.创建一个数据源对象,可以理解为这个数据源对象就是那个连接池ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();//2.读取配置文件,获取url,user,password,driverProperties properties = new Properties();properties.load(new FileInputStream("src\\mysql.properties"));String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");String driver = properties.getProperty("driver");//3.给数据源设置相关参数comboPooledDataSource.setJdbcUrl(url);comboPooledDataSource.setUser(user);comboPooledDataSource.setPassword(password);comboPooledDataSource.setDriverClass(driver);//4.设置初始化参数comboPooledDataSource.setInitialPoolSize(10); //初始化连接数comboPooledDataSource.setMaxPoolSize(50); //最大连接数//5.获取连接Connection connection = comboPooledDataSource.getConnection();System.out.println("连接OK");//6.关闭连接connection.close();}
3.C3P0方式二(配置文件)
1.环境配置
1.将c3p0-config.xml配置文件复制到src目录下
<c3p0-config><!-- 数据源名称,可以随意--><named-config name="hello"><!-- 驱动类 --><property name="driverClass">com.mysql.cj.jdbc.Driver</property><!-- url--><property name="jdbcUrl">jdbc:mysql://localhost:3306/hsp_db02</property><!-- 用户名 --><property name="user">root</property><!-- 密码 --><property name="password">root</property><!-- 每次增长的连接数--><property name="acquireIncrement">5</property><!-- 初始的连接数 --><property name="initialPoolSize">10</property><!-- 最小连接数 --><property name="minPoolSize">5</property><!-- 最大连接数 --><property name="maxPoolSize">50</property><!-- 可连接的最多的命令对象数 --><property name="maxStatements">5</property><!-- 每个连接对象可连接的最多的命令对象数 --><property name="maxStatementsPerConnection">2</property></named-config>
</c3p0-config>
2.修改配置文件的参数

image-20240119100430525

2.编写java代码
    @Testpublic void testC3P02() throws Exception {//1.创建与配置文件名称相同的数据源ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("hello"); //注意:这里的hello是配置文件中的名字//2.获取连接Connection connection = comboPooledDataSource.getConnection();System.out.println("连接OK");//3.关闭连接connection.close();}

4.德鲁伊连接池

1.环境配置
1.导入jar包

image-20240119101351299

2.将配置文件复制到src目录下,名字任意

image-20240119101549362

#key=value
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/girls?rewriteBatchedStatements=true
#url=jdbc:mysql://localhost:3306/girls
username=root
password=root
#initial connection Size
initialSize=10
#min idle connecton size
minIdle=5
#max active connection size
maxActive=50
#max wait time (5000 mil seconds)
maxWait=5000
3.修改配置文件的参数

image-20240119102116306

2.编写java代码
package datasource;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;/*** @author 孙显圣* @version 1.0*/
public class Druid_ {public static void main(String[] args) throws Exception {//1.读取配置文件Properties properties = new Properties();properties.load(new FileInputStream("src\\druid.properties"));//2.创建数据源对象(就是连接池),将配置文件传进去DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);//3.获取连接Connection connection = dataSource.getConnection();System.out.println("连接OK");//4.关闭连接connection.close();}
}

5.德鲁伊工具类

1.编写代码
package utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;/*** @author 孙显圣* @version 1.0*/
public class JDBCUtilsByDruid {//静态数据源引用(jdbc的接口)private static DataSource dataSource;//静态代码块,在类加载时为数据源引用赋值static {//1.读取配置文件Properties properties = new Properties();try {properties.load(new FileInputStream("src\\druid.properties"));} catch (IOException e) {throw new RuntimeException(e);}//2.使用配置文件,创建德鲁伊数据源对象try {dataSource = DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {throw new RuntimeException(e);}}//编写getConnection方法public static Connection getConnection() {try {return dataSource.getConnection();} catch (SQLException e) {throw new RuntimeException(e);}}//把Connection对象放回连接池public static void close(ResultSet resultSet, Statement statement, Connection connection) {try {if (resultSet != null) {resultSet.close();}if (statement != null) {statement.close();}if (connection != null) {connection.close();}} catch (SQLException e) {throw new RuntimeException(e);}}}
2.测试使用
package datasource;import org.junit.jupiter.api.Test;
import utils.JDBCUtilsByDruid;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** @author 孙显圣* @version 1.0*/
public class DruidUtils_Use {@Testpublic void testSelect() {//建立连接Connection connection = JDBCUtilsByDruid.getConnection();//编写sql语句进行查询String sql = "select name, phone from actor where id = ?";PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//进行预处理preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1, 8);//执行查询resultSet = preparedStatement.executeQuery();while (resultSet.next()) {String string = resultSet.getString("name");String string1 = resultSet.getString("phone");System.out.println(string + " " + string1);}} catch (SQLException e) {throw new RuntimeException(e);} finally {//关闭资源JDBCUtilsByDruid.close(resultSet, preparedStatement, connection);}}}

6.Apache——DBUtils

1.引出

image-20240119133851789

2.基本介绍

image-20240119134845277

3.Apache——DBUtils查询

image-20240119135310282

1.添加依赖

image-20240119135911819

2.编写java代码
1.Actor.java(封装每一行的bean)
package datasource;import java.sql.Timestamp;/*** @author 孙显圣* @version 1.0* 这是一个bean,用来封装actor表的每一行数据*/
public class Actor {private Integer id; //注意要使用包装类private String name;private String sex;private Timestamp borndate; //mysql8只能用这个类型来接受datetimeprivate String phone;public Actor() { //一定要给一个无参构造器[反射需要]}public Actor(Integer id, String name, String sex, Timestamp borndate, String phone) {this.id = id;this.name = name;this.sex = sex;this.borndate = borndate;this.phone = phone;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Timestamp getBorndate() {return borndate;}public void setBorndate(Timestamp borndate) {this.borndate = borndate;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "\nActor{" +"id=" + id +", name='" + name + '\'' +", sex='" + sex + '\'' +", borndate=" + borndate +", phone='" + phone + '\'' +'}';}}
2.查询多条记录

new BeanListHandler<>(Actor.class)

package datasource;import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.jupiter.api.Test;
import utils.JDBCUtilsByDruid;import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;/*** @author 孙显圣* @version 1.0*/
public class DBUtils_USE {@Testpublic void testQueryMan() throws SQLException {//1.得到连接Connection connection = JDBCUtilsByDruid.getConnection();//2.创建QueryRunnerQueryRunner queryRunner = new QueryRunner();//3.编写sqlString sql = "select borndate from actor where id >= ?";//4.调用方法,返回ArrayList结果集,其中每一个元素都是表的一行,封装到了bean中List<Actor> query = queryRunner.query(connection, sql, new BeanListHandler<>(Actor.class), 1); //1就是给里面的问号赋值//5.获取每一行的beanfor (Actor actor : query) {System.out.println(actor);}//6.关闭连接,他会自动关闭resultset和preparedStatementJDBCUtilsByDruid.close(null, null, connection);}}
3.查询单条记录

new BeanHandler<>(Actor.class)

    @Testpublic void testQuerySingle() {//1.获取连接Connection connection = JDBCUtilsByDruid.getConnection();//2.创建queryRunnerQueryRunner queryRunner = new QueryRunner();//3.编写sqlString sql = "select * from actor where id = ?";//4.调用查询方法Actor query = null;try {query = queryRunner.query(connection, sql, new BeanHandler<>(Actor.class), 8);} catch (SQLException e) {throw new RuntimeException(e);}System.out.println(query);//5.关闭资源try {connection.close();} catch (SQLException e) {throw new RuntimeException(e);}}
4.查询单行单列记录

new ScalarHandler()

    @Testpublic  void testScalar() {//1.获取连接Connection connection = JDBCUtilsByDruid.getConnection();//2.创建queryRunnerQueryRunner queryRunner = new QueryRunner();//3.编写sqlString sql = "select name from actor where id = ?"; //单行单列//4.查询try {Object query = queryRunner.query(connection, sql, new ScalarHandler(), 8);System.out.println(query);} catch (SQLException e) {throw new RuntimeException(e);}//5.关闭资源try {connection.close();} catch (SQLException e) {throw new RuntimeException(e);}}
4.DML操作
    @Testpublic void testDML() throws SQLException {//1.获取连接Connection connection = JDBCUtilsByDruid.getConnection();//2.创建queryRunnerQueryRunner queryRunner = new QueryRunner();//3.编写sql//增加String sql1 = "insert into actor values(?, ?, ?, ?, ?)";//删除String sql2 = "delete from actor where id = ?";//修改String sql3 = "update actor set phone = ?";//4.执行sqlint update = queryRunner.update(connection, sql1, null, "张三丰", "男", "2005-11-02", "51552");int update1 = queryRunner.update(connection, sql2, 11);int update2 = queryRunner.update(connection, sql3, 123456);//5.关闭资源try {connection.close();} catch (SQLException e) {throw new RuntimeException(e);}}

7.BasicDao

1.引出

image-20240119162157480

image-20240119162211983

2.BasicDao分析

image-20240119162441113

3.代码实现
1.文件目录

image-20240119173803106

2.BasicDao
package BasicDao_;import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import utils.JDBCUtilsByDruid;import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;/*** @author 孙显圣* @version 1.0* 开发BasicDAO , 是其他DAO的父类*/
public class BasicDao<T> { //泛型指定具体类型private QueryRunner qr =  new QueryRunner();//开发通用的dml方法, 针对任意的表public int update(String sql, Object... parameters) {Connection connection = null;try {connection = JDBCUtilsByDruid.getConnection();int update = qr.update(connection, sql, parameters);return  update;} catch (SQLException e) {throw  new RuntimeException(e); //将编译异常->运行异常 ,抛出} finally {JDBCUtilsByDruid.close(null, null, connection);}}//返回多个对象(即查询的结果是多行), 针对任意表/**** @param sql sql 语句,可以有 ?* @param clazz 传入一个类的Class对象 比如 Actor.class* @param parameters 传入 ? 的具体的值,可以是多个* @return 根据Actor.class 返回对应的 ArrayList 集合*/public List<T> queryMulti(String sql, Class<T> clazz, Object... parameters) {Connection connection = null;try {connection = JDBCUtilsByDruid.getConnection();return qr.query(connection, sql, new BeanListHandler<T>(clazz), parameters);} catch (SQLException e) {throw  new RuntimeException(e); //将编译异常->运行异常 ,抛出} finally {JDBCUtilsByDruid.close(null, null, connection);}}//查询单行结果 的通用方法public T querySingle(String sql, Class<T> clazz, Object... parameters) {Connection connection = null;try {connection = JDBCUtilsByDruid.getConnection();return  qr.query(connection, sql, new BeanHandler<T>(clazz), parameters);} catch (SQLException e) {throw  new RuntimeException(e); //将编译异常->运行异常 ,抛出} finally {JDBCUtilsByDruid.close(null, null, connection);}}//查询单行单列的方法,即返回单值的方法public Object queryScalar(String sql, Object... parameters) {Connection connection = null;try {connection = JDBCUtilsByDruid.getConnection();return  qr.query(connection, sql, new ScalarHandler(), parameters);} catch (SQLException e) {throw  new RuntimeException(e); //将编译异常->运行异常 ,抛出} finally {JDBCUtilsByDruid.close(null, null, connection);}}}
3.ActorDao
package BasicDao_.dao;import BasicDao_.domain.Actor;/*** @author 孙显圣* @version 1.0*/
public class ActorDao extends BasicDao<Actor>{//拥有BasicDao所有的方法//根据业务需求可以写上特有的方法
}
4.Actor
package BasicDao_.domain;import java.sql.Timestamp;/*** @author 孙显圣* @version 1.0* 这是一个bean,用来封装actor表的每一行数据*/
public class Actor {private Integer id;private String name;private String sex;private Timestamp borndate; //mysql8只能用这个类型来接受datetimeprivate String phone;public Actor() { //一定要给一个无参构造器[反射需要]}public Actor(Integer id, String name, String sex, Timestamp borndate, String phone) {this.id = id;this.name = name;this.sex = sex;this.borndate = borndate;this.phone = phone;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Timestamp getBorndate() {return borndate;}public void setBorndate(Timestamp borndate) {this.borndate = borndate;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "\nActor{" +"id=" + id +", name='" + name + '\'' +", sex='" + sex + '\'' +", borndate=" + borndate +", phone='" + phone + '\'' +'}';}}
5.TestDao
package BasicDao_.test;import BasicDao_.dao.ActorDao;
import BasicDao_.domain.Actor;import java.util.List;/*** @author 孙显圣* @version 1.0*/
public class TestDao {public static void main(String[] args) {//测试一下ActorDao对actor表的操作ActorDao actorDao = new ActorDao();//1.查询List<Actor> actors = actorDao.queryMulti("select * from actor where id >?", Actor.class, 2);for (Actor actor : actors) {System.out.println(actor);}//2.查询单行记录Actor actor = actorDao.querySingle("select * from actor where id = ?", Actor.class, 4);System.out.println(actor);//3.查询单行单列记录Object o = actorDao.queryScalar("select name from actor where id = ?", 9);System.out.println(o);//4.增加一条记录int update = actorDao.update("insert into actor values(?,?,?,?,?)", null, "王五", "女", "2002-1-9", "5455555");System.out.println(update > 0 ? "成功" : "失败");//5.删除一条记录int update1 = actorDao.update("delete from actor where id > ?", 10);System.out.println(update1 > 0 ? "成功" : "失败");//6.修改一条记录int update2 = actorDao.update("update actor set name = ?", "女");System.out.println(update2 > 0 ? "成功" : "失败");}
}
6.JDBCUtilsByDruid
package BasicDao_.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;/*** @author 孙显圣* @version 1.0*/
public class JDBCUtilsByDruid {//静态数据源引用(jdbc的接口)private static DataSource dataSource;//静态代码块,在类加载时为数据源引用赋值static {//1.读取配置文件Properties properties = new Properties();try {properties.load(new FileInputStream("src\\druid.properties"));} catch (IOException e) {throw new RuntimeException(e);}//2.使用配置文件,创建德鲁伊数据源对象try {dataSource = DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {throw new RuntimeException(e);}}//编写getConnection方法public static Connection getConnection() {try {return dataSource.getConnection();} catch (SQLException e) {throw new RuntimeException(e);}}//把Connection对象放回连接池public static void close(ResultSet resultSet, Statement statement, Connection connection) {try {if (resultSet != null) {resultSet.close();}if (statement != null) {statement.close();}if (connection != null) {connection.close();}} catch (SQLException e) {throw new RuntimeException(e);}}}
7.druid.properties
#key=value
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/hsp_db02?rewriteBatchedStatements=true
#url=jdbc:mysql://localhost:3306/girls
username=root
password=root
#initial connection Size
initialSize=10
#min idle connecton size
minIdle=5
#max active connection size
maxActive=50
#max wait time (5000 mil seconds)
maxWait=5000

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

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

相关文章

如何设计一个通用的 Excel 导入导出功能?

以JSON配置的方式去实现通用性和动态调整&#xff0c;当然&#xff0c;这个通用仍然存在一定的局限性&#xff0c;每个项目的代码风格都不同。 想要写出一个适合所有项目的通用性模块并不容易&#xff0c;这里的通用局限于其所在项目&#xff0c;所以该功能代码如果不适用于自…

初学者必看!bashplotlib库让你轻松在Bash脚本中实现数据可视化

1. 是什么 bashplotlib 是一个 Python 库&#xff0c;用于在 Bash 脚本中生成数据可视化。它允许用户使用 Python 代码创建各种类型的图表&#xff0c;并将它们嵌入到 Bash 脚本中。bashplotlib 支持多种图表类型&#xff0c;包括条形图、折线图、饼图等。 2. 核心功能 bashplo…

YOLOv8全网独家改进: 小目标 | 注意力 |卷积和注意力融合模块(CAFMAttention) | 2024年4月最新成果

💡💡💡本文独家改进:卷积和注意力融合模块(CAFMAttention),增强对全局和局部特征的提取能力,2024年最新的改进思路 💡💡💡创新点:卷积和注意力巧妙设计 💡💡💡如何跟YOLOv8结合:1)放在backbone后增强对全局和局部特征的提取能力;2)放在detect前面,增…

共享社会经济路径(SSP1-5)中国及分省人口预估数据库_v2

v1数据集&#xff1a; 在共享社会经济路径&#xff08;SSPs&#xff09;全球框架下&#xff0c;根据本地化人口和经济参数&#xff0c;采用人口-发展-环境&#xff08;PDE&#xff09;模型&#xff0c;构建2020-2100年SSPs人口格点数据&#xff1b;采用柯布-道格拉斯&#xff…

MySQL基础知识(一)-超详细Windows系统安装MySQL详细教程

1.简介 原计划&#xff0c;今天这篇想要给小伙伴们讲解一下python操作mysql数据库&#xff0c;但是由于近期换了一台新的电脑&#xff0c;所以一看mysql数据库都没安装&#xff0c;所有才有了这篇文章。尽管网上不乏此类型的文章&#xff0c;但是刚好自己要安装&#xff0c;所以…

8个例子探秘 Python 元类与定制类

大家好&#xff0c;今天我们要一起探索 Python 世界里的神秘角色——元类&#xff08;Metaclasses&#xff09;&#xff0c;它们就像魔法一样&#xff0c;能让我们的类变得超乎寻常。想象一下&#xff0c;如果你的类能自己决定自己的行为&#xff0c;那是不是超级酷炫&#xff…

3.5网安学习第三阶段第五周回顾(个人学习记录使用)

本周重点 ①SSRF服务器端请求伪造 ②序列化和反序列化 ③Vaudit代码审计 本周主要内容 ①SSRF服务器端请求伪造 一、概述 SSRF: server site request forgery (服务器端请求伪造)。 SSR: 服务端请求&#xff0c;A服务器通过函数向B服务器发送请求。 SSRF发生的前提条件…

STM32-02基于HAL库(CubeMX+MDK+Proteus)GPIO输出案例(LED流水灯)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式&#xff0c;生成代码四、MDK打开生成项目&#xff0c;编写HAL库的GPIO输出代码五、运行仿真程序&#xff0c;调试代码 一、功能需求分析 在完成开发环境搭建之后&#xff0c;开始使用STM32GP…

谷歌google广告和必应Bing广告,是否二选一?

搜索引擎广告凭借其精准定向、高度可见性和高效转化能力&#xff0c;成为众多企业拓展海外市场、提升品牌影响力的重要手段。其中&#xff0c;谷歌Google与必应Bing作为全球两大主流搜索引擎&#xff0c;各自拥有庞大的用户群体与独特的市场优势。面对这两大广告平台&#xff0…

【Qt 学习笔记】Qt 背景介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt 背景介绍 文章编号&#xff1a;Qt 学习笔记 / 01 文章目录 Qt 背景…

C++面向对象程序设计 - 构造函数

C提供了构造函数来处理对象的初始化&#xff0c;构造函数是一种特殊的成员函数&#xff0c;与其他成员函数不同&#xff0c;它不需要用户来调用&#xff0c;而是在建立对象时自动执行。构造函数名称必须与类同名&#xff0c;而不能由用户任意命名&#xff0c;以便编译系统能识别…

车载以太网AVB交换机 TSN交换机 时间敏感网络 11口 千兆 SW2000TSN

目录 一、TSN时间敏感交换机概述 二、产品介绍 SW2000M/H TSN 1、产品框架 2、产品特点与参数 产品特点 产品参数 3、配置与使用 4、常用连接方式 4.1 双通道作为监控和数据采集器&#xff0c;采集两个设备间的通信数据&#xff08;Bypass功能&#xff09; 4.2 试验搭…