Java零基础教学文档第三篇:JDBC

news2025/1/11 14:03:03

今日新篇章
【JDBC】
【主要内容】

  1. JDBC概述

  2. 使用JDBC完成添加操作

  3. 使用JDBC完成更新和删除

  4. DBUtils的简单封装

  5. 使用JDBC完成查询

  6. 使用JDBC完成分页查询

  7. 常用接口详解

  8. JDBC批处理

  9. SQL注入问题

  10. 事务处理解决转账问题

  11. 连接池

  12. 使用反射对DBUtils再次的封装

  13. BaseDAO的封装

【学习目标】
在这里插入图片描述

1. JDBC概述

1.1 什么是JDBC
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
在这里插入图片描述

1.2 JDBC的原理
早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了。后来SUN开始与数据库厂商们讨论,最终得出的结论是,由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API出现。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动!
在这里插入图片描述

JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。

当然还有第三方公司专门为某一数据库提供驱动,这样的驱动往往不是开源免费的!

1.3 程序员,JDBC,JDBC驱动的关系及说明
1.3.1 JDBC API
提供者:Sun公司

内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中,如

DriverManager类 作用:管理各种不同的JDBC驱动

Connection接口

Statement接口

ResultSet接口

1.3.2 JDBC 驱动
提供者:数据库厂商

作用:负责连接各种不同的数据库

1.3.3 Java程序员
JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。

1.3.4 三方关系
SUN公司是规范制定者,制定了规范JDBC(连接数据库规范)

数据库厂商微软、甲骨文等分别提供实现JDBC接口的驱动jar包

程序员学习JDBC规范来应用这些jar包里的类。
在这里插入图片描述

1.4 总结
简单地说,JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果。
在这里插入图片描述

DriverManager :依据数据库的不同,管理JDBC驱动

Connection :负责连接数据库并担任传送数据的任务

Statement :由 Connection 产生、负责发送执行SQL语句

ResultSet:负责保存Statement执行后所产生的查询结果

2. JDBC操作数据库的步骤

2.1 总体步骤

  1. 加载一个Driver驱动

  2. 创建数据库连接(Connection)

  3. 创建SQL命令发送器Statement

  4. 创建SQL

  5. 通过Statement发送SQL命令并得到结果

  6. 处理SQL结果(select语句)

  7. 关闭数据库资源

ResultSet

Statement

Connection

2.2 详细步骤
2.2.1 加载驱动
加载JDBC驱动是通过调用方法java.lang.Class.forName(),下面列出常用的几种数据库驱动程序加载语句的形式 :

Class.forName(“oracle.JDBC.driver.OracleDriver”);//使用Oracle的JDBC驱动程序

Class.forName(“com.microsoft.JDBC.sqlserver.SQLServerDriver”);//使用SQL Server的JDBC驱动程序

Class.forName(“com.ibm.db2.JDBC.app.DB2Driver”);//使用DB2的JDBC驱动程序

Class.forName(“com.mysql.jdbc.Driver”);//使用MySql的JDBC驱动程序

2.2.2 创建数据库连接
与数据库建立连接的方法是调用DriverManager.getConnection(String url, String user, String password )方法

Connection conn=null;

String url=“jdbc:mysql://localhost:3306/whpowernode?useUnicode=true&useSSL=false&charsetUnicode=UTF8”;

String user=“root";

String password=“123456";

conn = DriverManager.getConnection(url, user, password);

2.2.3 创建Statement并发送命令
Statement对象用于将 SQL 语句发送到数据库中,或者理解为执行sql语句

有三种 Statement对象:

Statement:用于执行不带参数的简单SQL语句;

PreparedStatement(从 Statement 继承):用于执行带或不带参数的预编译SQL语句;

CallableStatement(从PreparedStatement 继承):用于执行数据库存储过程的调用。
在这里插入图片描述

2.2.4 处理ResultSet结果
ResultSet对象是executeQuery()方法的返回值,它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。

ResultSet里的数据一行一行排列,每行有多个字段,且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。

ResultSet对象自动维护指向当前数据行的游标。每调用一次next()方法,游标向下移动一行。

初始状态下记录指针指向第一条记录的前面,通过next()方法指向第一条记录。循环完毕后指向最后一条记录的后面。
在这里插入图片描述

2.2.5 关闭数据库资源
作为一种好的编程风格,应在不需要Statement对象和Connection对象时显式地关闭它们。关闭Statement对象和Connection对象的语法形式为:

public void close() throws SQLException

用户不必关闭ResultSet。当它的 Statement 关闭、重新执行或用于从多结果序列中获取下一个结果时,该ResultSet将被自动关闭。

