JDBC入门笔记

2023-05-16

目录

1,JDBC概述

1.1 JDBC概念

2,JDBC快速入门 

Java操作数据库的流程

2.1 编写代码步骤  

3  JDBC API详解

3.1 DriverManager

3.2 Connection

3.2.1 获取执行对象

3.2.2 事务管理

3.3 Statement

DDL与DML的区别

3.3.1 概述

3.4 ResultSet

3.4.1 概述

ResultSet(结果集对象)作用:

3.4.2 代码实现

3.5 案例

3.6 PreparedStatement

3.6.1 SQL注入

3.6.3 PreparedStatement概述

3.6.4 使用PreparedStatement改进(跳过)

4.2 数据库连接池实现

​编辑

4.3 Driud使用  


1JDBC概述

1.1 JDBC概念

2JDBC快速入门 

Java操作数据库的流程

2.1 编写代码步骤  

1.创建工程,导入驱动 jar
2. 注册驱动
Class .forName ( "com.mysql.jdbc.Driver" );
3.获取连接
Connection conn =
DriverManager .getConnection (url, username,
password);
Java 代码需要发送 SQL MySQL 服务端,就需要先建立连接

4.定义 SQL 语句
String sql = “update…” ;
5.获取执行 SQL 对象
执行 SQL 语句需要 SQL 执行对象,而这个执行对象就是
Statement 对象
Statement stmt = conn .createStatement ();
6.执行 SQL
stmt .executeUpdate (sql);
7.
处理返回结果
释放资源
编写代码如下
/**
* JDBC快速入门
*/
public class JDBCDemo {
    public static void main(String[] args) throws
Exception {
        //1. 注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接
        String url =
"jdbc:mysql://127.0.0.1:3306/db1";
        String username = "root";
        String password = "1234";
        Connection conn =
DriverManager.getConnection(url, username,
password);
        //3. 定义sql
        String sql = "update account set money =
2000 where id = 1";
        //4. 获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        //5. 执行sql
        int count = stmt.executeUpdate(sql);//受影响
的行数
        //6. 处理结果
        System.out.println(count);
        //7. 释放资源
        stmt.close();
        conn.close();
   }
}

3  JDBC API详解

3.1 DriverManager

DriverManager (驱动管理类)作用:
注册驱动
Class .forName ( "com.mysql.jdbc.Driver" );
获取数据库连接
参数说明:
url : 连接路径
语法: jdbc:mysql://ip 地址 ( 域名 ): 端口号 / 数据库名称 ?
数键值对 1& 参数键值对 2…
示例: jdbc:mysql://127.0.0.1:3306/db1
== 细节: ==
如果连接的是本机 mysql 服务器,并且 mysql 服务默
认端口是 3306 ,则 url 可以简写为: jdbc:mysql:///
据库名称 ? 参数键值对
配置 useSSL=false 参数,禁用安全连接方式,解决
警告提示
user :用户名
poassword :密码

3.2 Connection

Connection (数据库连接对象)作用:
获取执行 SQL 的对象
管理事务

3.2.1 获取执行对象

普通执行 SQL 对象
Statement createStatement()
入门案例中就是通过该方法获取的执行对象。
预编译 SQL 的执行 SQL 对象:防止 SQL 注入

PreparedStatement prepareStatement(sql)

通过这种方式获取的 PreparedStatement SQL 语句执行对象是
我们一会重点要进行讲解的,它可以防止 SQL 注入。
执行存储过程的对象
CallableStatement prepareCall(sql)
通过这种方式获取的 CallableStatement 执行对象是用来执行
存储过程的,而存储过程在 MySQL 中不常用,所以这个我们将
不进行讲解。

3.2.2 事务管理

先回顾一下 MySQL 事务管理的操作:
开启事务 : BEGIN; 或者 START TRANSACTION;
提交事务 : COMMIT;
回滚事务 : ROLLBACK;
MySQL 默认是自动提交事务
接下来学习 JDBC 事务管理的方法。
Connection 几口中定义了 3 个对应的方法:
开启事务

conn.setAutoCommit(false);  
参与 autoCommit 表示是否自动提交事务, true 表示自动提交事
务, false 表示手动提交事务。而开启事务需要将该参数设为为
false
提交事务

conn.commit();  
回滚事务
 conn.rollback();
