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

8-JDBC 编程

目录

1.数据库编程的必备条件

PS:程序是怎么操作数据库的?

2.什么是JDBC?

2.1.JDBC定义

2.2.JDBC工作原理

3.JDBC使用

3.1.创建项目并添加MySQL驱动包

3.2.使用代码操作数据库

3.2.1.获得数据源

3.2.2.获得连接

3.2.3.获得执行器

3.2.4.查询或操作数据库

3.2.5.关闭数据库连接

执行代码——插入

执行代码——修改、删除

执行代码——查询

PS:使用DriverManager实现查询


1.数据库编程的必备条件

  • 编程语言,如Java,C、C++、Python等。
  • 数据库,如Oracle,MySQL,SQL Server等。
  • 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的, 要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。

PS:程序是怎么操作数据库的?

实际开发中,SQL很少是手动输入的,绝大多数的SQL都是通过代码,自动执行的。重复执行同一条SQL,且不确定执行多少次?就需要让其他编程语言程序来操作数据库服务器。

  • 自己实现数据库客户端很容易,因为各种数据库本身提供了一系列操作的API。官方维护——Oracle。
  • 自己实现数据库服务器就很难了,因为包含存储引擎、使用啥样的数据结构来组织数据,存储数据、SQL执行引擎、基于编译原理能对SQL进行解析和优化。

API:Application Program Interface,好比拿到个啥东西,这个东西能提供哪些功能/服务。

  • Java标准库就提供一些API:这个API里有一些随机数、scanner、集合类等(一组类/方法);
  • C标准库的API:#include<stdio.h>、scanf、printf、fopen、fclose。
  • 操作系统也提供一些API:操作硬盘的文件、访问一下内存的内容、重置一下网卡的状态......包括模拟鼠标事件、模拟硬盘事件(以类/方法提供的);
  • MySQL也会提供一些API(最初是C语言,为了使用广泛,提供了多个其他语言版本的API,其他语言版本的API本质还是调用C的API,跨语言调用)用来操作数据库,完成各种增删改查操作了。

使⽤程序之所以能操作数据库,主要是因为数据库⼚商提供了操作的 API,也就是数据库驱动,驱使数据库⾏动起来。不光是程序,像我们之所以能通过命令⾏操作 MySQL,也是因为 MySQL 的数据库驱动,对于操作界⾯来说,数据库驱动就是:

输⼊的命令就是 MySQL 数据驱动的⼀部分。

数据库驱动包含了数据库操作 API,它们的关系如下:

2.什么是JDBC?

在了解 JDBC 概念之前,先来想⼏个问题:

  • 不同数据库⼚商的数据库驱动⼀样吗?
  • 不同数据库⼚商的 API 调⽤⼀样吗?
  • 使⽤ Java 程序只操作 MySQL 吗?还是有可能操作 Oracle、Sql Server、DB2 等数据库?

以上的答案都是否定的,也就是说不同⼚商提供了不同的数据库驱动,提供了不同的 API 接⼝,那 Java 程序要怎么实现? 难道是针对⼀个数据库写⼀套调⽤的⽅法吗?因为驱动和 API 完全不同,所以不同的数据操作也是不同的,要针对每种数据库写⼀套调⽤代码就太麻烦了,那要怎么办? 解决以上问题的办法就是使⽤ JDBC。

2.1.JDBC定义

JDBC,即 Java Database Connectivity,Java 数据库连接。是⼀种⽤于执⾏ SQL 语句的 Java API, 它是 Java 中的数据库连接规范。这个 API 由 java.sql.*、javax.sql.* 包中的⼀些类和接⼝组成,它为 Java 开发⼈员操作数据库提供了⼀个标准的 API,可以为多种关系数据库提供统⼀访问。

简单来说,使⽤了 JDBC 之后,不管是什么数据库与什么数据库驱动,只需要使⽤⼀套标准代码就可以实现对不同数据库进⾏统⼀操作(添加、修改、删除、查询),也就解决了上⾯说的那些问题了。

C++操作哪个数据库,就使用哪个API。

Java运行在JVM上,C++运行在CPU上。

2.2.JDBC工作原理

JDBC 为多种关系数据库提供了统⼀访问⽅式,作为特定⼚商数据库访问 API 的⼀种⾼级抽象, 它主要包含⼀些通⽤的接⼝类。 JDBC 访问数据库层次结构:

JDBC 优势:

  • Java 语⾔访问数据库操作完全⾯向抽象接⼝编程。
  • 开发数据库应⽤不⽤限定在特定数据库⼚商的 API。
  • 程序的可移植性⼤⼤增强。