注意:要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为Statement和ResultSet是需要连接是才可以使用的,所以在使用结束之后有可能其他的Statement还需要连接,所以不能先关闭Connection。

3. 准备工作

3.1 创建数据并创建student表
在这里插入图片描述

3.2 创建项目
在这里插入图片描述
在这里插入图片描述

3.3 创建lib目录并引入MYSQL驱动包
在这里插入图片描述

3.4 把lib包引入项目环境
在这里插入图片描述
在这里插入图片描述

4. 使用JDBC完成添加操作

4.1 步骤
Ø 加载MySQL的JDBC驱动

Ø 建立数据的连接

Ø 创建SQL命令的发送器

Ø 编写SQL

Ø 使用SQL命令发送器发送SQL命令并得到结果

Ø 处理结果

Ø 关闭数据库资源

4.2 代码
package com.bjpowernode.jdbc;

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

public class Test01Add {
// 驱动器路径
private static final String DRIVER = “com.mysql.jdbc.Driver”;
//连接数据库地址
private static final String URL = “jdbc:mysql://localhost:3306/whpowernode?useUnicode=true&useSSL=false&characterEncoding=UTF8”;
//数据库用户名
private static final String USER_NAME = “root”;
//数据库密码
private static final String USER_PASSWORD = “123456”;
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载JDBC访问Oracle的驱动
Class.forName(DRIVER);
// 建立和数据库的连接
Connection conn = DriverManager.getConnection(URL, USER_NAME, USER_PASSWORD);
// 创建SQL命令发送器
Statement stmt = conn.createStatement();
// 使用SQL命令发送器发送SQL命令并得到结果
String sql = “insert into student values(1,‘小刚’,32,‘男’,‘湖北省武汉市’)”;
int n = stmt.executeUpdate(sql);
// 处理结果
if (n > 0) {
System.out.println(“添加成功”);
} else {
System.out.println(“添加失败”);
}
// 关闭数据库资源
stmt.close();
conn.close();
}
}

4.3 URL详解
4.3.1 为什么要定义URL
Java和MySQL是厂商的,Java程序和MySQL数据库此时不在同一个进程下,此时Java程序需要向MySQL发送请求。

4.3.2 如何发送请求呢?
jdbc:mysql://localhost:3306/whpowernode?useUnicode=true&useSSL=false&characterEncoding=UTF-8

使用URL的方式发送

jdbc 主协议

mysql 子协议

localhost MySQL服务器的地址,如果服务器就是我自己的主机,那么定义localhost就可以了

3306 MySQL服务器的端口号

whpowernode MySQL数据库服务器的数据库名称

useUnicode=true Java和MySQL交互使用Unicode编码

useSSL=false Java和MySQL交互不使用安全层协议

characterEncoding=UTF-8 Java和MySQL交互的编码方式为UTF-8 【如果不设置会有乱码的】

4.4 查看数据库
在这里插入图片描述

4.4.1 一个URL由哪些部分组成
Ø 协议://服务器主机:端口/服务器路径?查询参数

Ø 协议 jdbc:mysql:

Ø 服务器主机 localhost

Ø 端口 3306

Ø 服务器路径 whpowernode

Ø 参数useUnicode=true&useSSL=false&characterEncoding=UTF8

5. 使用JDBC完成更新和删除

5.1 步骤
Ø 加载MySQL的JDBC驱动

Ø 建立数据的连接

Ø 创建SQL命令的发送器

Ø 编写SQL

Ø 使用SQL命令发送器发送SQL命令并得到结果

Ø 处理结果

Ø 关闭数据库资源

5.2 修改代码
package com.bjpowernode.jdbc;

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

public class Test02Update {
// 驱动器路径
private static final String DRIVER = “com.mysql.jdbc.Driver”;
//连接数据库地址
private static final String URL = “jdbc:mysql://localhost:3306/whpowernode?useUnicode=true&useSSL=false&characterEncoding=UTF8”;
//数据库用户名
private static final String USER_NAME = “root”;
//数据库密码
private static final String USER_PASSWORD = “123456”;
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载Oracle的JDBC驱动
Class.forName(DRIVER);
// 建立数据的连接
Connection conn=DriverManager.getConnection(URL, USER_NAME, USER_PASSWORD);
// 创建SQL命令的发送器
Statement stat=conn.createStatement();
// 编写SQL
String sql=“update student set name=‘小明’,age=23,sex=‘女’,address=‘武汉’ where id=1”;
// 使用SQL命令发送器发送SQL命令并得到结果
int res=stat.executeUpdate(sql);
// 处理结果
if(res>0){
System.out.println(“修改成功”);
}
else{
System.out.println(“处理失败”);
}
// 关闭数据库资源
stat.close();
conn.close();
}
}