package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCDemo3_Connection {

    public static void main(String[] args) throws Exception {
        //1. 注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义sql
        String sql1 = "update account set money = 3000 where id = 1";
        String sql2 = "update account set money = 3000 where id = 2";
        //4. 获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();


        try {
            // ============开启事务==========
            conn.setAutoCommit(false);
            //5. 执行sql
            int count1 = stmt.executeUpdate(sql1);//受影响的行数
            //6. 处理结果
            System.out.println(count1);
            //int i = 3/0;  //制造异常
            //5. 执行sql
            int count2 = stmt.executeUpdate(sql2);//受影响的行数
            //6. 处理结果
            System.out.println(count2);

            // ============提交事务==========
            //程序运行到此处,说明没有出现任何问题,则需求提交事务
            conn.commit();
        } catch (Exception e) {
            conn.rollback();
            e.printStackTrace();
        }


        //7. 释放资源
        stmt.close();
        conn.close();
    }
}

3.3 Statement

DDL与DML的区别

DML(Data Manipulation Language)数据操纵语言:

适用范围:对数据库中的数据进行一些简单操作,如insert,delete,update,select等.

DDL(Data Definition Language)数据定义语言:

适用范围:对数据库中的某些对象(例如,database,table)进行管理,如Create,Alter和Drop.

一、DDL(数据定义语言,Data Definition Language)
建库、建表、设置约束等:create\drop\alter
 

二、DML (数据操纵语言,Data Manipulation Language )
主要指数据的增删查改: Select\delete\update\insert\call

3.3.1 概述

Statement 对象的作用就是用来执行 SQL 语句。而针对不同类型的
SQL 语句使用的方法也不一样。
执行 DDL DML 语句

 

 执行DQL语句

该方法涉及到了 ResultSet 对象,而这个对象我们还没有学
习,重点讲解。

package com.itheima.jdbc;

import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * JDBC API 详解:Statement
 */
public class JDBCDemo4_Statement {

    /**
     * 执行DML语句
     * @throws Exception
     */
    @Test
    public void testDML() throws  Exception {
        //1. 注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义sql
        String sql = "update account set money = 3000 where id = 1";
        //4. 获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        //5. 执行sql
        int count = stmt.executeUpdate(sql);//执行完DML语句,受影响的行数
        //6. 处理结果
        //System.out.println(count);
        if(count > 0){
            System.out.println("修改成功~");
        }else{

            System.out.println("修改失败~");
        }
        //7. 释放资源
        stmt.close();
        conn.close();

    }



    /**
     * 执行DDL语句
     * @throws Exception
     */
    @Test
    public void testDDL() throws  Exception {
        //1. 注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义sql
        String sql = "create database db2";
//        String sql = "drop database db2";
        //4. 获取执行sql的对象 Statement
        Statement stmt = conn.createStatement();
        //5. 执行sql
        int count = stmt.executeUpdate(sql);//执行完DDL语句,可能是0
        //6. 处理结果
        //System.out.println(count);
       /* if(count > 0){
            System.out.println("修改成功~");
        }else{

            System.out.println("修改失败~");
        }*/
        System.out.println(count);

        //7. 释放资源
        stmt.close();
        conn.close();

    }

}
注意:
以后开发很少使用java代码操作DDL语句

3.4 ResultSet

3.4.1 概述

ResultSet(结果集对象)作用:

== 封装了 SQL 查询语句的结果。
而执行了 DQL 语句后就会返回该对象,对应执行 DQL 语句的方法如
下:
ResultSet executeQuery(sql) :执行 DQL 语句,返回
ResultSet 对象
那么我们就需要从 ResultSet 对象中获取我们想要的数据。
ResultSet 对象提供了操作查询结果数据的方法,如下

如下图为执行SQL语句后的结果

一开始光标指定于第一行前,如图所示红色箭头指向于表头行。当
我们调用了 next() 方法后,光标就下移到第一行数据,并且方法
返回 true ,此时就可以通过 getInt("id") 获取当前行 id 字段的
值,也可以通过 getString("name") 获取当前行 name 字段的
值。如果想获取下一行的数据,继续调用 next() 方法,以此类
推。

3.4.2 代码实现

package com.itheima.jdbc;

import org.junit.Test;

import java.sql.*;

/**
 * JDBC API 详解:Statement
 */
