day36_jdbc
今日内容
上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili
同步笔记沐沐霸的博客_CSDN博客-Java2301
零、 复习昨日
一、JDBC
二、登录
三、ORM
零、 复习昨日
sql语言:DDL DML DQL DCL
create table 表名(id int primary key auto_increment,sname varchar(20) unique,age int not null,score double(10,2) default 100.0,birthday date );
insert into stu values(1,'zs',18,98.2,'2020-01-01') update stu set sname = 'ls' where id = 1; delete from stu where id = 1;select 字段,聚合函数,函数,流程函数 from 表1,表2 / left join 表2 where 关联条件/过滤条件 group by 分组字段 having 分组后过滤条件 order by 排序字段 limit x[,y]
字符串函数
- concat
数学函数
- format,truncate,rand,round
日期函数
- sysdate() now(),current_date()
- date_add(1 interval 1 单位) adddate()
- date_sub , datediff
- year() month() day()
- 日期转字符串 data_format(日期,‘%Y-%m-%d’)
- 字符串转日期 str_to_date(‘日期字符串’,‘%Y-%m-%d’)
流程函数
if() ifnull() case when then esle end
索引
- 是一种数据结构,目的是为了提高查询效率
- 主键索引,唯一索引,普通索引,复合索引(联合索引),全文索引
- 索引什么时候加? 注意使用的时机
一、引言
1.1 如何操作数据库
使用客户端工具访问数据库,需要手工建立连接,输入用户名和密码登录,编写 SQL 语句,点击执行,查看操作结果(结果集或受影响行数)。
客户端操作数据库步骤 |
---|
![]() |
1.2 实际开发中,会采用客户端操作数据库吗?
在实际开发中,当用户的数据发生改变时,不可能通过客户端操作执行 SQL 语句,因为操作量过大,无法保证效率和正确性。
二、JDBC
2.1 什么是 JDBC?
JDBC(Java Database Connectivity) Java 连接数据库的规范(标准),可以使用 Java 语言连接数据库完成 CRUD 操作。
2.2 JDBC 核心思想
Java 中定义了访问数据库的接口,可以为多种关系型数据库提供统一的访问方式。由数据库厂商提供驱动实现类(Driver 数据库驱动)。
核心思想 |
---|
![]() |
2.2.1 MySQL 数据库驱动
- mysql-connector-java-5.1.X 适用于 5.X 版本
- mysql-connector-java-8.0.X 适用于 8.X版本
2.3 环境搭建
mysql厂商提供的jdbc规范的实现,要想完成JDBC操作,就需要将驱动包加入到当前项目中.
2.3.1 方式1:复制粘贴
- 在项目下新建 lib 文件夹,用于存放 jar 文件。
- 将 mysql 驱动mysql-connector-java-5.1.X复制到项目的 lib 文件夹中。
- 选中 lib 文件夹右键 Add as Library,点击 OK。
在项目名下创建文件夹lib |
---|
![]() |
命名为lib |
---|
![]() |
将mysql驱动包复制粘贴到此处 |
---|
![]() |
添加驱动包为当前项目的类库 |
---|
![]() |
2.3.2 方式2:idea导入类库
打开项目结构(Project Structure) |
---|
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ppjLhrMS-1683686915035)(C:/Users/qiush/AppData/Roaming/Typora/typora-user-images/image-20230320105013907.png)] |
选择libraries,添加jar包 |
---|
![]() |
本地磁盘选择jar包 |
---|
![]() |
应用生效 |
---|
![]() |
下方,External查看导入类库 |
---|
![]() |
三、JDBC编程
JDBC编程有标准步骤(八股文)
- 注册驱动
- 将sql语句的运行环境加载到JVM
- 连接数据库
- 获得执行SQL的对象
- 执行SQL语句,获得结果
- 关流
3.1 注册驱动
使用 Class.forName(“com.mysql.jdbc.Driver”);手动加载字节码文件到 JVM 中。
或者MySQL8版本 Class.forName(“com.mysql.cj.jdbc.Driver”);
Class.forName("com.mysql.jdbc.Driver");//5.7版本 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//5.7版本 加载驱动
3.2 连接数据库
- 通过 DriverManager.getConnection(url,user,password) 获取数据库连接对象
- URL:jdbc:mysql://localhost:3306/database
- ?useUnicode=true&characterEncoding=utf8 // 解决数据编码格式乱码
- &useSSL=false // 解决执行时控制台红色警告
- &serverTimezone=UTC // mysql8版本需要加时区
- username:root
- password:123456
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC ", "root","1234");
- URL(Uniform Resource Locator) 统一资源定位符:由协议、IP、端口、SID(程序实例名称)组成
3.3 获取发送 SQL 的对象
通过 Connection 对象获得 Statement 对象,用于对数据库进行通用访问。
Statement statement = conn.createStatement();
3.4 执行SQL 语句
执行 SQL 语句并接收执行结果。
String sql ="INSERT INTO t_jobs(JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY) VALUES('JAVA_Le','JAVA_Lecturer',4000,10000);";int result = statement.executeUpdate(sql);//执行SQL语句并接收结果
- 注意:在编写 DML 语句时,一定要注意字符串参数的符号是单引号 ‘值’
- DML 语句:增删改时,返回受影响行数(int 类型)。
- DQL 语句:查询时,返回结果数据(ResultSet 结果集)。
3.5 处理结果
接受处理操作结果。
if(result == 1){System.out.println("Success");
}
- 受影响行数:逻辑判断、方法返回。
- 查询结果集:迭代、依次获取。
3.6 释放资源
遵循先开后关原则,释放所使用到的资源对象。
statement.close();
conn.close();
3.7 案例
准备数据库表,进行CRUD.
create table tb_user(id int(11) primary key auto_increment comment '用户编号',username varchar(10) comment '用户名',password varchar(10) comment '密码',phone varchar(11) comment '手机号',createTime date comment '注册时间',money double(10,2) comment '账户余额',sex int(1) comment '性别 1男2女'
);
需求: 使用JDBC完成对tb_user表插入数据
package com.qf.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;/*** --- 天道酬勤 ---** @author QiuShiju* @desc 演示JDBC*/
public class Demo1_insert {public static void main(String[] args) throws ClassNotFoundException, SQLException {// 1 加载驱动// ps: 利用反射技术,将驱动类加载到JVMClass.forName("com.mysql.jdbc.Driver");// 2 通过驱动管理对象获得连接对象/*** 参数1 url: 数据库连接的地址* 协议://ip:端口/库名* 参数2 username: 数据库用户名* 参数3 password: 数据库密码*/String url = "jdbc:mysql://localhost:3306/java2217?useSSL=false&serverTimezone=UTC";String username = "root";String password = "123456";Connection conn = DriverManager.getConnection(url,username,password);// 3 通过连接对象,创建执行sql语句的对象Statement statement = conn.createStatement();// 4 通过执行语句对象,执行sql,获得结果String sql = "insert into tb_user (id,username,password,phone,createTime,money,sex) values (2,'root','123456','1122200','2022-11-21',2000.0,2)";// 执行查询,是executeQuery()// 执行增删改,是executeUpdate(),返回受影响的行数int num = statement.executeUpdate(sql);if (num > 0) {System.out.println("插入成功!!" );}// 5 关流statement.close();conn.close();}
}
四、完成增删改
4.1 插入
参考入门案例
4.2 更新
任何的JDBC都是那5个步骤.
package com.qf.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;/*** --- 天道酬勤 ---** @author QiuShiju* @desc 更新*/
public class Demo2_update {public static void main(String[] args) throws Exception {// 1 加载驱动Class.forName("com.mysql.jdbc.Driver");// 2 通过驱动管理对象获得连接对象String url = "jdbc:mysql://localhost:3306/java2217?useSSL=false";String username = "root";String password = "123456";Connection conn = DriverManager.getConnection(url, username, password);// 3 通过连接对象创建执行语句对象Statement statement = conn.createStatement( );// 4 通过执行语句对象执行sql,获得结果String sql = "update tb_user set username = '小孟', phone = '666666' where id = 3";int num = statement.executeUpdate(sql);if (num > 0) {System.out.println("更新成功!" );}// 5 将对象的流关闭statement.close();conn.close();}
}
4.3 删除
public class Demo3_delete {public static void main(String[] args) throws Exception {Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2217?useSSL=false", "root", "123456");Statement statement = conn.createStatement( );int num = statement.executeUpdate("delete from tb_user where id = 3");if (num > 0) {System.out.println("删除成功!");}statement.close();conn.close();}
}
五、查询结果集ResultSet【重要】
查询返回的是一种虚拟表,Java的JDBC中是使用结果集(ResultSet)来封装这个虚拟表,结果集就是一个集合,内部就存储了列名和每行数据,那么学习查询的重点是
- 从结果集取值
package com.qf.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;/*** --- 天道酬勤 ---** @author QiuShiju* @desc 查询*/
public class Demo4_select {public static void main(String[] args) throws Exception {Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2217?useSSL=false", "root", "123456");Statement statement = conn.createStatement( );String sql = "select id,username,password from tb_user";// 执行查询的方法executeQuery,方法返回值是ResultSetResultSet rs = statement.executeQuery(sql);/*** ResultSet 内部包含了整个查询返回的虚拟表数据* 内部提供了方法可以操作结果集* boolean next(); 判断结果集有没有下一行数据,返回false,即没有下一行数据返回* true就是有下一行数据,此时就可以进入取值* getObject() 获得数据,返回值是Object* getInt/getString/getDate() 获得数据,返回对应数据类型* --------------------------------------* getXxx(int columnIndex) 通过列下标获得对应Xxx数据类型的数据* 下标从1开始,顺序是按照查询返回虚拟表顺序* getXxx(String columnLabel) 通过列名获得对应Xxx数据类型的数据* 根据虚拟表列名,如果有别名那就是别名*/while (rs.next()) {// 通过列下标获得数据// int id = rs.getInt(2);// String username = rs.getString(1);// 通过列名获得数据 【推荐】int id = rs.getInt("id");String username = rs.getString("username");System.out.println(id + "-" + username);}statement.close();conn.close();}}
六、登录案例【重要】
需求:
- 通过控制台用户输入用户名和密码。
- 用户输入的用户名和密码作为条件,编写查询 SQL 语句。
- select * from user where username = xxx and password = xxx
- 如果该用户存在,提示登录成功,反之提示失败。
package com.qf.jdbc;import com.mysql.jdbc.Driver;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class Demo5_Login {public static void main(String[] args) {// 1 输入用户名和密码Scanner scanner = new Scanner(System.in);System.out.println("请输入用户名:" );String username = scanner.nextLine( );System.out.println("请输入密码:" );String password = scanner.nextLine( );// 2 根据用户名和密码查人boolean isOk = findUserByLogin(username,password);// 3 结果if (isOk) {System.out.println("登录成功!" );} else {System.out.println("用户名或密码错误!" );}}// 使用捕获代码完成private static boolean findUserByLogin(String username, String password) {Connection conn = null;Statement statement = null;boolean isOk = false;try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database?useSSL=false", "root", "123456");statement = conn.createStatement( );// 根据用户名和密码查询,注意字符串拼接.特别注意单引号ResultSet rs = statement.executeQuery("select * from tb_user where username = '"+username+"' and password = '"+password+"'");// 只要有值,就说明数据库有这个信息,登录成功if (rs.next()) {// System.out.println("登录成功!" );int id = rs.getInt("id");String uname= rs.getString("username");// ...System.out.println(id+"-"+username);isOk = true;} else {// System.out.println("用户名或密码错误!!" );}}catch (Exception e) {System.out.println("SQL操作出错!" );e.printStackTrace();// 打印异常} finally {try{statement.close();conn.close();}catch (Exception e) {System.out.println("关流异常" );e.printStackTrace();// 打印异常}}return isOk;}
}
七、ORM【重要】
7.1 什么是ORM
目前使用JDBC完成了CRUD,但是现在是进行CRUD,增删改方法要设计很多参数,查询的方法需要设计集合才能返回.
在实际开发中,我们需要将零散的数据封装到对象处理.
ORM (Object Relational Mapping) 对象关系映射
是指
数据库表
与Java的实体类
有关系,可以进行映射
- 数据库表 --> Java的类
- tb_user —> User.java
- 字段 --> 类的属性
- id int --> private int id;
- username varchar --> private String username;
- …
- 一行数据 --> 类的对象
7.2 实体类
实体类: 数据表中零散数据的载体,用来封装数据.
- 表名 设计 类名
- 将列名设计成属性名
- id --> id
- create_time --> createTime (下划线转驼峰)
- 将列的数据类型设计成属性的数据类型
- 给类提供对应set get
一般项目中一个表就会对应一个实体类,所有的实体类都会放在model/entity/pojo/javabeen包结构中
将来写项目,数据库设计完,搭建完项目,第一件事件就是根据表结构,创建实体类
package com.qf.model; // 包
public class User { // 实体类,是表名// 属性是字段名private int id;private String username;private String password;private String phone;private Date createTime;private double money;private int sex;// setter getter...
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PoGLG5sN-1683686914087)(…/…/…/…/Java2217/阶段2/day43/笔记/day43_jdbc.assets/image-20221122160619448.png)]
7.3 ORM改造登录案例
package com.qf.jdbc;import com.qf.model.User;import java.sql.*;
import java.util.Scanner;/*** --- 天道酬勤 ---** @author QiuShiju* @desc 使用orm改造login登录案例*/
public class Demo6_login_orm {public static void main(String[] args) {input();}// 1 键盘输入public static void input() {Scanner scanner = new Scanner(System.in);System.out.println("请输入用户名:");String username = scanner.nextLine( );System.out.println("请输入密码:");String password = scanner.nextLine( );// 调用方法执行查询User user = findUserByUsernameAndPassword(username, password);if (user != null) {System.out.println("用户登录成功" );System.out.println("用户信息: " + user );} else {System.out.println("用户名或密码错误!" );}}// 2 执行登录public static User findUserByUsernameAndPassword(String username, String password) {Connection conn = null;Statement s = null;ResultSet rs = null;// 声明user,赋值为null,下方如果登录成功,创建user对象// 即将来,可以通过user是否为空判断是否登录成功User user = null;try {// 1 驱动Class.forName("com.mysql.jdbc.Driver");// 2 连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2301?useSSL=false", "root", "123456");// 3 语句s = conn.createStatement( );// 4 查询String sql = "select * from tb_user where username = '"+username+"' and password = '"+password+"'";// 执行rs = s.executeQuery(sql);// 判断成功,说明查询到用户if (rs.next()) {// 取出数据int id = rs.getInt("id");String username1 = rs.getString("username");String password1 = rs.getString("password");String phone = rs.getString("phone");Date createTime = rs.getDate("createTime");double money = rs.getDouble("money");int sex = rs.getInt("sex");// 封装数据user = new User();user.setId(id);user.setUsername(username1);user.setPassword(password1);user.setPhone(phone);user.setCreateTime(createTime);user.setMoney(money);user.setSex(sex);}} catch (Exception e) {System.out.println("出错了!" + e.getMessage( ));} finally {// 5 关流try {rs.close();s.close( );conn.close( );} catch (SQLException e) {System.out.println("关流时有异常" + e.getMessage( ));}}return user;}
}
7.4 ORM完成注册
package com.qf.jdbc;import com.qf.model.User;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class Demo7_insert_orm {public static void main(String[] args) {User user = new User( );user.setUsername("王五");user.setPassword("123456");user.setPhone("110");user.setCreateTime(new Date( ));user.setMoney(2800.0);user.setSex(2);insert(user);}// 注册public static void insert(User user) {Connection conn = null;Statement s = null;try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2301?useSSL=false", "root", "123456");s = conn.createStatement( );SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String date = sdf.format(user.getCreateTime( ));String sql = "insert into tb_user (username,password,phone,createTime,money,sex) " +"values ('"+user.getUsername()+"','"+user.getPassword()+"','"+user.getPhone()+"','"+date+"',"+user.getMoney()+","+user.getSex()+")";System.out.println("拼接后的sql ---> " + sql );int num = s.executeUpdate(sql);System.out.println(num > 0 ? "插入成功":"插入失败" );} catch (Exception e) {e.printStackTrace( );}}
}
相关文章:

day36_jdbc
今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、JDBC 二、登录 三、ORM 零、 复习昨日 sql语言:DDL DML DQL DCL create table 表名(id int primary key auto_increment,sname varchar(2…...

C++好难(6):模板初阶
【本节目标】 1. 泛型编程2. 函数模板3. 类模板 目录 【本节目标】 1.泛型编程 2.函数模板 概念: 格式: 原理: 实例化: 1.隐式实例化: 2.显式实例化 原则一: 原则二: 原则三&#…...

Windows 10字体模糊发虚! 如何解决?
在使用Windows 10操作系统的过程中,有些用户可能会遇到字体模糊、发虚的问题,这给用户的视觉体验带来了不小的困扰。本文将介绍几种解决Windows 10字体模糊发虚问题的方法。 一、更新显卡驱动程序 如果更新显卡驱动程序后问题仍未解决,那么很…...

Spring中的Bean和Bean的生命周期
在Spring中,Bean是被管理的对象,是应用程序的基本组件。Bean的生命周期包括Bean的创建、初始化、使用和销毁。在本文中,我们将介绍Spring中Bean的概念,如何创建和管理Bean以及Bean的生命周期。 Bean的概念 在Spring中࿰…...

嘉兴桐乡技能培训提升-如何提高工作效率
现在的工作基本上都离不开电脑,所以大家几乎天天都在跟电脑打交道,那么这些电脑使用技巧你知道多少呢?今天桐乡办公软件培训沈老师就给大家分享一下: 如何让“自动更正”输入统一的文本 你是不是经常为输入某些固定的文本&#x…...

SystemFunction032函数的免杀研究
什么是SystemFunction032函数? 虽然Benjamin Delphi在2013年就已经在Mimikatz中使用了它,但由于我之前对它的研究并不多,才有了下文。 这个函数能够通过RC4加密方式对内存区域进行加密/解密。例如,ReactOS项目的代码中显示&…...

Shell函数
目录 1.Shell的作用 2.Shell函数定义 3.函数变量的作用范围 Source 4.递归 5.函数库 编辑编辑编辑 1.Shell的作用 使用函数可以避免代码重复 使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强 2.Shell函数定义 1) functi…...

Spring-IOC源码解析
容器创建过程 Spring容器的refresh方法 public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {StartupStep contextRefresh this.applicationStartup.start("spring.context.refresh");// 1. 进行创…...

不会做大数据实时计算?10年数据分析师整理,一文给出解决方案
本文分为四个章节介绍实时计算,第一节介绍实时计算出现的原因及概念;第二节介绍实时计算的应用场景;第三节介绍实时计算常见的架构;第四节是实时数仓解决方案。 一、实时计算 实时计算一般都是针对海量数据进行的,并…...

如何让你的 WebSocket 接口测试更高效?拯救你的接口测试工作
目录 引言 WebSocket介绍 HTTP与WebSocket的区别 WebSocket测试方法 使用在线工具 使用Postman 使用Jmeter 使用Python 结语 引言 你是否曾经为 WebSocket 接口测试中复杂的协议和难以捕获的数据而感到束手无策?WebSocket 协议与传统的 HTTP 协议不同&…...

浅谈Linux 文件系统层次结构的组织方式
Linux 文件系统层次结构(Filesystem Hierarchy Standard,简称 FHS)是一种用于组织和管理 Linux 文件系统的标准化方式。该标准规定了 Linux 文件系统中各个目录和文件的组织方式、用途和权限,以提高文件系统的可读性、可维护性和可…...

创新案例 |探索 Tive 80% 的收入增长得益于智能物流服务、跟踪和实时可视化
您正在寻找可靠的物流解决方案吗? Tive 是领先的智能物流服务提供商,提供跟踪和实时可见性解决方案。使用 Tive,您可以主动监控公路、空运、海运和铁路运输。它可以帮助您减少运输问题并确保准时和全面交付,从而改善客户体验。 …...

makefile和cmake
Makefile 是一种文件,它定义了一个项目中的编译规则、依赖关系和构建过程。Makefile 可以自动化地构建和管理项目,使得整个项目的构建过程更加高效和可靠。下面是 Makefile 的常用语法: 1. 定义变量 变量可以用来保存一些常用的参数和路径&…...

通过OpenCL内核代码猜测设备寄存器个数
在OpenCL标准中,没有给出查看计算设备一共有多少寄存器,至少能分配给每个work-item多少寄存器使用的特征查询。而由于一个段内核代码是否因寄存器紧缺而导致性能严重下降也是一个比较重要的因素,因此我这边提供一个比较基本的方法来猜测当前计…...

C# + .Net6 实现TensorFlow图片分类
微软官网上发现一篇很有意思的文档:教程:用于对图像进行分类的 ML.NET 分类模型 - ML.NET | Microsoft Learn 这篇教程写的很学院派,但有点碎,属于上课不能打一秒钟瞌睡的那种。好在还是给出了完整的代码:samples/Pro…...

Ngnix负载均衡和高可用集群及搭建与相关理论
Ngnix负载均衡和高可用集群及搭建与相关理论 全文目录 Ngnix负载均衡和高可用集群及搭建与相关理论高可能保持原理配置 keepalived:配置keepalived的IP将外部域名解析到Keepalived的虚拟IP上如何验证配置的正确性Nginx专用调试工具ngx_conf_t如何对前后端多台服务器…...

2022年宜昌市网络搭建与应用竞赛样题(三)
网络搭建与应用竞赛样题(三) 技能要求 (总分1000分) 竞赛说明 一、竞赛内容分布 “网络搭建与应用”竞赛共分三个部分,其中: 第一部分:网络搭建及安全部署项目(500分࿰…...

为什么PCB设计完成后需要放置mark点
PCB设计中的Mark点是指一些标记点,通常用于促进PCB制造和组装过程中的准确性和一致性。这些标记点在制造过程中可以帮助操作员进行自动化定位,从而确保所有部件都被正确组装到其正确位置,这对于确保产品的质量和可靠性至关重要。 下面&#…...

代理IP:IP代理技术与Socks5协议
代理IP是一种用于隐藏真实IP地址的技术,它可以将请求发送至代理服务器,再由代理服务器转发请求至目标网站。代理服务器会在请求过程中替换真实IP地址,从而保护用户的隐私和安全。在网络爬虫、反爬虫、匿名访问等场景中,代理IP技术…...

如何让java程序员生涯更顺利?我聊聊提升技术水平的五个方面
今天我想和大家聊聊程序员职业发展的问题。相信大家都知道,IT公司因为各种原因裁员,对程序员的前途发展都是不利的。特别是等到你30多岁,上有老下有小,仍然要加班,与年轻人竞争体力和智力,这是很艰难的。如…...

快速排序、希尔排序、归并排序、堆排序、插入排序、冒泡排序、选择排序(递归、非递归)C语言详解
1.排序的概念及其运用 1.1排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录&a…...

ChatGPT一键私有部署,全网可用,让访问、问答不再受限,且安全稳定!
前言 ChatGPT由于在访问上有一些限制,使用并不便利。目前国内可以直接访问的大部分是调用API返回结果,我们去使用时总会有次数限制,而且它们可能随便崩掉。 其实,目前我们访问过的大部分国内的网页包括UI,其实是套用了…...

自学黑客(网络安全),一般人我劝你还是算了吧
一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 我在之前的回答中,我都一再强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而…...

盘“底座”,盘出新生意经
本文转自首席信息官 作者 徐蕊 导读 卖“底座”,这是一门新的生意,也是用友与友商差异化的商业竞争优势所在。 大型企业都在建“数智化底座” 有这样两类企业,他们截然不同,但在数智化的建设上殊途同归。 随着中国经济的发展&a…...

《花雕学AI》Poe:一个让你和 AI 成为朋友的平台,带你探索 ChatGPT4 和其他 八种AI 模型的奥秘
你是否曾经梦想过,能够在一个平台上,和多种不同的 AI 模型进行有趣、有用、有深度的对话,甚至还能轻松地把你的对话分享给其他人?如果你有这样的梦想,那么 Poe 一站式 AI 工具箱就是你的不二之选! Poe 是国…...

单片机GD32F303RCT6 (Macos环境)开发 (十五)—— i2c1采用DMA方式的读写函数
i2c1采用DMA方式的读写函数 1、关于i2c1的DMA的映射如图 2、关于代码的宏定义配置 Application目录的Makefile中 ENABLE_I2C_TEST yes才会编译I2C1的相关代码。 同时修改i2c.h文件,定义I2C1_MODE为I2C1_MODE_DMA,这样i2c1的配置为dma模式。 #define …...

通知短信 API 技术细节以及发送流程机制原理解析
引言 短信是一种简单、直接、高效的通信方式,被广泛应用于各个领域。在移动互联网时代,短信成为了客户服务、政府通知、公共服务等方面的重要工具。为了更好地利用短信这种通信方式,通知短信 API应运而生。短信API可以帮助企业、政府和应用程…...

Protobuf: 高效数据传输的秘密武器
当涉及到网络通信和数据存储时,数据序列化一直都是一个重要的话题;特别是现在很多公司都在推行微服务,数据序列化更是重中之重,通常会选择使用 JSON 作为数据交换格式,且 JSON 已经成为业界的主流。但是 Google 这么大…...

第五十四章 Unity 移动平台输入(下)
本章节我们介绍一个模拟器插件。这种插件比较多,比如EasyTouch,Lean Touch,Joystick Pack等等。EasyTouch是一个使用非常广泛的插件,支持点击,拖拽,遥感等很多常用功能。不过遗憾的是,该插件已经…...

KD305Y带吸收比极化指数兆欧表
一、概述 KD305Y绝缘电阻测试仪对众多的电力设备如:电缆、电机、发电机、变压器、互感器、高压开关、避雷器等要求做一系列的绝缘性能试验,首先是要做绝缘电阻测试。近年来随着电力事业的飞速发展,大容量设备的使用不断增加,用普通的兆欧表无…...