JavaWeb(楠)
JavaWeb21-1:Java Web开发的地位、Tomcat服务器
- Java Web开发概述
- 主流地位:Java可用于移动端、桌面应用、机器学习等多个领域,但在Web开发领域优势显著,是Java最主流的研发方向。市场上95%以上的Web端开发都使用Java,其他语言在Web开发方面存在缺陷,难以与Java抗衡。
- 开发内容:Java主要负责Web开发的后端部分,为前端提供数据支撑,前端负责界面展示。Java的强大在于其丰富的企业级开发框架,能提高开发效率,节约时间。
- Tomcat服务器
- 作用与原理:Tomcat是一个Web应用服务器,用于运行Web程序。由于网络安全限制,计算机之间不能随意访问,Tomcat作为对外窗口,将允许外部访问的资源放在其中运行,解决了程序部署和访问的问题,保护了计算机隐私。
- 安装与目录结构:推荐使用免安装的解压版Tomcat,目前版本9最主流。解压后的Tomcat包含多个文件夹,如bin存放启动关闭命令;conf存放配置文件;lib存放jar包;logs存放日志;temp存放临时文件;webapps存放程序;work存放JSP文件转换后的Servlet文件。
- 启动与访问:启动Tomcat可通过bin目录下的startup.bat(Windows系统)或startup.sh(Linux系统)脚本。Tomcat默认端口是8080,启动后可通过浏览器访问,默认访问webapps/root目录下的index.jsp页面。也可在webapps目录下自定义页面进行访问。
- 运行机制:启动Tomcat服务后,浏览器通过URL(IP加端口)访问服务,服务返回相应资源,如网页、图片、脚本等。其运行机制与之前学的Socket编程类似,Tomcat是成熟产品,底层封装了相关代码。
- 手写简易版Tomcat服务应用
- 目的:通过手写简易版Tomcat,帮助理解Tomcat底层原理,构建编程思维。
- 实现思路:使用Socket编程实现,创建服务端,定义接收请求的方法。在方法中,通过ServerSocket监听指定端口(如8080),循环接收客户端请求,获取输入流和输出流。同时,封装请求和响应对象,对请求数据进行解析。
- 解析请求:自定义HttpRequest类,在构造函数中传入输入流,通过循环读取输入流数据到数组,再将数组数据拼接到StringBuffer中,最终转换为字符串进行输出。通过测试类启动服务,可在浏览器访问测试,通过断点调试查看请求数据,目前解析方式存在问题,后续需修改完善。
JavaWeb21-2:简易版Tomcat的完善、Java Web工程的创建与配置
- 简易版Tomcat完善
- 请求资源解析:在获取请求数据后,通过查找字符串中两个空格的位置,利用
StringBuffer
的indexOf
和substring
方法截取目标资源名称(如hello.html
),并提供get
方法方便外部获取。 - 响应机制构建:编写
Response
类处理响应逻辑。根据请求的uri
判断资源是否存在,若为空则指定默认资源路径index.html
。通过创建File
对象判断资源是否存在,存在则读取文件内容并输出,不存在则返回404错误。 - 响应格式处理:由于浏览器对响应有特定格式要求,编写
createMessage
方法对响应数据进行封装。添加状态码(如200表示成功,404表示失败)、数据长度等信息,按照http 1.1 状态码\r\ncontent - length 数据长度\r\n\r\n数据内容
的格式返回,确保浏览器能正确解析响应。 - 功能测试验证:启动服务后,通过浏览器访问不同资源进行测试。如访问不存在的资源返回404错误,访问存在的资源(如
test.html
)则返回相应内容,成功实现了简易版Tomcat对资源的处理功能。
- 请求资源解析:在获取请求数据后,通过查找字符串中两个空格的位置,利用
- Java Web工程创建与配置
- 工程创建步骤:在IDEA中选择
java enterprise
下的web application
创建Java Web工程。创建过程中可选择绑定Tomcat服务器,若首次使用,点击new
选择tomcat server
并输入解压后的Tomcat路径完成配置,为工程命名后点击finish
完成创建。 - 工程结构解析:创建好的工程除
src
目录外,新增web
文件夹,其中包含web - info
目录和index.jsp
文件。web - info
用于配置Servlet
、监听器、过滤器等;index.jsp
是默认页面,可自行编辑。工程还自动引入jdk
和Tomcat的jsp API
、Servlet API
依赖,这些依赖来自Tomcat的lib
目录。 - 工程启动配置:在IDEA中启动Java Web工程时,若没有Tomcat标志,需编辑配置类。点击加号添加
tomcat local
,选择已配置好的Tomcat服务器,设置工程的deployment
和application context
。application context
决定了访问工程的路径,如设置为test
,访问时需在8080
后加上test
;若将其设置为空(保留斜杠),则工程映射到根目录,直接访问8080
即可。
- 工程创建步骤:在IDEA中选择
JavaWeb22-1:前端技术概述、实际操作示例、开发分工介绍
- 前端技术概述
- 重要性与学习目标:后端开发人员也需掌握前端基础,如HTML、CSS、JS,不必深入学习,会基本使用即可。在实际项目中,后端开发人员也会涉及前端工作,且常借助UI框架开发。
- 各技术作用:HTML用于编写网页基础标签;CSS用于美化网页;JS用于实现网页动态操作数据。三者结合可构建完整网页,同时介绍了对JS进行封装的jQuery库,使用它能简化代码编写。
- 前端开发实践
- 开发工具与项目创建:推荐使用HBuilder进行前端开发,也可使用WebStorm、VS Code等。以HBuilder为例,创建基本HTML项目,项目包含index.html、CSS、image、js等目录。
- 代码编写与样式设置:在index.html的body标签内编写HTML代码,如div标签。通过在style属性中设置CSS样式,可调整div的宽、高、背景颜色、边框等样式,也可将CSS代码单独写成一个文件(如index.css),并通过link标签引入到HTML文件中。
- 交互功能实现:引入jQuery库后,可在script标签内编写代码实现网页交互功能。如通过初始化函数,在页面加载时执行特定操作;为元素添加点击事件,当元素被点击时触发相应函数。
- 常用标签应用:详细介绍了表单相关的常用标签。使用div、table、input、radio、select、checkbox等标签搭建注册表单,设置输入框类型(text、password)、单选框互斥(通过设置相同name属性)、下拉框(select和option标签)、多选框(checkbox)等功能,还对表单元素样式进行了调整,如设置文本对齐方式、按钮样式(包括宽高、颜色、圆角、字体颜色、鼠标悬停效果等)。
- 前端开发分工:在软件公司开发项目时,通常有前端、后端、UI(美工)等岗位。UI使用Photoshop设计网页并提供素材,前端根据设计图和素材,用HTML和CSS将设计效果呈现在网页上,后端负责提供数据 。
JavaWeb22-2:前端与后端的相关知识、表单提交、前端UI组件、后端Servlet、前后端交互的实现过程
- 前端表单提交与优化
- 表单提交设置:在前端表单中添加
action
属性指定提交路径,method
属性指定提交类型(如post
)。提交按钮需设置type="submit"
,点击按钮即可提交表单数据。当前端提交表单到不存在的后台接口时,会提示连接不到请求。 - 样式与组件优化:原生前端页面样式不够美观,开发中常使用前端UI组件,如
layui
和element ui
。以layui
为例,使用时需复制其资源包,包括css
、字体、图片、js
等文件,然后通过添加相应的class
样式来使用,这些组件能快速构建出美观且功能丰富的页面。
- 表单提交设置:在前端表单中添加
- 后端Servlet基础与应用
- Servlet接口原理:Servlet是Java Web后端的重要组件,它是一个接口,实现该接口可使Java类具备接收网络请求并做出响应的功能。与之前手写的服务器程序相比,实现Servlet接口能简化开发过程。实现接口后,只需关注
service
方法,该方法会自动传入request
和response
对象,分别用于接收请求和做出响应。 - Servlet使用示例:创建一个普通Java类实现Servlet接口,并重写其中的抽象方法。通过添加
@WebServlet
注解为类添加映射名字,在浏览器中访问该映射名即可调用类中的service
方法。可以在service
方法中接收请求参数(如通过request.getParameter
方法),并使用response.getWriter().write
方法向浏览器输出响应内容。 - Servlet优化:直接实现Servlet接口需重写多个方法,其中多数方法可能不需要。通过继承
HttpServlet
类可进行优化,只需重写doGet
和doPost
方法,这两个方法分别处理get
和post
请求,且对request
和response
对象进行了功能扩展,使用起来更方便。
- Servlet接口原理:Servlet是Java Web后端的重要组件,它是一个接口,实现该接口可使Java类具备接收网络请求并做出响应的功能。与之前手写的服务器程序相比,实现Servlet接口能简化开发过程。实现接口后,只需关注
- 前后端交互实现
- 前端页面整合:将前端代码整合到Java Web工程中,创建
html
页面(如register.html
)并复制前端代码和样式文件。若页面样式未加载,可能是打包问题,可通过build
菜单中的rebuild project
重新构建工程解决。 - 表单数据提交与处理:前端表单提交路径设置为后端Servlet的映射名(如
test
),根据提交类型(post
或get
),后端会调用相应的doPost
或doGet
方法。post
请求比get
请求更安全,因为get
请求会将参数暴露在地址栏。后端通过request.getParameter
方法根据input
的name
属性获取表单数据,获取数据时可能遇到中文乱码问题,可通过设置request
的字符编码(characterEncoding=utf - 8
)解决。
- 前端页面整合:将前端代码整合到Java Web工程中,创建
JavaWeb23-1:的Servlet、请求与响应对象、页面跳转
- Servlet基础与作用
- Servlet的地位与功能:Servlet是Java Web开发的基础,无论是否使用框架,开发中都需用到。它实现了Java类接收网络请求并做出响应的功能,是Java程序进行Web开发的关键。
- 请求与响应的实现:通过继承
HttpServlet
类,重写doGet
和doPost
方法来处理不同类型的请求。这两个方法封装了HttpServletRequest
和HttpServletResponse
对象,分别用于表示请求和响应,体现了面向对象的编程思想。
- HttpServletRequest对象的功能
- 参数获取与编码设置:
HttpServletRequest
最基础的功能是接收客户端参数,通过getParameter
方法根据参数名获取参数值。同时,它还可设置编码(如utf - 8
)来解决中文乱码问题。 - 其他重要方法:
getRequestURI
用于获取请求的资源名称,getSession
用于获取session
对象,session
一般用于存储登录用户信息。此外,还介绍了URI
与URL
的区别,URL
是完整的请求路径,URI
是请求的资源名称。
- 参数获取与编码设置:
- 页面跳转与数据传递
- 转发跳转:使用
request.getRequestDispatcher().forward(request, response)
方法实现页面跳转,同时可通过request.setAttribute
和request.getAttribute
方法在不同资源(如Servlet和JSP)之间传递数据。在JSP中,可通过特殊符号<%%>
嵌入Java代码,request
是内置对象,可直接使用。数据传递时需注意先setAttribute
再跳转,否则无法取值。 - 重定向跳转:使用
response.sendRedirect
方法进行重定向跳转。重定向与转发的区别在于:操作对象不同,转发操作request
,重定向操作response
;浏览器地址栏变化不同,转发地址栏不变,重定向地址栏会改变;转发前后是同一个request
对象,重定向前后是两个不同的request
对象。因此,若通过request
进行数据传递,必须使用转发,重定向会导致数据无法取出。
- 转发跳转:使用
JavaWeb23-2:重定向时的数据传递、登录模块的实现、session
的应用、response
的功能以及JSP
与Servlet
的关系
- 重定向与数据传递:当使用重定向进行页面跳转且需要传递数据时,可借助
session
实现。因为session
的作用域大于request
,适用于多页面、多场景的数据共享。而request
通常用于简单业务查询场景下的数据存储与传递。 - 登录模块实现
- 页面与Servlet编写:创建
login.jsp
页面,使用form
表单收集用户名和密码,通过post
请求提交到loginServlet
。在loginServlet
中,模拟数据库验证用户名和密码,若验证失败,通过request.setAttribute
传递错误信息并转发回登录页面;若验证成功,则将用户名存入session
,并重定向到首页。 - 错误处理与优化:在登录页面展示错误信息时,起初通过复杂的Java代码判断和插入HTML代码实现,后引入
EL
表达式简化取值操作,EL
表达式不仅简化了request.getAttribute
的取值过程,还自动处理了非空校验。 - 枚举的应用:为规范错误信息返回,使用枚举定义错误信息。在实际开发中,枚举可统一管理给客户端返回的信息,方便团队协同开发,开发者只需调用枚举值,无需自行编写具体错误内容。
- 退出功能实现:在首页添加退出功能,通过
a
标签发起get
请求到logoutServlet
,在logoutServlet
中销毁session
并重定向回登录页面。
- 页面与Servlet编写:创建
response
的功能与应用:response.getWriter().write
方法可向浏览器输出内容。若要返回页面,可直接将页面源代码以字符串形式写入,但可能会遇到中文乱码问题,可通过response.setContentType("text/html;charset=utf - 8")
解决。然而,这种方式拼接字符串返回页面较为麻烦,由此引出JSP
的应用。JSP
与Servlet
的关系:JSP
本质上是一个Servlet
,是为了方便编写HTML代码而设计的模板。使用Servlet
返回HTML代码较为繁琐,而JSP
允许以开发HTML代码的形式编写程序,最终会自动转换成Servlet
,并将数据以response
的形式返回给客户端,大大简化了返回页面的操作。
JavaWeb24-1:涵盖数据库在程序中的作用、类型
- Web开发架构与各部分职责:Web开发主要由前端、后端和数据库组成,可能还会包含一些中间件。前端负责用户交互,追求美观简洁与良好的用户体验;后端负责处理业务逻辑,还需应对高并发、负载均衡等问题,工作压力大,岗位需求和薪资待遇相对较高;数据库负责持久化存储数据 。
- 数据库类型与主流选择:数据库分为关系型数据库和非关系型数据库。在Java开发中,MySQL是最主流的关系型数据库,超过95%的Java项目使用它。与Oracle相比,MySQL免费且性能差异不大。其他关系型数据库如SQL Server,主要用于微软的C#开发。
- 数据库管理工具:数据库是安装在电脑上的服务,需要数据库管理工具进行操作。常见的管理工具包括SQLyog(学生使用较多)、Navicat和DataGrip(公司使用较多)。DataGrip和IDEA是同一家公司产品,操作相似,使用起来更方便。当前MySQL主流版本是5和8,推荐使用8版本,若使用5版本需注意驱动版本匹配问题。
- SQL语言分类与数据库学习要点:SQL是用于管理数据库的编程语言,分为数据操作语言(DML,用于操作数据,如插入、修改、删除)、数据定义语言(DDL,用于创建、删除、修改数据库和数据表)、数据查询语言(DQL,用于查询数据)和数据控制语言(DCL,用于控制数据库组件的存取,如事务处理)。学习数据库需掌握基本使用(操作已有数据库)和设计数据库(根据项目需求设计表及表间关系),初级程序员主要掌握基本使用即可 。
- MySQL数据库操作
- 创建数据库:可以使用SQL语句或数据库管理工具创建数据库实例。使用SQL语句创建时,在DataGrip中通过右键选择“new” - “query console”进入查询控制台编写代码。创建数据库的基本语句是
create database
,为避免中文乱码问题,需设置默认编码集default characterset utf8
,还可设置校验字符集(如utf8_general_ci
不区分大小写排序,utf8_bin
区分大小写排序) 。 - 创建数据表:创建数据表的基本语法是
create table 表名(字段名称 数据类型, …)
,例如create table user(name varchar(20), id int)
。MySQL的数据类型丰富,包括整数类型(如tinyint
、smallint
、int
等)、浮点型(float
、double
)、日期类型(date
、datetime
、timestamp
)、字符串类型(varchar
、text
)和二进制类型(用于存储图片、视频等数据,如blob
系列),了解这些数据类型是创建字段的基础。
- 创建数据库:可以使用SQL语句或数据库管理工具创建数据库实例。使用SQL语句创建时,在DataGrip中通过右键选择“new” - “query console”进入查询控制台编写代码。创建数据库的基本语句是
JavaWeb24-2:MySQL数据库的表操作、SQL函数和运算符
- 数据表操作
- 创建表:根据数据类型创建数据表,如创建学生表
Student
,包含ID
(int
类型)、name
(varchar
类型)、成绩
(int
类型)等字段。 - 删除表:使用
drop table
语句删除数据表,例如drop table user
可删除user
表,操作时需谨慎。 - 修改表:通过
alter table
语句修改表结构,包括新增字段(如alter table student add sex varchar(2)
)、修改字段(如alter table student change sex gender int
)和删除字段(如alter table student drop gender
) 。
- 创建表:根据数据类型创建数据表,如创建学生表
- SQL函数
- 数学函数:
abs
用于求绝对值,如select abs(-20)
返回20;floor
返回小于参数的最大整数,如select floor(19.9)
返回19;ceil
返回大于参数的最小整数,如select ceil(19.01)
返回20。 - 字符串函数:
insert
用于替换字符串部分内容,upper
和lower
分别用于将字符串转大写和小写,left
、right
和substring
用于截取字符串,reverse
用于反序输出字符串。 - 日期函数:
curdate
获取当前日期,current_time
获取当前时间,now
获取当前日期和时间;datediff
计算两个日期之间相隔的天数,还能对日期进行加减运算,计算指定天数后的日期或之前的日期。 - 聚合函数:用于对数据进行统计操作。
count
统计数据记录数,sum
计算字段总和,avg
计算平均值,max
和min
分别求最大值和最小值。 - 分组查询:使用
group by
对数据进行分组统计,如统计租车表中每个客户的租车次数。还可结合order by
进行排序(asc
升序,desc
降序),以及使用having
添加筛选条件 。
- 数学函数:
- SQL运算符
- 算术运算符:包括加减乘除,用于对数据进行基本的数学运算,操作方式与Java中的算术运算类似。
- 比较运算符:用于比较数据大小关系,如判断成绩是否等于、大于或小于某个值,返回结果为
true
(1)或false
(0) 。 - 逻辑运算符:有与(
and
)、或(or
)、非(not
)运算,用于连接多个条件进行综合判断,逻辑与Java中的逻辑运算相同。 - 特殊运算符:
is null
用于判断字段是否为空,between...and...
用于判断值是否在某个区间内。
JavaWeb25-1:运算符、表设计(主键、外键)、数据关系及多表关联查询
- MySQL运算符
- in查询:用于判断值是否在特定区间内,如
select * from student where ID in (1,2,3)
可同时查询出ID为1、2、3的数据。 - 模糊查询:使用
like
关键字,通过%
匹配任意字符。如select * from student where name like '%三%'
可查询出名字中包含“三”的学生数据,在实际开发中应用广泛。
- in查询:用于判断值是否在特定区间内,如
- 表设计
- 主键:是表中的一个字段,其值是每一行数据的唯一标识,类似身份证号或学号。一般将主键设置为
ID
,类型为int
,并设置自增属性。添加主键时,在字段后使用primary key
关键字,设置自增则添加auto increment
关键字。自增可避免手动赋值的麻烦,确保主键值不重复。 - 外键:也是表中的字段,用于与其他表的主键建立约束关系,以保证业务逻辑的准确性。例如学生表中的班级编号字段作为外键,被班级表的主键约束,确保学生所属班级编号在班级表中存在。但外键会降低效率,一般项目开发中不使用,而是通过人为编写代码保证逻辑准确。
- 主键:是表中的一个字段,其值是每一行数据的唯一标识,类似身份证号或学号。一般将主键设置为
- 数据关系
- 一对一关系:如人和身份证的关系,一张表的一条数据只能对应另一张表的一条数据,反之亦然。实际开发中,一对一关系常优化为将两张表合并为一张表,以减少表关联的复杂性。
- 一对多关系:以学生和班级为例,一个学生只能属于一个班级,但一个班级可以有多个学生。这种关系通过主外键实现约束,在开发中较为常用。
- 多对多关系:例如学生选课,一个学生可以选多门课程,一门课程也可以被多个学生选择。实现多对多关系需要借助中间表,中间表包含两个主表的主键字段,通过记录两个主键的对应关系来维护多对多关系,避免了在主表中添加过多字段的问题。
- 多表关联查询
- 一对多查询:查询一对多关系的数据时,需要关联两张表,通过外键建立连接条件。如查询停车区一所有单车信息,需关联停车区表和单车表,以停车区表的
ID
和单车表的aid
作为连接条件。为简化查询,可给表设置别名。 - 多对多查询:查询多对多关系的数据时,要借助中间表进行间接关联。例如查询张三的选课信息,需关联学生表、课程表和中间表,通过设置连接条件筛选出相关数据,并可对查询结果的列名进行自定义。
- 一对多查询:查询一对多关系的数据时,需要关联两张表,通过外键建立连接条件。如查询停车区一所有单车信息,需关联停车区表和单车表,以停车区表的
JavaWeb25-2:MySQL数据库中索引、事务、视图、触发器和存储过程的概念、作用、使用方法及相关注意事项
- 索引
- 概念与作用:索引是一种特殊的数据库结构,可加快数据表特定记录的查询速度,类似于书的目录。它能提高数据库性能,但创建和维护索引会消耗时间并占用物理空间,因此需合理使用。
- 索引类型:包括普通索引(无限制条件,可在任意数据类型创建)、唯一索引(索引值必须唯一,主键自带索引)、全文索引(只能创建在文本类型字段上,用于大数据量字符串查询)、单列索引(对应一个字段)、多列索引(多个字段共同组成一个索引)和空间索引(只能建立在空间数据库上,如GIS相关应用)。
- 设计原则与操作:设计索引时,应在where语句中使用的列上添加索引,且索引值尽量唯一,避免添加过多索引。添加索引使用
alter table 表名 add index 索引名(字段名)
,删除索引使用alter table 表名 drop index 索引名
。
- 事务
- 概念:事务是将多条SQL语句作为一个整体,要么全部执行,要么一条都不执行。例如在转账场景中,涉及的多条修改语句必须同时成功或失败,否则会出现数据不一致问题。
- 特性:具有原子性(不可再分割)、一致性(执行前后数据总和等保持一致)、隔离性(一个事务的执行不被其他事务干扰)和持久性(事务提交后数据改变永久生效)。目前无法直接操作演示,后续学习相关知识后再进行演示。
- 视图
- 概念与作用:视图是数据库中的虚拟表,允许不同用户以不同方式查看同一张表的数据。例如在薪资管理场景中,可针对员工表创建不同视图,让普通员工和经理查看不同字段内容。
- 创建、使用与删除:创建视图使用
create view 视图名 as select语句
,使用视图直接进行查询,如select * from 视图名
,删除视图使用drop view 视图名
。
- 触发器
- 概念与作用:触发器定义了一系列操作,在对指定表进行插入、更新或删除操作时自动执行。例如可实现数据同步功能,提高开发效率,便于维护,且修改业务时只需修改触发器而无需修改业务代码。
- 创建与删除:创建触发器时,使用
create trigger 触发器名 after insert/delete/update on 表名 for each row
指定触发时机和目标表,在begin
和end
之间编写操作内容。删除触发器使用drop trigger 触发器名
。
- 存储过程
- 概念与作用:存储过程是一组为完成特定功能的SQL语句集合,经过编译存储在数据库中,用户通过指定名称和参数执行,类似于Java中的方法。其优点包括模块化程序设计、执行速度更快和更好的安全机制。
- 创建、调用与删除:创建存储过程使用
create procedure 存储过程名(参数列表)
,参数列表包含参数方向(如in
表示入参,out
表示出参)、参数名和参数类型,在begin
和end
之间编写逻辑。调用存储过程使用call 存储过程名(参数值)
,删除存储过程使用drop procedure 存储过程名
。存储过程功能比触发器更丰富,可编写逻辑、接收参数和返回值 。
JavaWeb26-1:JDBC的概念、原理、使用步骤以及相关代码实现
- JDBC概述
- 定义与作用:JDBC(Java Database Connectivity)是独立于特定数据库系统的通用数据库存取和操作公共接口,可用于多种数据库管理。它解决了Java程序连接不同数据库时频繁修改代码的问题,Java程序通过JDBC接口间接操作数据库,由JDBC将操作指令翻译为对应数据库能识别的语句。
- 组成部分:分为面向应用的API(供开发者调用,用于实现增删改查等操作)和面向数据库的API(供数据库厂商开发驱动程序,实现与具体数据库的连接和指令转换)。
- 接口分类及功能:包含
DriverManager
类(管理各种JDBC驱动)、Connection
接口(用于连接数据库)、Statement
接口(执行SQL语句)和ResultSet
接口(接收查询结果集) 。
- JDBC原理及操作步骤
- 原理:首先加载数据库驱动,驱动作为Java程序和数据库的桥梁,将JDBC接口方法转换为对应数据库的SQL语句。接着获取
Connection
连接对象,然后创建Statement
对象执行SQL语句,最后用ResultSet
接收执行结果。 - 代码实现步骤
- 加载驱动:将数据库驱动(如MySQL驱动
mysql - connector - java
)导入工程。在普通Java工程中,先在根目录创建lib
文件夹放入驱动包,再通过File - Project Structure - Libraries
添加驱动包到系统。 - 连接数据库:通过
DriverManager.getConnection(url, username, password)
方法获取Connection
对象,其中url
指定数据库位置(如jdbc:mysql://localhost:3306/mytest1
),username
和password
为数据库的用户名和密码。连接过程中可能出现数据库名称错误(抛Unknown database
异常)、用户名或密码错误(抛using password. Yes
相关异常)、未导入驱动(抛相应异常)等问题 。 - 执行操作
- 增删改操作:使用
Statement
的executeUpdate
方法执行SQL的增删改语句。如添加数据时,可直接将参数写在SQL语句中,也可用占位符?
代替,执行前通过setXxx
方法(如setString
、setInt
等)根据参数类型替换占位符。executeUpdate
方法返回值为影响的行数,返回1表示操作成功 。 - 查询操作:使用
Statement
的executeQuery
方法执行查询SQL语句,该方法返回ResultSet
结果集。通过ResultSet
的next
方法判断结果集是否有数据,若有则可用getXxx
方法(如getInt
、getString
)根据列名或列下标获取数据 。
- 增删改操作:使用
- 加载驱动:将数据库驱动(如MySQL驱动
- 原理:首先加载数据库驱动,驱动作为Java程序和数据库的桥梁,将JDBC接口方法转换为对应数据库的SQL语句。接着获取
JavaWeb26-2:查询结果处理、事务处理、数据库连接池以及dbUtils
工具的使用与原理
- JDBC查询结果处理:当查询多条数据时,不能仅用
if
语句判断,需使用while
循环遍历ResultSet
结果集,确保获取所有数据。例如查询person
表所有数据时,while (resultSet.next())
可逐行获取数据,避免只取到第一条数据的情况。 - JDBC事务处理:以张三和李四转账为例,在JDBC中处理事务时,先关闭
connection
的自动提交(connection.setAutoCommit(false)
),执行多条SQL语句(如修改两人账户金额)。若执行过程中无异常,则手动提交事务(connection.commit()
);若出现异常(如人为制造10/0
错误),则在catch
块中进行回滚(connection.rollback()
),确保数据一致性,避免数据错误。 - 数据库连接池(以c3p0为例)
- 概念与作用:数据库连接池旨在解决每次向数据库申请连接、验证用户名密码后又丢弃连接导致的资源浪费问题。它基于池化思想,预先创建多个连接对象,供程序重复使用,提高资源利用率,类似线程池和字符串常量池。
- 使用方法:使用
c3p0
连接池时,先导入其相关jar包。在代码中创建ComboPooledDataSource
对象,设置驱动(setDriverClass
)、url
(setJdbcUrl
)、用户名(setUser
)、密码(setPassword
)等基本参数,还可设置初始化连接数(如setInitialPoolSize
)、最大连接数(setMaxPoolSize
)、最小连接数(用于补充连接,setMinPoolSize
)和每次增加的连接数(setAcquireIncrement
)。通过dataSource.getConnection()
获取连接对象,后续操作与普通JDBC操作类似 。
dbUtils
工具- 工具作用:
dbUtils
是对JDBC的封装,可简化数据查询和封装过程。使用原生JDBC查询数据时,需手动解析结果集并拼接成Java对象,步骤繁琐,而dbUtils
工具可自动进行数据封装。 - 使用方法:先导入
dbUtils
相关jar包。使用时,创建QueryRunner
对象,调用其query
方法。传入连接对象、SQL语句、用于接收结果的类型(如BeanHandler
或BeanListHandler
,取决于查询一条还是多条数据)以及查询参数(若有)。例如查询person
表中ID为1的数据,可创建person
类接收结果,调用query
方法返回person
对象;查询全部数据时,使用BeanListHandler
返回包含多个person
对象的集合 。 - 实现原理:
query
方法首先对传入的连接对象、SQL语句和结果处理对象进行非空校验。接着利用JDBC创建PreparedStatement
对象、填充参数、执行查询并获取ResultSet
结果集。关键在于将ResultSet
解析并封装成Java对象,这由传入的结果处理对象(如BeanHandler
)完成。BeanHandler
通过反射机制,根据Java类的属性和结果集的列名进行匹配赋值,将结果集数据填充到Java对象中。若列名不匹配(如修改person
类中字段名),则对应字段无法赋值 。
- 工具作用:
JavaWeb27-1:手写dbUtils
的工具类
阐述了工具类的设计思路、实现过程和关键代码逻辑
- 分析
dbUtils
工具实现流程:dbUtils
工具通过定义QueryRunner
类的query
方法进行查询操作。该方法接收连接对象、SQL语句、处理器(用于将ResultSet
转换为Java对象)和SQL语句参数这四个参数。在方法内部,先对前三个参数进行非空校验,然后使用JDBC进行SQL查询,填充参数获取结果集,最后调用处理器的handle
方法将结果集解析为对应的Java对象并返回 。 - 手写工具类实现过程
- 定义类和方法:创建
MicroRunner
类并定义query
方法,query
方法使用泛型T
,其返回类型由传入的泛型决定。方法接收Connection
对象、SQL语句、ResultSetHandler<T>
处理器和可变参数Object... params
。 - 参数非空校验:对
Connection
对象、SQL语句和处理器进行非空校验,若为空则抛出自定义异常MyException
,继承自RuntimeException
。 - 使用JDBC查询并处理参数:通过
Connection
对象获取PreparedStatement
对象。根据传入的可变参数数组长度,循环遍历数组,判断每个参数的类型,使用相应的setXxx
方法(如setInt
、setString
)将参数值设置到PreparedStatement
中。处理完参数后,执行executeQuery
方法获取结果集ResultSet
。 - 将结果集转换为Java对象:定义
MyBeanHandler<T>
类实现ResultSetHandler<T>
接口,在handle
方法中通过反射机制实现结果集到Java对象的转换。首先在构造函数中接收一个Class<T>
类型的参数type
,用于确定要返回的Java对象类型。在handle
方法中,使用type.newInstance()
创建该类型的对象t
。然后遍历结果集,根据结果集的列名和Java对象的属性名进行匹配赋值,将结果集中的数据填充到Java对象中。 - 测试与验证:编写测试代码,创建连接对象、SQL语句并调用
MicroRunner
的query
方法,传入相应参数。通过断点调试,逐步验证参数替换、结果集获取以及结果集转换为Java对象的过程是否正确,确保工具类的功能符合预期 。
- 定义类和方法:创建
JavaWeb27-2:手写类似dbUtils
工具类数据填充、结果集为空处理、查询多条数据的实现以及工具类通用性测试
- 数据填充与匹配:通过反射机制获取实体类的属性(
type.getDeclaredFields
)和结果集的字段(resultSet.getMetaData
)。对两者进行循环嵌套遍历,对比属性名和字段名,若匹配则根据字段类型从结果集中取值(使用resultSet.getXXX
方法,如getInt
、getString
)。将取到的值赋给实体类的对应属性,通过拼接属性名生成set
方法名(属性首字母大写加set
前缀 ),再利用反射获取set
方法(type.getDeclaredMethod
)并调用,完成数据填充。在这个过程中,需要注意resultSet.next()
方法只能调用一次,否则会导致数据获取错误,经过多次调整if (resultSet.next())
的位置,最终确保能正确获取并填充所有字段的值。 - 处理结果集为空情况:参考原工具类的写法,在获取结果集后,增加判断
if (resultSet.next() == false)
,若结果集为空则直接return null
,避免返回属性为空的对象。若结果集有数据,则正常解析数据。这样完善了工具类对不同查询结果的处理逻辑。 - 查询多条数据的实现:当查询多条数据时,原
BeanHandler
只能解析单个数据,因此定义新的MyBeanListHandler
类实现ResultSetHandler
接口来处理集合数据。在MyBeanListHandler
的handle
方法中,创建一个ArrayList
集合用于存储解析后的对象。通过while (resultSet.next())
循环,每次循环创建一个新的对象(使用type.newInstance()
),并复用之前单条数据解析时的数据填充代码,将结果集中的数据填充到新对象中,再将对象添加到集合中,最后返回该集合。 - 工具类通用性测试:对编写的工具类进行多种情况的测试,包括查询单条数据、多条数据以及查询不存在的数据等情况。同时,更换不同的表(如
student
表)进行测试,创建对应的实体类(包含与表字段对应的属性及getter
、setter
方法和toString
方法 ),验证工具类的通用性。测试结果表明,该工具类能够正确处理不同表的单条和多条数据查询,以及对不存在数据的查询(返回null
),具备了基本的功能。
相关文章:
JavaWeb(楠)
JavaWeb21-1:Java Web开发的地位、Tomcat服务器 Java Web开发概述 主流地位:Java可用于移动端、桌面应用、机器学习等多个领域,但在Web开发领域优势显著,是Java最主流的研发方向。市场上95%以上的Web端开发都使用Java,…...
批量将 JSON 转换为 Excel/思维导入等其它格式
json 格式相信对大家来说都不陌生,这是一种轻量级的结构化数据,可以对对象进行描述。json 格式也是一种普通的文本文件格式,用记事本就能够打开编辑 json 格式的文件,可以很方便的转换为其他格式。今天要给大家介绍的就是如何将 j…...
C# Winform 入门(13)之通过WebServer查询天气预报
展示 控件 添加WebServer 右键项目> 添加引用> 添加服务引用 天气预报URL: WeatherWebService Web 服务WeatherWebService Web 服务http://www.webxml.com.cn/WebServices/WeatherWebService.asmx 查询按钮实现 private void btn_Inquiry_Click(object sender, EventA…...
算法思想之滑动窗口(一)
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之滑动窗口(一) 发布时间:2025.4.6 隶属专栏:算法 目录 滑动窗口算法介绍核心思想时间复杂度适用场景注意事项 例题长度最小的子数组题目链接题目描述算法思路代码实现 无重复字符的…...
爬虫工程师无意义的活
30岁的年龄;这个年龄大家都是成年人;都是做父母的年龄了;你再工位上的心态会发生很大变化的; 爬虫工程师基本都是如此;社会最low的一帮连销售都做不了的;单子都开不出来的然后转行做爬虫工程师的;这样的人基本不太和社会接触; 你作为爬虫初级工程师就敲着键盘然后解析着html;…...
DeepSeek 关联公司公布新型数据采集专利 提升数据采集效率与质量
4 月 1 日,国家知识产权局公布了一项由 DeepSeek 关联公司杭州深度求索人工智能基础技术研究有限公司申请的专利,名为 “一种广度数据采集的方法及其系统”,公开号为 CN 119739917 A,申请日期可追溯至 2024 年 12 月。此专利的发布…...
实际犯错以及复盘1
Ds1302 需要两个 一个Set_Rtc 一个Read_Rtc : 本质 read是 85-2i 的 写入是84-2i 然后 写入的时候 是需要对 0x8e 进行 0x00 和0x80进行解开和 锁定的开头结尾。 使用的时候 赋值给ucRtc[i] 然后 主函数使用的时候 需要直接写个(ucRtc) 因为unsigned char* 默认的…...
初探:简道云系统架构及原理
一、系统架构概述 简道云作为一款低代码开发平台,其架构设计以模块化和云端协同为核心,主要分为以下层次: 1. 前端层 可视化界面:基于Web的拖拽式表单设计器,支持动态渲染(React/Vue框架)。多…...
Nginx负载均衡时如何为指定ip配置固定服务器
大家在用Nginx做负载均衡时,一般是采用默认的weight权重指定或默认的平均分配实现后端服务器的路由,还有一种做法是通过ip_hash来自动计算进行后端服务器的路由,但最近遇到一个问题,就是希望大部分用户采用ip_hash自动分配后端服务…...
玩转MCP:用百度热搜采集案例快速上手并接入cline
MCP的大火,让MCP服务器开发也变得热门,上一篇文章: 手搓MCP客户端&服务端:从零到实战极速了解MCP是什么? 手搓了一个极其简单的小场景的MCP实战案例,详细的安装环境及操作步骤已经讲过了,本文不在重复…...
003集——《利用 C# 与 AutoCAD API 开发 WPF 随机圆生成插件》(侧栏菜单+WPF窗体和控件+MVVM)
本案例聚焦于开发一款特色鲜明的 AutoCAD 插件。其核心功能在于,用户在精心设计的 WPF 控件界面中输入期望生成圆的数量,完成输入后,当用户点击 “生成” 按钮,一系列联动操作随即展开。通过数据绑定与命令绑定这一精妙机制&#…...
设计模式简述(十)责任链模式
责任链模式 描述基本使用使用 描述 如果一个请求要经过多个类似或相关处理器的处理。 可以考虑将这些处理器添加到一个链上,让请求逐个经过这些处理器进行处理。 通常,在一个业务场景下会对整个责任链进行初始化,确定这个链上有哪些Handler…...
分组(二分查找)
#include <bits/stdc.h> using namespace std; const int N1e55; int a[N]; int n,k;bool f(int x){int num1;int ma[1];for(int i2;i<n;i){if(a[i]-m>x){ // 当前元素加入当前组会超过极差 xnum; // 新开一组ma[i]; // 新组的最小值设为当前元素}}r…...
vue的主要核心文件介绍
1.package.json 查看依赖包的版本 项目基本信息记录 项目标识:记录项目名称(name 字段)、版本号(version 字段)、描述(description 字段)等基础信息,方便识别和管理项目。例如&…...
从奖励到最优决策:动作价值函数与价值学习
从奖励到最优决策:动作价值函数与价值学习 价值学习动作价值函数对 U t U_t Ut求期望得到动作价值函数动作价值函数的意义最优动作价值函数(Optimal Action-Value Function)如何理解 Q ∗ Q^* Q∗函数 价值学习的基本思想Deep Q-Network(DQN)DQN玩游戏的具体流程如…...
DApp实战篇:先用前端起个项目
前言 本篇将使用vue框架quasar起一个项目,为了防止大家不会使用quasar,本篇详细讲解一下quasar如何使用。 quasar 如果你不想深入了解quasar,其实你完全可以将quasar当成一个vue的组件库即可,它是一个类谷歌Material风格的UI组件库,但同时它又是一个基于vue的强大框架。…...
论文阅读11——V2V-LLM:采用多模式大型语言模型的车对车协同自动驾驶
原文地址: 2502.09980https://arxiv.org/pdf/2502.09980 论文翻译: V2V-LLM: Vehicle-to-Vehicle Cooperative Autonomous Driving with Multi-Modal Large Language Models V2V-LLM:采用多模式大型语言模型的车对车协同自动驾驶 摘要&#…...
NLP 梳理01 — 文本预处理和分词
文章目录 一、说明二、文本预处理概述2.1 为什么要预处理文本?2.2 文本预处理的常见步骤2.3 什么是令牌化?2.4 为什么令牌化很重要? 三、分词类型四、用于分词化的工具和库五、实际实施六、编写函数以对文本进行标记七、结论 一、说明 本文总…...
Windows11 优雅的停止更新、禁止更新
网上有很多关闭自动更新的方法,改注册表、修改组策略编辑器、禁用Windows Update等等,大同小异,但最后奏效的寥寥无几,今天给大家带来另一种关闭win11自动更新的方法,亲测有效! 1、winR 打开运行窗口&…...
Kafka 中的 offset 提交问题
手动提交和自动提交 我们来一次性理清楚:Kafka 中的自动提交 vs 手动提交,到底区别在哪,怎么用,什么场景适合用哪个👇 🧠 一句话总结 ✅ 自动提交:Kafka 每隔一段时间自动提交 offset ✅ 手动…...
PowerBI窗口函数与视觉计算
文章目录 一、 窗口函数1.1 OFFSET(动态查询、求连续值)1.1.1 不使用orderBy1.1.2 使用orderBy1.1.3 统计连续值的最大出现次数(待补) 1.2 INDEX(静态查询)1.3 WINDOW(滚动求和、累计求和、帕累…...
代码随想录算法训练营Day22
回溯知识 力扣77.组合【medium】 一、回溯知识 1、定义 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。 2、回溯法的效率 回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案…...
几种常见的HTTP方法之GET和POST
如大家所了解的,每条 HTTP 请求报文都必须包含一个请求方法,这个方法会告诉服务器要执行什么操作(例如获取一个 Web 页面、运行一个网关程序、删除一个文件等)。常见的几种 HTTP 方法如下: GET: 请求指定的…...
Nginx之https重定向为http
为了将Nginx中443端口的请求重定向到80端口,你可以按照以下步骤进行操作: 确认Nginx已经正确安装并运行: 确保Nginx服务已经在你的系统上安装并运行。你可以通过运行以下命令来检查Nginx的状态(具体命令可能因操作系统而异&a…...
落地DevOps文化:运维变革的正确打开方式
落地DevOps文化:运维变革的正确打开方式 DevOps,这个近年来被谈论得沸沸扬扬的概念,是企业数字化转型的一把钥匙。然而,很多公司虽然喊着“要上DevOps”,却苦于如何真正落地。而DevOps不仅仅是技术工具的堆砌,更是一种文化的重塑。从我的经历来看,DevOps实施的核心在于…...
《C++后端开发最全面试题-从入门到Offer》目录
当今科技行业对C++开发者的需求持续高涨,从金融科技到游戏开发,从嵌入式系统到高性能计算,C++凭借其卓越的性能和灵活性始终占据着关键地位。然而,成为一名优秀的C++工程师并非易事,不仅需要扎实的语言基础,还要掌握现代C++特性、设计模式、性能优化技巧以及各种工业级开…...
24统计建模国奖论文写作框架2(机器学习+自然语言处理类)(附原文《高校负面舆情成因与演化路径研究》)
一、引言 研究背景及意义 文献综述 研究内容与创新点 二、高校负面舆情热点现状分析 案例数据的获取与处理 高效负面舆情热点词频分析 高效负面舆情热点变化趋势分析 三、高校负面舆情成因分析 高校负面舆情变量的选取与赋值 基于QCA方法的高校负面舆情成因分析 四、…...
论文阅读笔记——Deformable Radial Kernel Splatting
DRK 论文 DRK(可变形径向核)的核心创新正是通过极坐标参数化与切平面投影,对传统3D高斯泼溅(3D-GS)进行了多维度的优化。 传统 3DGS 依赖径向对称的高斯核,只能表示平滑、各向同性的形状(球体、…...
网络编程—TCP/IP模型(IP协议)
上篇文章: 网络编程—TCP/IP模型(TCP协议)https://blog.csdn.net/sniper_fandc/article/details/147011479?fromshareblogdetail&sharetypeblogdetail&sharerId147011479&sharereferPC&sharesourcesniper_fandc&sharef…...
Android NDK C/C++交叉编译脚本
以下是 Android (arm64-v8a) 交叉编译 C/C 项目的完整脚本模板,基于 NDK 工具链,支持自定义源文件编译为静态库/动态库/可执行文件: 1. 基础交叉编译脚本 (build_android.sh) bash 复制 #!/bin/bash# Android 交叉编译脚本 (arm64-…...
IS-IS-单区域的配置
一、IS-IS的概念 IS-IS(Intermediate System to Intermediate System,中间系统到中间系统)是一种链路状态路由协议,最初设计用于OSI(Open Systems Interconnection)参考模型的网络层(CL…...
Java EE期末总结(第四章)
目录 一、ORM框架 二、MyBatis与Hibernate 1、 概念与设计理念 2、SQL 控制 3、学习成本 4、开发效率 三、MyBatisAPI 1、SqlSessionFactoryBuilder 2、SqlSessionFactory 3、SqlSession 四、MyBatis配置 1、核心依赖与日志依赖 2、建立.XML映射文件 3、建立映射…...
Kafka 的选举机制
Kafka 的选举机制在 Zookeeper 模式 和 KRaft 模式 下有所不同,主要体现在 领导选举 和 集群元数据管理 的方式上。下面详细介绍这两种模式下 Kafka 如何进行选举机制。 1. Zookeeper 模式下的选举机制 在早期的 Kafka 架构中,集群的元数据管理和选举机…...
FreeRTOS移植笔记:让操作系统在你的硬件上跑起来
一、为什么需要移植? FreeRTOS就像一套"操作系统积木",但不同硬件平台(如STM32、ESP32、AVR等)的CPU架构和外设差异大,需要针对目标硬件做适配配置。移植工作就是让FreeRTOS能正确管理你的硬件资源。 二、…...
设计模式简述(十二)策略模式
策略模式 描述基本使用使用传统策略模式的缺陷以及规避方法 枚举策略描述基本使用使用 描述 定义一组策略,并将其封装起来到一个策略上下文中。 由调用者决定应该使用哪种策略,并且可以动态替换 基本使用 定义策略接口 public interface IStrategy {…...
如何在idea中快速搭建一个Spring Boot项目?
文章目录 前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热启动(热部署)结语 前言 Spring Boot 凭借其便捷的开发特性,极大提升了开发效率,为 Java 开发工作带来诸多便利。许多大伙伴希望快速…...
【注解简化配置的原理是什么】
注解(Annotation)简化配置的核心原理是将原本分散在外部文件(如XML、properties)中的元数据直接内嵌到代码中,通过声明式编程让框架或工具自动处理这些元数据,从而减少手动配置的复杂度。以下是其实现原理的…...
Livox-Mid-70雷达使用------livox_mapping建图
1.ubuntu20.04 和Livox mid 70 的IP设置 连接好Livox-Mid-70雷达,然后进行局域网配置 1.1 Livox mid 70的IP是已知的,即192.168.1.1XX, XX表示mid 70广播码的后两位 1.2 ubuntu 20.04的IP设置 a.查看本机IP名 ifconfig b.设置本机IP地址 sudo ifconfig enx00e04…...
Django中使用不同种类缓存的完整案例
Django中使用不同种类缓存的完整案例 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 Django中使用不同种类缓存的完整案例步骤1:设置Django项目步骤2:设置URL路由步骤3:视图级别…...
代码随想录算法训练营Day32| 完全背包问题(二维数组 滚动数组)、LeetCode 518 零钱兑换 II、377 组合总数 IV、爬楼梯(进阶)
理论基础 完全背包问题 在完全背包问题中,每种物品都有无限个,我们可以选择任意个数(包括不选),放入一个容量为 W W W 的背包中。我们希望在不超过容量的情况下,最大化背包内物品的总价值。 完全背包&a…...
Django SaaS案例:构建一个多租户博客应用
Django SaaS案例:构建一个多租户博客应用 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 Django SaaS案例:构建一个多租户博客应用如果你正在从事一个SaaS(软件即服务)项目或一…...
静态库与动态库
静态库(Static Library) 定义:静态库(如 .a 文件或 .lib 文件)是编译时直接链接到可执行文件中的库。其代码和数据会被完整复制到最终的可执行文件中。 特点: 独立部署:无需依赖外部库文件。 …...
优选算法的妙思之流:分治——归并专题
专栏:算法的魔法世界 个人主页:手握风云 目录 一、归并排序 二、例题讲解 2.1. 排序数组 2.2. 交易逆序对的总数 2.3. 计算右侧小于当前元素的个数 2.4. 翻转对 一、归并排序 归并排序也是采用了分治的思想,将数组划分为多个长度为1的子…...
PDFBox渲染生成pdf文档
使用PDFBox可以渲染生成pdf文档,并且自定义程度高,只是比较麻烦,pdf的内容位置都需要手动设置x(横向)和y(纵向)绝对位置,但是每个企业的单据都是不一样的,一般来说都会设…...
flutter dio网络请求与json数据解析
在Flutter中,Dio 是一个功能强大且易于使用的网络请求库,用于处理HTTP请求和响应。与 http 包相比,Dio 提供了更多高级功能,例如拦截器、文件上传/下载、请求取消等。结合 json_serializable 或手动解析 JSON 数据,可以…...
7. RabbitMQ 消息队列——延时队列(Spring Boot + 安装message_exchange“延迟插件“ 的详细配置说明)的详细讲解
7. RabbitMQ 消息队列——延时队列(Spring Boot 安装message_exchange"延迟插件" 的详细配置说明)的详细讲解 文章目录 7. RabbitMQ 消息队列——延时队列(Spring Boot 安装message_exchange"延迟插件" 的详细配置说明)的详细讲解1. RabbitMQ 延时队列概…...
使用 MyBatis-Plus 实现高效的 Spring Boot 数据访问层
在开发 Spring Boot 应用时,数据访问是不可或缺的部分。为了提高开发效率并减少样板代码,MyBatis-Plus 提供了强大的功能,能够简化与数据库交互的操作。本文将详细介绍如何在 Spring Boot 中使用 MyBatis-Plus,并结合具体代码示例…...
Linux学习笔记——零基础详解:什么是Bootloader?U-Boot启动流程全解析!
零基础详解:什么是Bootloader?U-Boot启动流程全解析! 一、什么是Bootloader?📌 举个例子: 二、U-Boot 是什么?三、U-Boot启动过程:分为两个阶段🔹 第一阶段(汇…...
网络初识 - Java
网络发展史: 单机时代(独立模式) -> 局域网时代 -> 广域网时代 -> 移动互联网时代 网络互联:将多台计算机链接再一起,完成数据共享。 数据共享的本质是网络数据传输,即计算机之间通过网络来传输数…...
(51单片机)独立按键控制流水灯LED流向(独立按键教程)(LED使用教程)
源代码 如上图将7个文放在Keli5 中即可,然后烧录在单片机中就行了 烧录软件用的是STC-ISP,不知道怎么安装的可以去看江科大的视频: 【51单片机入门教程-2020版 程序全程纯手打 从零开始入门】https://www.bilibili.com/video/BV1Mb411e7re?…...