public class JDBCDemo5_ResultSet {

    /**
     * 执行DQL
     *
     * @throws Exception
     */
    @Test
    public void testResultSet() throws Exception {
        //1. 注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义sql
        String sql = "select * from account";
        //4. 获取statement对象
        Statement stmt = conn.createStatement();
        //5. 执行sql
        ResultSet rs = stmt.executeQuery(sql);
        //6. 处理结果, 遍历rs中的所有数据
    /* // 6.1 光标向下移动一行,并且判断当前行是否有数据
        while (rs.next()){
            //6.2 获取数据  getXxx()
            int id = rs.getInt(1);
            String name = rs.getString(2);
            double money = rs.getDouble(3);

            System.out.println(id);
            System.out.println(name);
            System.out.println(money);

            System.out.println("--------------");

        }*/
        // 6.1 光标向下移动一行,并且判断当前行是否有数据
        while (rs.next()) {
            //6.2 获取数据  getXxx()
            int id = rs.getInt("id");
            String name = rs.getString("name");
            double money = rs.getDouble("money");

            System.out.println(id);
            System.out.println(name);
            System.out.println(money);

            System.out.println("--------------");
        }

        //7. 释放资源
        rs.close();
        stmt.close();
        conn.close();
    }

}






3.5 案例

需求:查询 account 账户表数据,封装为 Account 对象中,并且
存储到 ArrayList 集合中
package com.itheima.jdbc;

import com.itheima.pojo.Account;
import org.junit.Test;

import javax.swing.*;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * JDBC API 详解:Statement
 */
public class JDBCDemo5_ResultSet {

//    /**
//     * 执行DQL
//     *
//     * @throws Exception
//     */
//    @Test
//    public void testResultSet() throws Exception {
//        //1. 注册驱动
//        //Class.forName("com.mysql.jdbc.Driver");
//        //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
//        String url = "jdbc:mysql:///db1?useSSL=false";
//        String username = "root";
//        String password = "1234";
//        Connection conn = DriverManager.getConnection(url, username, password);
//        //3. 定义sql
//        String sql = "select * from account";
//        //4. 获取statement对象
//        Statement stmt = conn.createStatement();
//        //5. 执行sql
//        ResultSet rs = stmt.executeQuery(sql);
//        //6. 处理结果, 遍历rs中的所有数据
//    /* // 6.1 光标向下移动一行,并且判断当前行是否有数据
//        while (rs.next()){
//            //6.2 获取数据  getXxx()
//            int id = rs.getInt(1);
//            String name = rs.getString(2);
//            double money = rs.getDouble(3);
//
//            System.out.println(id);
//            System.out.println(name);
//            System.out.println(money);
//
//            System.out.println("--------------");
//
//        }*/
//        // 6.1 光标向下移动一行,并且判断当前行是否有数据
//        while (rs.next()) {
//            //6.2 获取数据  getXxx()
//            int id = rs.getInt("id");
//            String name = rs.getString("name");
//            double money = rs.getDouble("money");
//
//            System.out.println(id);
//            System.out.println(name);
//            System.out.println(money);
//
//            System.out.println("--------------");
//        }
//
//        //7. 释放资源
//        rs.close();
//        stmt.close();
//        conn.close();
//    }

    /**
     * 需求:查询account账户表数据,封装为Account对象中,并且
     * 存储到ArrayList集合中
     * 1. 定义实体类Account
     * 2. 查询数据,封装到Account对象中
     * 3. 将Account对象存入ArrayList集合中
     *
     * @throws Exception
     */
    @Test
    public void testResultSet2() throws Exception {
        //1. 注册驱动
        //Class.forName("com.mysql.jdbc.Driver");
        //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);
        //3. 定义sql
        String sql = "select * from account";
        //4. 获取statement对象
        Statement stmt = conn.createStatement();
        //5. 执行sql
        ResultSet rs = stmt.executeQuery(sql);

        // 创建集合(写在里面每次循环都会重置,浪费内存)
        List<Account> list=new ArrayList<>();


        // 6.1 光标向下移动一行,并且判断当前行是否有数据
        while (rs.next()) {

            Account account = new Account();

            //6.2 获取数据  getXxx()
            int id = rs.getInt("id");
            String name = rs.getString("name");
            double money = rs.getDouble("money");

            //赋值
            account.setId(id);
            account.setName(name);
            account.setMoney(money);

            //存入方法
            list.add(account);
        }

        System.out.println(list);
        //7. 释放资源
        rs.close();
        stmt.close();
        conn.close();
    }

}