5.3 删除代码
package com.bjpowernode.jdbc;

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

public class Test03Delete {
// 驱动器路径
private static final String DRIVER = “com.mysql.jdbc.Driver”;
//连接数据库地址
private static final String URL = “jdbc:mysql://localhost:3306/whpowernode?useUnicode=true&useSSL=false&characterEncoding=UTF8”;
//数据库用户名
private static final String USER_NAME = “root”;
//数据库密码
private static final String USER_PASSWORD = “123456”;
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 加载Oracle的JDBC驱动
Class.forName(DRIVER);
// 建立数据的连接
Connection conn=DriverManager.getConnection(URL, USER_NAME, USER_PASSWORD);
// 创建SQL命令的发送器
Statement stat=conn.createStatement();
// 编写SQL
String sql=“delete from student where id=1”;
// 使用SQL命令发送器发送SQL命令并得到结果
int res=stat.executeUpdate(sql);
// 处理结果
if(res>0){
System.out.println(“删除成功”);
}
else{
System.out.println(“删除失败”);
}
// 关闭数据库资源
stat.close();
conn.close();
}
}

6. DBUtils的简单封装

6.1 为什么要封装
从我们上面的代码大家可以看到,每一次写我们创建一个连接,创建一个发送SQL的对象,最后还要关闭,那么我们可以考虑把这重复的代码提取出来!

6.2 创建DBUtils封装代码
package com.bjpowernode.utils;

