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
),具备了基本的功能。