3.6 PreparedStatement

PreparedStatement 作用:
预编译 SQL 语句并执行:预防 SQL 注入问题

对上面的作用中 SQL 注入问题大家肯定不理解。那我们先对 SQL
入进行说明 .

3.6.1 SQL注入

SQL 注入是通过操作输入来修改事先定义好的 SQL 语句,用以达
到执行代码对服务器进行攻击的方法。
package com.itheima.jdbc;

import com.itheima.pojo.Account;
import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * 用户登录
 */
public class JDBCDemo6_UserLogin {




    @Test
    public void testLogin() throws  Exception {
        //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);

        // 接收用户输入 用户名和密码
        String name = "zhangsan";
        String pwd = "123";

        String sql = "select * from tb_user where username = '"+name+"' and password = '"+pwd+"'";

        // 获取stmt对象
        Statement stmt = conn.createStatement();

        // 执行sql
        ResultSet rs = stmt.executeQuery(sql);

        // 判断登录是否成功
        if(rs.next()){
            System.out.println("登录成功~");
        }else{
            System.out.println("登录失败~");
        }

        //7. 释放资源
        rs.close();
        stmt.close();
        conn.close();
    }


    /**
     * 演示SQL注入
     * @throws Exception
     */
    @Test
    public void testLogin_Inject() throws  Exception {
        //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);

        // 接收用户输入 用户名和密码
        String name = "hfkjsfhskj";
        String pwd = "' or '1' = '1";

        String sql = "select * from tb_user where username = '"+name+"' and password = '"+pwd+"'";
        System.out.println(sql);
        // 获取stmt对象
        Statement stmt = conn.createStatement();
        // 执行sql
        ResultSet rs = stmt.executeQuery(sql);

        // 判断登录是否成功
        if(rs.next()){
            System.out.println("登录成功~");
        }else{
            System.out.println("登录失败~");
        }

        //7. 释放资源
        rs.close();
        stmt.close();
        conn.close();
    }




}
上面代码是将用户名和密码拼接到 sql 语句中,拼接后的 sql 语句如
select * from tb_user where username = 'sjdljfld'
and password = '' or '1' = '1'
从上面语句可以看出条件 username = 'sjdljfld' and
password = '' 不管是否满足,而 or 后面的 '1' = '1' 是始终
满足的,最终条件是成立的,就可以正常的进行登陆了。
接下来我们来学习 PreparedStatement 对象

3.6.3 PreparedStatement概述

package com.itheima.jdbc;

import org.junit.Test;

import java.sql.*;
import java.util.Date;

/**
 * API详解:PreparedStatement
 */
public class JDBCDemo7_PreparedStatement {

    @Test
    public void testPreparedStatement() throws Exception {
        //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
        String url = "jdbc:mysql:///db1?useSSL=false";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);

        // 接收用户输入 用户名和密码
        String name = "zhangsan";
        String pwd = "123";

        // 定义sql
        String sql = "select * from tb_user where username = ? and password = ?";

        // 获取pstmt对象
        PreparedStatement pstmt = conn.prepareStatement(sql);

        // 设置?的值
        pstmt.setString(1, name);
        pstmt.setString(2, pwd);

        // 执行sql
        ResultSet rs = pstmt.executeQuery();

        // 判断登录是否成功
        if (rs.next()) {
            System.out.println("登录成功~");
        } else {
            System.out.println("登录失败~");
        }