3.JDBC使用

3.1.创建项目并添加MySQL驱动包

Oracle官网特别难用,去Maven这个版本的中央仓库下载驱动包:

选择时大版本是5.1即可~和数据库服务器版本对应。

  • 黑客(黑帽子)发现一些软件漏洞(相当于是代码里的bug),对系统进行攻击,进一步入侵操控你的电脑。
  • 白客(白帽子)发现软件漏洞后,通知开发者,赶紧修复。
  • 红客:2001年,中美黑客大战,中国一群黑客入侵美国政府网站,给网站上插红旗,称为红客。

新建文件夹lib。复制刚才下载的jar包,粘贴到lib下。

此时idea就可以解析jar包里包含的内容了。

3.2.使用代码操作数据库

操作数据库 MySQL 提供了两种操作 API:

  • DriverManager
  • DataSource(推荐使⽤)

接下来咱们使⽤ DataSource 来实现操作数据库。 使⽤代码操作数据库分为以下 5 个步骤: 

  1. 获取数据源(准备⼯作,点击 MySQL 连接⼯具,并输⼊⽤户名、密码) 
  2. 获取连接(敲击回⻋试图建⽴客户端和服务器端的连接)
  3. 获取执⾏器(连接到服务器并切换到数据库)
  4. 查询或操作数据库(输⼊命令,并得到结果)
  5. 关闭连接(关闭客户端)

3.2.1.获得数据源

不同的数据库,对于数据源的描述,是存在差异的!有的数据库是通过用户名、密码来认证,有的不是,比如SQLLite。

URL:

  • jdbc:mysql - 这个url是给idbc中的mysql来使用的。
  • 127.0.0.1 - 数据库服务器所在的IP地址,换回IP,表示主机自己(相当于java中的this)只要数据库服务器和jdbc程序是在同一台电脑上,就可以使用这个IP地址。
  • 3306 - 端口号,mysql安装时配置的默认端口号。 
  • java106 - 访问的数据库名。
  • characterEncoding=utf8 - 描述了请求的字符编码方式,一般都设置为utf8。
  • useSSL=false - 关闭数据库加密功能,此处没必要加密,手动关了,如果不关,有些可能会连接失败。
//使用 jdbc 往数据库中,插入一个记录
//需要提前准备好数据库(java106)和数据表(student)//1.创建数据源,描述了数据库服务器在哪
DataSource dataSource = new MysqlDataSource(); //向上转型
//设置数据库所在的地址和端口以及数据库名,当前是固定写法
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java106?characterEncoding=utf8&useSSL=false"); //向下转型
//这样写的好处是后续代码使用DataSource类型的实例,避免MysqlDataSource这个名字扩散到代码的各个地方(高内聚),未来要是换数据库,只改动这一个代码即可//        //也可以不做任何转型
//        MysqlDataSource mysqlDataSource = new MysqlDataSource();
//        mysqlDataSource.setURL();//指定数据库登录的用户:root,这是mysql自带的用户,也可配置别的,但基本用不到((MysqlDataSource)dataSource).setUser("root");
//指定数据库登录的密码,密码就是安装数据库的时候,手动设置的密码((MysqlDataSource)dataSource).setPassword("12345678");

3.2.2.获得连接

  • Connection是网络通信中的核心概念,叫“连接”。
  • Link是“链接”。
//2.和数据库建立网络连接,写的 jdbc 代码本质上是实现一个 mysql 客户端,要通过网络和服务器进行通信
Connection connection = dataSource.getConnection();//通过控制台,来输入用户的信息
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学号:");
int id = scanner.nextInt();
System.out.println("请输入姓名:");
String name = scanner.next();

3.2.3.获得执行器

执⾏器是⽤来执⾏ SQL 命令的,执⾏器有三种:

  1. Statement
  2. PreparedStatement
  3. CallableStatement

实际开发中最常⽤的是 PreparedStatement 对象,PreparedStatement 优点如下:

PreparedStatement 有主要两种重要的⽅法:

  1. executeQuery():⽅法执⾏后返回单个结果集的,通常⽤于 select 语句。
  2. executeUpdate():⽅法返回值是⼀个整数,指示受影响的⾏数,通常⽤于 update、insert、 delete 语句。
//3.构造一个sql语句,来完成插入操作
String sql = "insert into student values(?,?)"; //占位符(1,2)此处不是从0开始计算,而是从1开始计算
//jdbc中还需要搭配一个特定的对象,来描述这里的sql的情况
PreparedStatement statement = connection.prepareStatement(sql); //会对sql语句做一些处理解析,减轻mysql服务器的压力
//填充占位符
statement.setInt(1,id);
statement.setString(2, name);
System.out.println("sql:" + statement);