import java.io.Closeable;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBUtils {
// 驱动器路径
private static final String DRIVER = “com.mysql.jdbc.Driver”;
// 连接数据库地址
private static final String URL = “jdbc:mysql://localhost:3306/whpowernode?useUnicode=true&useSSL=false&characterEncoding=UTF8”;
// 数据库用户名
private static final String USER_NAME = “root”;
// 数据库密码
private static final String USER_PASSWORD = “123456”;

/**
 * 静态加载驱动程序
 */
static {
    try {
        Class.forName(DRIVER);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}
/**
 * @return 连接对象
 */
public static Connection getConn() {
    try {
        return  DriverManager.getConnection(URL, USER_NAME, USER_PASSWORD);
    } catch (SQLException e) {
        e.printStackTrace();
        System.out.println("创建连接对象异常");
    }
    return null;
}

/**
 * 关闭资源
 */
public static void close(AutoCloseable closeable) {
    try {
        if (closeable != null) {
            closeable.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

6.3 创建上面的工具类对象前面的代码进行改造
package com.bjpowernode.jdbc;

import com.bjpowernode.utils.DBUtils;

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

public class Test01Add {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = DBUtils.getConn();
// 创建SQL命令发送器
Statement stmt = conn.createStatement();
// 使用SQL命令发送器发送SQL命令并得到结果
String sql = “insert into student values(1,‘小刚’,32,‘男’,‘湖北省武汉市’)”;
int n = stmt.executeUpdate(sql);
// 处理结果
if (n > 0) {
System.out.println(“添加成功”);
} else {
System.out.println(“添加失败”);
}
// 关闭数据库资源
DBUtils.close(stmt);
DBUtils.close(conn);
}
}

7. 使用JDBC完成查询

7.1 循环向student表里面插入20条数
package com.bjpowernode.jdbc;

import com.bjpowernode.utils.DBUtils;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;

public class Test01Add20 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = DBUtils.getConn();
// 创建SQL命令发送器
Statement stmt = conn.createStatement();
// 使用SQL命令发送器发送SQL命令并得到结果
Random random=new Random();
for (int i = 1; i <=20 ; i++) {
Integer id=i;
String name=“小明”+i;
int age=random.nextInt(100);
String sex=random.nextBoolean()?“男”:“女”;
String address=“武汉”+i;

        String sql = "insert into student values("+i+",'"+name+"',"+age+",'"+sex+"','"+address+"')";
        int n = stmt.executeUpdate(sql);
        // 处理结果
        if (n > 0) {
            System.out.println("添加成功");
        } else {
            System.out.println("添加失败");
        }
    }
    // 关闭数据库资源
    DBUtils.close(stmt);
    DBUtils.close(conn);
}

}

7.2 查询
package com.bjpowernode.jdbc;

import com.bjpowernode.utils.DBUtils;

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

public class Test04Query {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = DBUtils.getConn();
// 创建SQL命令发送器
Statement stmt = conn.createStatement();
// 编写SQL
String sql=“select * from student”;
// 使用SQL命令发送器发送SQL命令并得到结果
ResultSet rs=stmt.executeQuery(sql);
// 处理结果
while(rs.next()){
int id=rs.getInt(1);
String name=rs.getString(2);
int age=rs.getInt(3);
String sex=rs.getString(4);
String address=rs.getString(5);
System.out.println(id+" “+name+” “+age+” “+sex+” "+address);
}
// 关闭数据库资源
DBUtils.close(rs);
DBUtils.close(stmt);
DBUtils.close(conn);
}
}

8. 使用JDBC完成分页查询

package com.bjpowernode.jdbc;

import com.bjpowernode.utils.DBUtils;

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

public class Test05QueryForPage {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn = DBUtils.getConn();
// 创建SQL命令发送器
Statement stmt = conn.createStatement();
int pageNum=2; //页码
int pageSize=5;//每页显示的条数
// 编写SQL
String sql=“select * from student limit “+(pageNum-1)*pageSize+”,”+pageSize;
// 使用SQL命令发送器发送SQL命令并得到结果
ResultSet rs=stmt.executeQuery(sql);
// 处理结果
while(rs.next()){
int id=rs.getInt(1);
String name=rs.getString(2);
int age=rs.getInt(3);
String sex=rs.getString(4);
String address=rs.getString(5);
System.out.println(id+" “+name+” “+age+” “+sex+” "+address);
}
// 关闭数据库资源
DBUtils.close(rs);
DBUtils.close(stmt);
DBUtils.close(conn);
}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何查看Ubuntu内存的使用情况

在Linux系统中&#xff0c;了解内存使用情况对于系统管理和性能优化非常重要。以下是一些常用的命令&#xff0c;以及它们的详细使用说明&#xff1a; 1. free 命令 用途: free 命令用于显示系统中空闲和已用的物理内存及交换内存。示例: 输入命令: free -m输出解释: 这将以M…

alertmanager高可用集群的部署方案

目录 alertmanager集群模式如何形成&#xff1f; 先看看prometheus这边怎么配 非容器部署 基于容器部署 alertmanager集群模式如何形成&#xff1f; 官方的&#xff1a;Alertmanager | Prometheus GitHub - prometheus/alertmanager: Prometheus Alertmanager 基本上就是…

C++面试宝典第18题:旋转数组

题目 给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。要求如下: (1)尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 (2)使用时间复杂度为O(n)和空间复杂度为O(1)的原地算法解决这个问题。 示例 1: 输入: [1, 2, 3, 4, 5, 6, 7] 和 k…

Vue中的class和style绑定

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介动态绑定class对象语法数组语法 动态绑定style对象语法多重值 ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&#xff01;创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习…

免费远程控制软件推荐2024最新

远程控制软件在我们的生活和工作中越来越常见&#xff0c;今天给大家分享一个免费的远程控制软件&#xff0c;教你如何使用手机远程控制电脑。 首先&#xff0c;您需要在电脑上安装KKView远程控制软件&#xff0c;该软件提供手机端和桌面端。安装完成后&#xff0c;您将获得一个…

win7添加access的odbc数据源

从控制面板打开odbc数据源&#xff1b;如果像下面没有access的驱动程序&#xff0c; 根据资料&#xff0c;打开C盘-Windows-SysWow64-odbcad32.exe&#xff0c;看一下就有了&#xff1b; 然后添加用户DSN&#xff0c;选中access的驱动程序&#xff0c; 自己输入一个数据源名&am…

Hive基础知识(七):Hive 数据类型全解

1. 基本数据类型 对于 Hive 的 String 类型相当于数据库的 varchar 类型&#xff0c;该类型是一个可变的字符串&#xff0c;不过它不能声明其中最多能存储多少个字符&#xff0c;理论上它可以存储2GB 的字符数。 2. 集合数据类型 Hive 有三种复杂数据类型 ARRAY、MAP 和 STRUCT…

docker 部署项目的操作文档,安装nginx

目录 1 部署环境检查2 相关知识点2.1 docker默认镜像存放地址2.2 docker 的镜像都是tar 包&#xff1f;2.3 Docker-compose 是直接使用镜像创建容器&#xff1f;2.4 Docker Compose down 就是将容器删除&#xff1f;2.5 删除&#xff0c;会删除挂载嘛2.6 DockerFile 和 docker …

远程求职:有什么不同吗?

外面的世界很大&#xff0c;你渴望探索它&#xff0c;但面对现实吧&#xff0c;你必须吃饭。远程工作可能就是答案。下面的博客详细介绍了您需要了解的有关找到工作的细节&#xff0c;同时也可以让您在需要时收拾行李继续前进。 申请任何工作&#xff0c;无论是远程工作还是办…

服务容错-熔断策略之断路器hystrix-go

文章目录 概要一、服务熔断二、断路器模式三、hystrix-go3.1、使用3.2、源码 四、参考 概要 微服务先行者Martin Fowler与James Lewis在文章microservices中指出了微服务的九大特征&#xff0c;其中一个便是容错性设计(Design for failure)。正如文章中提到的&#xff0c;微服…

宋仕强论道之华强北精神和文化(二十一)

华强北的精神会内化再提炼和升华成为华强北文化&#xff0c;在外部会流传下去和传播开来。在事实上的行动层面&#xff0c;就是华强北人的思维方式和行为习惯&#xff0c;即见到机会就奋不顾身敢闯敢赌&#xff0c;在看似没有机会的时候拼出机会&#xff0c;和经济学家哈耶克企…

【OSG案例详细分析与讲解】之四:【3D动画场景】

文章目录 一、【3D动画场景】前言 二、【3D动画场景】实现效果 三、【3D动画场景】创建动画路径 1、实现目的 2、创建动画路径步骤 3、核心代码 4、知识要点 5、AnimationPath详讲 四、【3D动画场景】创建基础模型 1、实现目的 2、创建基础模型步骤 3、核心代码 4、知识要点 5、…

openssl3.2 - 官方dmeo学习 - server-arg.c

文章目录 openssl3.2 - 官方dmeo学习 - server-arg.c概述笔记备注END openssl3.2 - 官方dmeo学习 - server-arg.c 概述 TLS服务器, 等客户端来连接; 如果客户端断开了, 通过释放bio来释放客户端socket, 然后继续通过bio读来aceept. 笔记 对于开源工程, 不可能有作者那么熟悉…

uniapp 字母索引列表插件(组件版) Ba-SortList

简介&#xff08;下载地址&#xff09; Ba-SortList 是一款字母索引列表组件版插件&#xff0c;可自定义样式&#xff0c;支持首字母字母检索、首字检索、搜索等等&#xff1b;支持点击事件。 支持首字母字母检索支持首字检索支持搜索支持点击事件支持长按事件支持在uniapp界…

VMware vSphere运维管理手册

适用版本:VMware vSphere 7.0 VMware vSphere 是 VMware 的虚拟化平台,可将数据中心转换为包括 CPU、存储和网络资源的聚合计算基础架构。vSphere 将这些基础架构作为一个统一的运行环境进行管理,并为您提供工具来管理加入该环境的数据中心。 ![[Pasted image 20231212132…

数据库原理与应用期末复习试卷1

数据库原理与应用期末复习试卷1 一.单项选择题 数据库系统是采用了数据库技术的计算机系统&#xff0c;由系统数据库&#xff0c;数据库管理系统&#xff0c;应用系统和&#xff08;C&#xff09;组成。 ​ A.系统分析员 B.程序员 C.数据库管理员 D.操作员 数据库系统的体系…

YOLOv5改进 | 检测头篇 | DynamicHead支持检测和分割(不同于网上版本,全网首发)

一、本文介绍 本文给大家带来的改进机制是DynamicHead(Dyhead),这个检测头由微软提出的一种名为“动态头”的新型检测头,用于统一尺度感知、空间感知和任务感知。网络上关于该检测头我查了一些有一些魔改的版本,但是我觉得其已经改变了该检测头的本质,因为往往一些细节上才…

解决STM32F7系列芯片TIM无法触发ADC采样的问题

我在测试STM32F746 ADC DMA TIM 做AD采样时候发现 使用cubeMX 库生成的代码无法进入DMA中断&#xff0c;发现官方勘误手册有做解释&#xff0c;需要打开DAC时钟。如下 如上图&#xff0c;在ADC初始化代码中加入 __HAL_RCC_DAC_CLK_ENABLE();

统一密钥管理在信息安全领域有什么作用

统一密钥管理在信息安全领域中至关重要。它可以确保密钥的安全性、保密性和可用性&#xff0c;同时降低开发、维护和管理的成本。 对于没有KMS(密钥管理服务)管理系统的公司&#xff0c;密钥的本地化管理可能导致密钥分散在代码、配置文件中&#xff0c;缺乏统一管理&#xff0…

999合1超级简易文字菜单组件

引言 超级简易文字菜单组件 大家好&#xff0c;相信大家都玩过那个999合1的游戏&#xff0c;特别是那个菜单。 在游戏开发中&#xff0c;往往会有形式各异的游戏菜单&#xff0c;游戏菜单和菜单一样主要是给玩家选择开始游戏、设置、排行榜等功能的。 本文将分享一下笔者在…