        //7. 释放资源
        rs.close();
        pstmt.close();
        conn.close();
    }


    /**
     * PreparedStatement原理
     *
     * @throws Exception
     */
    @Test
    public void testPreparedStatement2() throws Exception {


        //2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写
        // useServerPrepStmts=true 参数开启预编译功能
        String url = "jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true";
        String username = "root";
        String password = "1234";
        Connection conn = DriverManager.getConnection(url, username, password);

        // 接收用户输入 用户名和密码
        String name = "zhangsan";
        String pwd = "' or '1' = '1";

        // 定义sql
        String sql = "select * from tb_user where username = ? and password = ?";

        // 获取pstmt对象
        PreparedStatement pstmt = conn.prepareStatement(sql);


        Thread.sleep(10000);
        // 设置?的值
        pstmt.setString(1, name);
        pstmt.setString(2, pwd);
        ResultSet rs = null;
        // 执行sql
        rs = pstmt.executeQuery();


        // 设置?的值
        pstmt.setString(1, "aaa");
        pstmt.setString(2, "bbb");

        // 执行sql
        rs = pstmt.executeQuery();


        // 判断登录是否成功
        if (rs.next()) {
            System.out.println("登录成功~");
        } else {
            System.out.println("登录失败~");
        }

        //7. 释放资源
        rs.close();
        pstmt.close();
        conn.close();
    }


}

3.6.4 使用PreparedStatement改进(跳过)

4.2 数据库连接池实现

4.3 Driud使用  