3.2.4.查询或操作数据库

//4.执行sql语句,控制客户端给服务器发送网络请求,返回结果的含义是这个操作影响到几行
/*** 针对增、删、改,使用executeUpdate来执行* 针对查,使用executeQuery来执行*/
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);

3.2.5.关闭数据库连接

//5.断开数据库连接,并且释放必要的资源,资源释放的顺序和创建的顺序是相反的
statement.close();
connection.close();

执行代码——插入

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;public class JDBCInsertDemo {public static void main(String[] args) throws SQLException {//使用 jdbc 往数据库中,插入一个记录//需要提前准备好数据库(java106)和数据表(student)//1.创建数据源,描述了数据库服务器在哪DataSource dataSource = new MysqlDataSource(); //向上转型//设置数据库所在的地址和端口以及数据库名,当前是固定写法((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java106?characterEncoding=utf8&useSSL=false"); //向下转型//这样写的好处是后续代码使用DataSource类型的实例,避免MysqlDataSource这个名字扩散到代码的各个地方(高内聚),未来要是换数据库,只改动这一个代码即可//        //也可以不做任何转型
//        MysqlDataSource mysqlDataSource = new MysqlDataSource();
//        mysqlDataSource.setURL();//指定数据库登录的用户:root,这是mysql自带的用户,也可配置别的,但基本用不到((MysqlDataSource)dataSource).setUser("root");//指定数据库登录的密码,密码就是安装数据库的时候,手动设置的密码((MysqlDataSource)dataSource).setPassword("12345678");//2.和数据库建立网络连接,写的 jdbc 代码本质上是实现一个 mysql 客户端,要通过网络和服务器进行通信Connection connection = dataSource.getConnection();//通过控制台,来输入用户的信息Scanner scanner = new Scanner(System.in);System.out.println("请输入学号:");int id = scanner.nextInt();System.out.println("请输入姓名:");String name = scanner.next();//3.构造一个sql语句,来完成插入操作String sql = "insert into student values(?,?)"; //占位符(1,2)此处不是从0开始计算,而是从1开始计算//jdbc中还需要搭配一个特定的对象,来描述这里的sql的情况PreparedStatement statement = connection.prepareStatement(sql); //会对sql语句做一些处理解析,减轻mysql服务器的压力statement.setInt(1,id);statement.setString(2, name);System.out.println("sql:" + statement);//4.执行sql语句,控制客户端给服务器发送网络请求,返回结果的含义是这个操作影响到几行/*** 针对增、删、改,使用executeUpdate来执行* 针对查,使用executeQuery来执行*/int ret = statement.executeUpdate();System.out.println("ret = " + ret);//5.断开数据库连接,并且释放必要的资源,资源释放的顺序和创建的顺序是相反的statement.close();connection.close();}
}

执行代码——修改、删除

和插入的代码非常像,只需改动sql语句即可~

执行代码——查询

查询数据库使⽤ PreparedStatement.executeQuery ⽅法,返回⼀个 ResultSet 对象。

ResultSet 对象它被称为结果集,它代表符合 SQL 语句条件的所有⾏,并且它通过⼀套 getXXX ⽅法提供了对这些⾏中数据的访问。

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

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class JDBCSelectDemo {public static void main(String[] args) throws SQLException {DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java106?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("12345678");Connection connection = dataSource.getConnection();String sql = "select * from student where id>?";PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1,2);ResultSet resultSet = statement.executeQuery();while(resultSet.next()) {//next初始情况下,光标指向第一行的前面,移动一下光标,光标指向下一行,然后移动到结尾,就返回 false//使用getXX方法获取到每一列//获取int,就使用getInt,获取String,就使用getString//这里的参数,就是数据库表的列名int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println(id + ":" + name);}statement.close();connection.close();}
}

PS:使用DriverManager实现查询

jdbc支持2种风格的代码,一个是DriverManager,一个是DataSource。

  1. DriverManager使用时,需要借助反射,反射不属于常规的编程手段,是特殊情况下的特殊手段。
  2. DataSource相比于DriverManager,内置了数据库连接池,可以重复利用连接。 推荐使用DataSource。

使⽤ DriverManager 只是获取 Connection 之前的两步代码不⼀样:

import java.sql.*;public class App2 {public static void main(String[] args) throws SQLException, ClassNotFoundException {// 1.加载JDBC驱动程序:反射,这样调⽤初始化com.mysql.jdbc.Driver类,即将该类加载到JVM⽅法区,并执⾏该类的静态⽅法块、静态属性。Class.forName("com.mysql.jdbc.Driver");// 2.创建数据库连接Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/java33?user=root&password=12345678&characterEncoding=UTF-8&useSSL=true");// 3.获得执⾏器PreparedStatement statement = connection.prepareStatement("select * from student where username=?");// 3.1 占位符赋值statement.setString(1, "王五");// 4.获得结果集ResultSet resultSet = statement.executeQuery();// 4.1 获得结果并打印while (resultSet.next()) {String sn = resultSet.getString("sn");String username = resultSet.getString("username");String mail = resultSet.getString("mail");System.out.println(String.format("SN:%s,UserName:%s,Mail:%s", sn, username, mail));}// 5. 关闭资源resultSet.close();connection.close();}
}

实际开发中,用框架Mybatis,JPA这些框架来代替JDBC。

相关文章:

8-JDBC 编程

目录 1.数据库编程的必备条件 PS&#xff1a;程序是怎么操作数据库的&#xff1f; 2.什么是JDBC&#xff1f; 2.1.JDBC定义 2.2.JDBC工作原理 3.JDBC使用 3.1.创建项目并添加MySQL驱动包 3.2.使用代码操作数据库 3.2.1.获得数据源 3.2.2.获得连接 3.2.3.获得执行器 …...

零基础如何学习 Web 安全?

Web安全不仅是互联网的核心&#xff0c;而且还是云计算和移动互联网的最佳载体。对于信息安全从业者而言&#xff0c;Web安全是一个非常重要的研究课题之一。 Web应用是指采用B/S架构、通过HTTP/HTTPS协议提供服务的统称。随着互联网的广泛使用&#xff0c;社交网络、聊天工具…...

【简单实用框架】【AddressablesMgr】【可移植】

☀️博客主页&#xff1a;CSDN博客主页&#x1f4a8;本文由 萌萌的小木屋 原创&#xff0c;首发于 CSDN&#x1f4a2;&#x1f525;学习专栏推荐&#xff1a;面试汇总❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&#…...

android 12.0Launcher3禁止拖拽app图标到第一屏

1.概述 在12.0进行定制化开发Launcher3中,会对Launcher3 做些要求,比如现在的需求就是Launcher3第一屏的图标固定,不让其他屏的图标拖动到 第一屏所以说这个需求和 禁止拖拽图标到Hotseat类似,也是从WorkSpace.java里面寻找解决方案 2.Launcher3禁止拖拽app图标到第一屏相…...

SkyLine简介

简介 SkyLine产品系列&#xff08;TerraExplorer 、TerraGate、TerraBuilder&#xff09;是一套优秀的三维数字地球平台软件。凭借其国际领先的三维数字化显示技术&#xff0c;它可以利用海量的遥感航测影像数据、数字高程数据以及其他二三维数据搭建出一个对真实世界进行模拟…...

算法基础学习笔记——④前缀和\差分\双指针\位运算

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 ✨前缀和 ✨一维前缀和 &#x1f353;一维前缀和模板&#xff1a; ✨二维前缀和 &#x1f353;二位前缀和模板&#xff1a; 前言&#xff1a;算法学习笔记记录日常分享&#xff0c;需要的看哈O(∩_∩)O&a…...

【Linux系统基础快速入门详解】Linux下安装软件必知必会4种方法(yum,编译安装,rpm包,二进制方式)等详解

在 Linux 下安装软件有多种方法可供选择,常用的包括 yum、编译安装、rpm 包和二进制方式。下面对这些方法进行详细说明: 使用 yum 安装软件yum 是 Red Hat 系列 Linux 发行版中常用的软件包管理工具,通过 yum 可以方便地安装、升级和删除软件包。yum 默认从官方仓库中下载软…...

ASEMI代理长电可控硅BT136参数,BT136规格,BT136说明

编辑-Z 长电可控硅BT136参数&#xff1a; 型号&#xff1a;BT136 RMS通态电流IT(RMS)&#xff1a;6A 非重复浪涌峰值导通电流ITSM&#xff1a;25A 峰值栅极电流IGM&#xff1a;2A 平均栅极功耗PG(AV)&#xff1a;0.5W 存储接点温度范围Tstg&#xff1a;-40 to 150℃ 工…...

代码线程安全

线程生命周期 synchronized synchronized会自动释放锁 synchronized同步代码块 synchronized后面括号里obj是锁对象(保证唯一)&#xff1b;static修饰的obj对象是自定义MyThread线程类的静态成员变量&#xff0c;该自定义线程类所有实例共享保证锁对象唯一性&#xff1b;另一…...

Filebeat技术栈总结

filebeat 是一个轻量型日志采集器&#xff0c;本质上是一个 agent 。不依赖于任何应用&#xff0c;可以安装在任何节点上&#xff0c;可单独使用 Filebeat 并根据配置读取对应位置的日志进行上报和搜集。 filebeat 内置了常用的 output 组件&#xff0c;例如 kafka、ElasticSe…...

【App自动化测试】(十六)健壮性测试工具——Android Monkey

目录 1. 介绍2. 安装3. Monkey的使用4. money常用命令5. 常用事件类型参数6. Monkey使用参考 1. 介绍 Monkey是一个在模拟器或设备上运行的程序&#xff0c;用于生成用户事件的伪随机流。 为什么要使用Monkey这个自动化遍历工具&#xff1f; Monkey解决了一个测试痛点&#xff…...

实现第一个内核程序的Hello World

背景 在内核的开发中&#xff0c;总要先入个门。那么就要来编写第一个内核程序 入门 一个 module_init 程序是Linux内核模块的一部分&#xff0c;通过module_init 方法就能将程序载入内核。 module_init 方法需要以下步骤 编写module_init 的代码&#xff0c;并将其保存为…...

python基于协同过滤推荐算法的电影观后感推荐管理系统的设计

本课题所设计的影单管理系统&#xff0c;使用B/S架构&#xff0c;Python语言进行开发&#xff0c;它的优点代码不能从浏览器查看&#xff0c;保密性非常好&#xff0c;比其他的影单管理更具安全性。Python还容易修改和调试&#xff0c;毕竟影视是在不断发展过程中&#xff0c;难…...

Vue——状态管理库Pinia

写在前面&#xff1a;本文参考小满大牛的pinia专栏 一、Vuex与Pinia Vuex 和 Pinia 均是 Vue.js 的状态管理库&#xff0c;它们为 Vue 应用程序提供了一种集中式的、可预测的状态管理解决方案。 Vuex 是 Vue.js 官方推荐的状态管理库之一。它的核心概念包括 state、mutation…...

Linux:忘记root密码解决办法

如果你是虚拟机只要将光盘镜像连接到虚拟机上&#xff0c;以光盘iso镜像启动 如果你是真机或服务器那将实体u盘或实体光盘连接至设备并且以连接的设备启动 开机时候打断开机 使用 &#xff08;u盘|光盘&#xff09;引导启动 troubleshooting rescue a centos system 输入 1…...

Dockerfile(4) - RUN 指令详解

RUN 运行命令 shell 形式 命令在 shell 中运行Linux 上默认为 /bin/sh -cWindows 上 cmd /S /C RUN <command> exec 形式 RUN ["executable", "param1", "param2"] 必须双引号&#xff0c;不能是单引号 两种写法的实际栗子 RUN …...

一个完整的APP定制开发流程是怎样的?

随着移动互联网的发展&#xff0c;越来越多的 APP应用软件进入人们的生活&#xff0c;让我们的生活更便捷、更舒适。而随着互联网技术的进步&#xff0c;移动互联网应用软件开发行业也越来越成熟&#xff0c;为了适应市场需求&#xff0c;各种功能强大、性能良好的 APP应用软件…...

【数据结构】24王道考研笔记——线性表

线性表 目录 线性表定义和基本操作顺序表静态顺序表动态顺序表 链表单链表不带头结点&#xff1a;带头结点&#xff1a; 双链表循环链表循环单链表&#xff1a;循环双链表&#xff1a; 静态链表 顺序表链表比较逻辑结构&#xff1a;存储结构&#xff1a;基本操作&#xff1a; 定…...

【Linux C】基于树莓派/香橙派的蓝牙服务端——支持多蓝牙设备接入

一、需求 在树莓派/香橙派上利用开发板自带的蓝牙作为一个蓝牙服务端&#xff08;主机&#xff09;&#xff0c;允许外来设备&#xff08;从机&#xff09;通过蓝牙接入进行通信&#xff0c;通信格式为透传方式&#xff1b;采用的编程语言为Linux C 二、环境准备 bluez安装 …...

鸿蒙App开发选择Java还是JavaScript?

众所周知&#xff0c; Java和 JavaScript是两种编程语言&#xff0c;这两种语言在不同的环境中都有许多用途。在鸿蒙 App开发中&#xff0c; Java和 JavaScript是两种常见的编程语言&#xff0c;它们都具有广泛的应用&#xff0c;并且都有其独特的优势。下面我们将就这两种编程…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...