* Druid数据库连接池演示
*/
public class DruidDemo {
    public static void main(String[] args) throws
Exception {
        //1.导入jar包
        //2.定义配置文件
        //3. 加载配置文件
        Properties prop = new Properties();
        prop.load(new FileInputStream("jdbcdemo/src/druid.properties"));
        //4. 获取连接池对象
        DataSource dataSource =
DruidDataSourceFactory.createDataSource(prop);
        //5. 获取数据库连接 Connection
        Connection connection =
dataSource.getConnection();
        System.out.println(connection); //获取到了连接
后就可以继续做其他操作了
      
//System.out.println(System.getProperty("user.dir")
);
   }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDBC入门笔记 的相关文章

  • 8266+DS3231时钟之开发个时钟遇到的N个坑【一】

    这个时钟系列目前五篇分别是 xff1a 8266 43 DS3231时钟之开发个时钟遇到的N个坑 一 8266 43 ds3231时钟之arduino官网发布的DS3231库的分析 二 8266 43 DS3231时钟之DS3231具体实现
  • ILI9341的使用之【一】TFT-LCD原理(转载)

    近期开始研究手上的LCD屏的使用 该LCD屏使用了ILI9341的IC做为驱动 因此边研究边留下记录 与上一个时钟系列类似 xff0c 想必这又是一个大工程 xff0c 因为ILI9341的数据手册就有200多页 xff0c 从硬件原理 x
  • ILI9341的使用之【二】ILI9341介绍

    ILI9341的使用之 一 TFT LCD原理 xff08 转载 xff09 ILI9341的使用之 二 ILI9341介绍 ILI9341的使用之 三 ILI9341系统通信接口模式操作详解 ILI9341的使用之 四 RGB接口操作详解
  • ILI9341的使用之【三】ILI9341系统通信接口模式操作详解

    ILI9341的使用之 一 TFT LCD原理 xff08 转载 xff09 ILI9341的使用之 二 ILI9341介绍 ILI9341的使用之 三 ILI9341系统通信接口模式操作详解 ILI9341的使用之 四 RGB接口操作详解
  • 图说蚁群算法(ACO)附源码

    PS xff1a 再过几天就可以返校收拾东西了 xff0c 想想还有点小激动呐hhh 回想疫情宅家的这半年 xff0c 真是一段充满了焦虑 惊喜 忙碌 充实又时而无聊的时光 返校只能待三天又让人有点小遗憾呐 就想着趁还在家这几天 xff0c
  • ILI9341的使用之【四】RGB接口操作详解

    ILI9341的使用之 一 TFT LCD原理 xff08 转载 xff09 ILI9341的使用之 二 ILI9341介绍 ILI9341的使用之 三 ILI9341系统通信接口模式操作详解 ILI9341的使用之 四 RGB接口操作详解
  • 基于ESP32的开发板的选型介绍

    由于最近重新选择单片机的开发平台 之前用过ESP8266模组和基于8266的NodeMCU开发板 xff0c 而且使用的经历还是很愉快的 因此这次很自然的想到了去找看看是否有基于ESP32的NodeMCU开发板 xff0c 结果没让人失望
  • ESP-IDF的vscode环境编译时出现“fatal error: nvs.h: No such file or directory”的解决方法

    目录 前言ESP IDF编程指南原文解读关于ESP IDF的组件管理模式示例项目的结构层次顶层项目CMakeLists txt文件的解释必要部分可选的项目变量 组件 CMakeLists 文件的解读最小组件 CMakeLists 文件 组件
  • 【ESP32+freeRTOS学习笔记-开篇前言】

    目录 前言的前言RTOS的选择开发与实践环境参考资料笔记的形式专题文章的链接 持续更新中 前言的前言 单片机的开发 xff0c 也有两年多了 xff0c 之前一直是做一些简单应用 xff0c 因此以裸机开发的方式为主 虽然裸机开发简单 xf
  • 【ESP32+freeRTOS学习笔记-(一)freeRTOS介绍】

    目录 FreeRTOS基本情况FreeRTOS的特色发行版的目录结构与文件说明原生程序的下载与目录结构FreeRTOS的主要文件说明头文件说明关于FreeRTOSConfig h的说明 主要的数据类型说明重要数据类型 TickType t重
  • 【ESP32+freeRTOS学习笔记-(二)FreeRTOS运行机制】

    目录 实时操作系统RTOS主要功能RTOS工作概况基本概念 FreeRTOS 心跳 任务优先级调度算法其它资源与概念 FreeRTOS运行机制描述总结 实时操作系统 实时操作系统RTOS是保证在一定时间限制内完成特定功能的操作系统 实时操作
  • 【ESP32+freeRTOS学习笔记-(三)任务】

    目录 1 任务相关基本概念1 1 任务函数原型1 2 任务句柄TaskHandle t 及任务控制块TCB t1 3 任务状态1 4 优先级 Task Priorities 2 创建任务2 1 xTaskCreate2 2 xTaskCre
  • 【ESP32+freeRTOS学习笔记-(四)任务调度机制】

    目录 1 什么是任务的调度机制1 1 概念1 2 三种算法1 3 决定算法的宏 2 基本词条解释3 调度算法解释3 1 具有时间片的优先级抢先调度 Prioritized Pre emptive Scheduling with Time S
  • 【ESP32+freeRTOS学习笔记-(五)队列Queue】

    目录 1 什么是队列Queue2 队列的多任务特性2 1 多任务的访问 xff1a 2 2 队列读取阻塞 xff1a 2 3 写队列阻塞 xff1a 2 4 阻塞于多个队列 xff1a 3 队列的使用3 1 创建队列 The xQueueC
  • 【ESP32+freeRTOS学习笔记-(六)软件定时器】

    目录 1 软件定时器概念2 软件定时器的运行机制2 1 组成2 2 创建2 3 运行 3 软件定时器的属性和状态3 1 定时器的周期3 2 定时器的类型3 3 定时器的状态 4 软件定时器的回调函数原型5 定时器的使用5 1 创建定时器xT
  • 图说粒子群优化算法(PSO)附源码

    前面说了ACO xff0c 这次就来说下PSO吧 目录 一 初识PSO xff1a 这是个啥玩意 xff1f 二 PSO的数学原理 三 MATLAB代码 一 初识PSO xff1a 这是个啥玩意 xff1f 粒子群优化算法是模拟鸟群觅食行为
  • 【ESP32+freeRTOS学习笔记-(七)中断管理】

    目录 1 概述2 在ISR中使用FreeRTOS中专用的API2 1 独立的用于ISR中的API2 2 关于xHigherPriorityTaskWoken 参数的初步理解 3 延迟中断处理的方法 将中断中的处理推迟到任务中去4 方法一 x
  • 【ESP32+freeRTOS学习笔记-(八)资源管理】

    目录 1 资源使用概况2 互斥方法之一 xff1a 基本临界区2 1 taskENTER CRITICAL FROM ISR 和taskEXIT CRITICAL FROM ISR 3 互斥方法之二 xff1a 挂起或锁定调度程序3 1 v
  • 【ESP32+freeRTOS学习笔记-(九)事件组】

    目录 1 概述2 事件组的特性2 1 事件组 事件标志和事件位2 2 事件组位长的设置2 3 多任务访问 3 使用事件组管理事件3 1 xEventGroupCreate 3 2 xEventGroupSetBits 3 3 xEventG
  • 【ESP32+freeRTOS学习笔记-(十)任务通知机制】

    目录 1 任务通知 xff08 Task Notifications xff09 概念1 1 概念1 2 使用任务通知的优势1 3 无法使用任务通知的场景 2 使用任务通知2 1 xTaskNotifyGive 2 2 ulTaskNoti

随机推荐