1、开发一个数据库的流程是怎样的?
1.需求分析
2.数据库设计
3.数据库建模
4.数据库开发
5.数据库测试在这里插入代码片
6.数据库部署
7.数据库的维护和优化
2、怎么建库,建表?
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
)comment(表注解);
3、约束有哪些,什么含义?
NOT NULL 非空约束 字段内容不能为空
UNIQUE 唯一约束 保证该字段的所有数据都是唯一、不重复的
PRIMARY KEY 主键约束 主键是一行数据的唯一标识,要求非空且唯一
DEFAULT 默认约束 保存数据时,如果未指定该字段的值,则采用默认值
FOREIGN KEY 外键约束 用来让两张表的数据之间建立连接,保证数据的完整性
4、操作数据insert into, update, delete
INSERT INTO 表名 (列1, 列2, 列3, …) VALUES (值1, 值2, 值3, …);
UPDATE 表名 SET 列1 = 值1, 列2 = 值2, … WHERE 条件;
DELETE FROM 表名 WHERE 条件;
5、SpringBoot中用过哪些注解,有什么作用?
@SpringBootApplication:标注主类,表示这是一个Spring Boot应用程序的入口点。
@RestController:将类标记为控制器,用于处理HTTP请求并返回响应。
@RequestMapping:将HTTP请求映射到控制器方法,并指定URL路径和请求方法。
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping:用于指定HTTP请求的方法类型,分别对应GET、POST、PUT、DELETE请求。
@RequestParam:用于从请求参数中获取值。
@PathVariable:用于从URL路径中获取值。
@RequestBody:用于将请求体中的JSON或XML数据绑定到方法参数上。
@Autowired:用于自动装配依赖,将其他Bean注入到当前Bean中。
@Service、@Repository、@Component:分别用于标注服务层、数据访问层和通用组件。
@Configuration:标注配置类,用于定义配置信息或创建Bean。
@Value:用于从配置文件中获取属性值。
@Valid、@Validated:用于参数校验,保证参数的合法性。
6、后端开发中三层架构是哪些,各自负责什么?
● Controller:接收前端发送的请求,对请求进行处理,并响应数据
● Service:处理具体的业务逻辑
● Dao:负责数据的访问操作,包含数据的增、删、改、查
7、前端和后端传参有哪些形式
1.form表单提交
在后台可通过对应的name属性获取相应的值。
from表单中的action属性标识提交数据的地址。
method属性指明表单提交的方式
2.JQuery中的ajax提交
$.ajax({
url: "TestJsonServlet", //提价的路径
type: "post", //提交方式
data: {
//向后台提交的数据
},
dataType: "JSON", //规定请求成功后返回的数据
success: function (data) {
//请求成功之后进入该方法,data为成功后返回的数据
},
error: function (errorMsg) {
//请求失败之后进入该方法,errorMsg为失败后返回的错误信息
}
});
3.通过url字符串拼接向后台提交数据
1.直接在ajax中url拼接数据
2.JS提交数据,通过window.location.href指定路径提交数据
3.通过a标签提交数据,通过a标签的href属性提交数据,和js提交数据类似。
4.在后台中也可以互相访问相应的Servlet
然后在对应的Servlet中接受参数,进行相应的处理
8、IOC,DI
IOC(控制反转):
IOC是一种设计原则,它将对象的创建、管理和控制权从应用程序代码中转移到容器或框架中。
传统的编程模式中,对象的创建和依赖关系的管理通常由开发者手动完成,而在IOC中,这些工作由容器自动完成。
IOC的核心思想是将对象的创建和依赖关系的管理交给容器,应用程序只需要关注业务逻辑的实现。
DI(依赖注入):
DI是IOC的一种实现方式,它是指通过外部注入的方式,将一个对象所依赖的其他对象(依赖)传递给它。
依赖注入可以通过构造函数、方法参数、属性注入等方式实现。
通过依赖注入,对象不需要自己创建或管理它所依赖的对象,而是由容器负责创建和注入依赖对象
9、控制反转用哪些注解实现,DI用什么注解实现。
控制反转(IOC)的注解:
@Component:标记一个类为组件,由容器进行管理。
@Service:标记一个类为服务层组件。
@Repository:标记一个类为数据访问层组件。
@Controller:标记一个类为控制器组件。
@Configuration:标记一个类为配置类,用于定义Bean的创建和依赖关系。
依赖注入(DI)的注解:
@Autowired:自动装配依赖对象,可以用于构造函数、方法参数、属性等位置。
@Qualifier:指定具体的依赖对象,用于解决多个候选对象的自动装配。
@Resource:类似于@Autowired,但更加灵活,可以通过名称或类型进行注入。
@Value:注入简单类型的值,如字符串、数字等。
10、Vue是什么,ElementUI什么、Nginx是什么
Vue是一种用于构建用户界面的渐进式JavaScript框架。
Vue具有简洁的API和易于理解的语法,使开发者能够快速构建交互性的Web应用程序。
Vue采用组件化的开发方式,将页面拆分为多个可重用的组件,使代码更加模块化和可维护。
Vue具有响应式的数据绑定和虚拟DOM的更新机制,能够高效地渲染页面,并提供了丰富的生命周期钩子函数和插件系统,方便开发者进 行扩展和定制。
ElementUI:
ElementUI是一个基于Vue的UI组件库,提供了丰富的可复用的组件,用于快速构建漂亮的Web界面。
ElementUI的组件包括按钮、表单、表格、弹窗、导航菜单等,涵盖了常见的UI交互元素。
ElementUI具有简洁的设计和易于使用的API,使开发者能够快速搭建用户友好的界面。
ElementUI还提供了自定义主题和国际化支持,方便开发者根据项目需求进行定制。
Nginx:
Nginx是一个高性能的开源Web服务器和反向代理服务器。
Nginx具有轻量级、高并发、低内存消耗的特点,适用于处理静态资源、负载均衡、反向代理、缓存等场景。
Nginx支持多线程异步处理请求,能够高效地处理大量并发请求。
Nginx还具有灵活的配置和模块化的架构,可以通过配置文件进行灵活的定制和扩展。
由于其高性能和可靠性,Nginx被广泛应用于Web服务器和反向代理服务器,被许多大型网站和应用程序所采用。
11、三剑客?
HTML(HyperText Markup Language,超文本标记语言):
HTML是一种用于描述网页结构的标记语言。
通过使用HTML标签和元素,可以定义网页的各种内容,如标题、段落、链接、图像等。
HTML提供了一种结构化的方式来组织和呈现网页内容。
CSS (Cascading Style Sheets,层叠样式表):
CSS是一种用于描述网页样式和布局的样式表语言。
通过使用CSS选择器和属性,可以定义网页元素的外观、颜色、大小、位置等样式。
CSS使得开发者能够将样式和布局与HTML内容分离,提高了代码的可维护性和灵活性。
JavaScript:
JavaScript是一种用于为网页添加交互性和动态功能的脚本语言。
通过使用JavaScript,可以对网页进行事件处理、表单验证、动态内容更新等操作。
JavaScript可以让网页与用户进行交互,并实现复杂的功能和效果。
12、CSS 选择器有哪些**
元素选择器:
element:选择指定元素类型的所有元素。例如,p选择所有
元素。
类选择器:
.class:选择具有指定类名的所有元素。例如,.container选择所有类名为container的元素。
ID选择器:
#id:选择具有指定id的唯一元素。例如,#header选择id为header的元素。
属性选择器:
[attribute]:选择具有指定属性的元素。例如,[type]选择所有具有type属性的元素。
[attribute=value]:选择具有指定属性和值的元素。例如,[type=text]选择所有type属性值为text的元素。
[day08 DQL,多表设计]
1、DQL是什么?
DQL(Data Query Language)是一种用于查询数据库中数据的语言。
SELECT:用于从数据库中选择特定的列或数据。
FROM:用于指定查询的数据表或视图。
WHERE:用于设置查询的条件,过滤符合条件的数据。
GROUP BY:用于按照指定的列对数据进行分组。
HAVING:用于设置对分组后的数据进行过滤的条件。
ORDER BY:用于对查询结果进行排序。
LIMIT:用于限制查询结果的数量。
2、查询语句的完整格式是怎样的?
SELECT 列名1, 列名2, … FROM 表名 WHERE 条件表达式 GROUP BY 列名 HAVING 条件表达式 ORDER BY 列名 ASC/DESC LIMIT 数量;
3、条件查询的关键字是什么,常见的运算符有哪些?
条件查询在SQL中使用WHERE子句来指定查询的条件。WHERE子句可以使用多种运算符来构建条件表达式,常见的运算符包括:
等于:=,用于判断两个值是否相等。
不等于:<>或!=,用于判断两个值是否不相等。
大于:>,用于判断一个值是否大于另一个值。
小于:<,用于判断一个值是否小于另一个值。
大于等于:>=,用于判断一个值是否大于或等于另一个值。
小于等于:<=,用于判断一个值是否小于或等于另一个值。
BETWEEN…AND…:用于判断一个值是否在某个范围内。
LIKE:用于模糊匹配,可以使用通配符%表示任意字符,表示任意单个字符。
IN:用于判断一个值是否在给定的值列表中。
NOT:用于否定一个条件。
4、如何实现模糊查询?
在SQL中,可以使用LIKE运算符来实现模糊查询。LIKE运算符用于在条件表达式中进行模式匹配,常用于字符串的模糊匹配。
LIKE运算符可以与通配符一起使用,常见的通配符有两种
百分号(%):表示任意字符(包括零个字符或多个字符)。
下划线():表示任意单个字符
5、怎么实现排序查询?
在SQL中,可以使用ORDER BY子句来实现排序查询
SELECT 列名1, 列名2, ...
FROM 表名
ORDER BY 列名1 [ASC|DESC], 列名2 [ASC|DESC], ...
6、怎么实现分页查询?
在SQL中,可以使用LIMIT子句来实现分页查询。
SELECT 列名1, 列名2, ...
FROM 表名
LIMIT 起始位置, 记录数量;
7、分页查询中怎么计算某一页开始索引?
起始索引 = (页码 - 1) * 每页记录数
8、怎么实现分组查询,分组查询的目的是什么?
在SQL中,可以使用GROUP BY子句来实现分组查询
SELECT 列名1, 列名2, ...
FROM 表名
GROUP BY 列名1, 列名2, ...;
9、聚合函数有哪些?
COUNT:计算某列的非空值数量。
SUM:计算某列的数值总和。
AVG:计算某列的数值平均值。
MAX:获取某列的最大值。
MIN:获取某列的最小值
10、怎么实现给查询的值设定新的数据:比例 1变成男,2变成女
在SQL中,可以使用CASE语句来实现给查询的值设定新的数据
SELECT 列名,
CASE 列名
WHEN 1 THEN '男'
WHEN 2 THEN '女'
ELSE 列名
END AS 新列名
FROM 表名;
11、表和表之间有哪些关系?
一对一,一对多,多对多
12、不同关系怎么设计外键
一对一关系(One-to-One Relationship):可以在任意一方的表中添加一个外键,指向另一方的主键。这样可以确保每个实体在另一个 实体中只有一个对应关系。
一对多关系(One-to-Many Relationship):可以在多的一方的表中添加一个外键,指向一的一方的主键。这样可以确保多的一方的实体只属于一的一方的实 体。
多对一关系(Many-to-One Relationship):可以在多的一方的表中添加一个外键,指向一的一方的主键。这样可以确保多的一方的实体只属于一的一方的实体。
多对多关系(Many-to-Many Relationship):需要通过一个中间表来实现多对多关系。中间表包含两个外键,分别指向两个相关表的主键。这样可以建立两个表之间的关联关系。
13、什么是物理外键,什么是逻辑外键
物理外键(Physical Foreign Key):物理外键是通过在数据库表中使用外键约束来实现的。在物理外键中,外键关系是通过数据库引 擎来维护和执行的。当在一个表中定义了外键,它会引用另一个表的主键,从而建立表与表之间的关联关系。物理外键通过数据库的完整性 约束来确保数据的一致性,例如在删除或更新主表的记录时,会相应地删除或更新相关的外键记录。
逻辑外键(Logical Foreign Key):逻辑外键是指在数据模型中定义的外键关系,但在数据库表中并没有实际的外键约束。逻辑外键是在应用程序中通过业务逻辑来实现的。在逻辑外键中,应用程序需要自行处理外键关系的维护和执行。逻辑外键可以在数据模型中定义外键关系,但在数据库表中不会创建实际的外键约束。这种方式更加灵活,但也需要应用程序来负责外键关系的维护。
14、SQL的执行原理是怎样的?
在 SQL 中,SELECT 语句的执行顺序是:
FROM 子句:从数据源中选择需要查询的表和视图。
WHERE 子句:对查询结果进行过滤,只返回符合条件的行。
GROUP BY 子句:对查询结果进行分组,按照指定的列进行分组。
HAVING 子句:对分组结果进行过滤,只返回符合条件的分组。
SELECT 子句:选择需要返回的列,以及对列进行计算。
ORDER BY 子句:对查询结果进行排序,按照指定的列进行排序。
LIMIT 子句:限制查询结果的数量,只返回指定数量的行。
在执行 SELECT 语句时,会先执行 FROM 子句,从数据源中选择需要查询的表和视图。然后,如果 WHERE 子句存在,会对查询结果进行过滤,只返回符合条件的行。接着,如果 GROUP BY 子句存在,会对查询结果进行分组,按照指定的列进行分组。如果 HAVING 子句存在,会对分组结果进行过滤,只返回符合条件的分组。然后,会执行 SELECT 子句,选择需要返回的列,以及对列进行计算。最后,如果 ORDER BY 子句存在,会对查询结果进行排序,按照指定的列进行排序。如果 LIMIT 子句存在,会限制查询结果的数量,只返回指定数量的行。SELECT 语句的执行原理是基于关系型数据库的查询语言,它可以处理大量的数据,并且可以进行复杂的数据处理和分析。在执行 SELECT 语句时,数据库会读取数据源中的数据,对数据进行过滤、分组、排序和计算,最后返回结果
[ day09 MySQL + Mybatis ]
【多表查询】
1、什么叫做笛卡尔积?笛卡尔积后所有结果都是有效的么?怎么去除无效数据?
笛卡尔积(Cartesian Product)是关系型数据库中的一个概念,指的是将两个或多个表的记录进行组合,生成所有可能的组合结果
然而,并不是所有笛卡尔积的结果都是有效的。在进行笛卡尔积操作时,需要考虑数据之间的关联条件,只有满足关联条件的组合才是有效的
通过使用关联条件或者添加WHERE子句来过滤结果集
2、多表查询有几种方式?各自什么含义?
○ 内连接:相当于查询A、B交集部分数据
○ 外连接:
■ 左外连接:查询左表所有数据,以及两张表交集部分数据
■ 右外连接:查询右表所有数据,以及两张表交集部分数据
○ 自连接:当前表与自身的连接查询,自连接必须使用表别名
【事务】
3、事务是什么?举例说明
事务(Transaction)是数据库管理系统中的一个概念,用于确保数据库操作的一致性和可靠性。事务是由一个或多个数据库操作组成的逻辑工作单元,这些操作要么全部执行成功,要么全部回滚(撤销),以保证数据库的完整性
假设有一个银行系统,用户A要向用户B转账100元。这个转账操作可以作为一个事务。在事务中,首先需要检查用户A的账户余额是否足够,然后扣除用户A的账户余额,增加用户B的账户余额。如果这两个操作都成功,事务就会提交,转账操作生效。如果其中任何一个操作失败,事务就会回滚,恢复到转账前的状态,保证了数据的一致性和完整性。
4、MySQL默认事务是怎么提交的?
MySQL默认使用自动提交(Auto-Commit)模式来提交事务
5、如何自己开启事务,提交事务,回滚事务?
开启事务:begin/start transaction
提交事务:commit
回滚事务:roll back
6、事务的四大特性是什么含义?
原子性(Atomicity):事务是一个不可分割的工作单元,要么全部执行成功,要么全部回滚。如果事务中的任何一个操作失败,整个事务将被回滚到初始状态,不会对数据库产生任何影响。
一致性(Consistency):事务在执行前后,数据库的状态必须保持一致。事务的执行不会破坏数据库的完整性约束,如主键、外键等。
隔离性(Isolation):事务的执行是相互隔离的,即一个事务的执行不会受到其他事务的影响。每个事务都感觉不到其他事务的存在,避免了并发操作产生的问题,如脏读、不可重复读和幻读。
持久性(Durability):一旦事务提交成功,对数据库的修改将永久保存,即使在系统故障或重启后也能够恢复。数据库系统会将事务的结果持久化到磁盘,以保证数据的持久性。
【MyBatis】
7、MyBatis是什么,作用是什么?
MyBatis是一种持久层框架,用于简化Java应用程序与关系型数据库之间的交互。它提供了一种将数据库操作与Java代码解耦的方式,通过配置文件和注解来实现数据库操作的映射和执行。
数据库操作的映射:通过配置文件或注解,将数据库表和SQL语句映射到Java对象和方法上。这样可以通过调用Java方法来执行数据库操作,而无需编写繁琐的SQL语句。
数据库操作的执行:MyBatis提供了执行SQL语句的功能,可以执行查询、插入、更新、删除等操作,并将结果映射为Java对象。
数据库事务管理:MyBatis支持事务的管理,可以通过配置文件或注解来指定事务的隔离级别、提交方式等。同时,也支持手动控制事务的开启、提交和回滚。
缓存管理:MyBatis提供了缓存机制,可以缓存查询结果,提高查询性能。通过配置文件可以指定缓存的策略和刷新机制。
动态SQL的支持:MyBatis支持动态SQL,可以根据不同的条件拼接SQL语句,实现灵活的查询和更新操作。
8、如果要创建一个SpringBoot项目要处理数据库数据需要哪些依赖?
Lombok,Spring Web,MyBatis Framework,Mysql Driver
9、简要描述我们如何创建一个SpringBoot项目支持MyBatis操作?
创建一个新的Spring Boot项目
配置数据库连接信息
创建数据模型类
创建Mapper接口和XML文件
配置MyBatis
编写业务逻辑代码
运行和测试
[day10 Mybatis基础操作]
1. 使用注解定义增删改查,分别用什么注解实现?
@Insert("INSERT INTO table_name (column1, column2) VALUES (#{value1}, #{value2})")
void insertData(@Param("value1") String value1, @Param("value2") String value2);
@Delete("DELETE FROM table_name WHERE id = #{id}")
void deleteData(@Param("id") Long id);
@Update("UPDATE table_name SET column1 = #{value1}, column2 = #{value2} WHERE id = #{id}")
void updateData(@Param("value1") String value1, @Param("value2") String value2, @Param("id") Long id);
@Select("SELECT * FROM table_name WHERE id = #{id}")
Data getDataById(@Param("id") Long id);
1. 被@Select,@Update,@Delete,@Insert 注解的方法,要放在哪里?
放在MyBatis的Mapper接口中
1. 在新增数据时,如果想要让id回存到对象中怎么办?
可以通过使用@Options注解来实现将自动生成的id回存到对象中
1. 如果表中的字段名称和POJO中属性名称不一样,怎么去实现数据的映射?
可以通过在MyBatis的Mapper接口中使用@Results和@Result注解来实现数据的映射
1. #{} 和 ${} 的区别是什么?
#{}是预编译的占位符,用于传递参数值。在SQL语句执行之前,MyBatis会将#{}替换为相应的参数值,并使用预编译的方式将参数值传递给数据库。这样可以有效地防止SQL注入攻击,并且可以自动处理参数的类型转换。
是字符串替换的占位符,用于替换参数值。在
S
Q
L
语句执行之前,
M
y
B
a
t
i
s
会将
{}是字符串替换的占位符,用于替换参数值。在SQL语句执行之前,MyBatis会将
是字符串替换的占位符,用于替换参数值。在SQL语句执行之前,MyBatis会将{}替换为相应的参数值,并将整个SQL语句发送给数据库执行。这种方式没有预编译的优势,存在SQL注入的风险,同时也无法自动处理参数的类型转换。
另外,#{}可以接收任意类型的参数,并会根据参数的类型自动进行类型转换,而${}只是简单地将参数值替换到SQL语句中,不会进行类型转换
1. 什么是SQL注入?
SQL注入是一种常见的安全漏洞,指的是攻击者通过在用户输入的数据中插入恶意的SQL代码,从而对数据库进行非法操作或获取敏感信息。
1. 接口中的方法怎么设定参数,好让SQL语句中能够识别。
单个参数:如果只有一个参数,可以直接在方法中声明该参数,然后在SQL语句中使用#{}占位符来引用参数
多个参数:如果有多个参数,可以使用@Param注解为每个参数指定名称,然后在SQL语句中使用#{}占位符引用对应的参数。
使用Map作为参数:如果参数较为复杂或不确定,可以使用Map作为参数,将所有的参数封装到Map中,然后在SQL语句中使用#{}占位符引用Map中的键。
1. 动态SQL中有哪些标签,各有什么作用: where-if set-if foreach sql include
标签用于动态生成WHERE子句,它会自动处理WHERE关键字和AND/OR的逻辑。
标签用于在SQL语句中添加条件判断,只有当条件满足时,才会生成对应的SQL片段。
标签用于动态生成SET子句,常用于更新操作。
标签用于在SQL语句中添加条件判断,只有当条件满足时,才会生成对应的SQL片段。
标签用于遍历集合或数组,并将集合中的元素作为参数传递给SQL语句中的占位符。
可以通过collection属性指定要遍历的集合或数组,通过item属性指定当前遍历的元素,通过open、close、separator属性指定SQL语句的拼接规则。
标签用于定义可重用的SQL片段,可以在其他SQL语句中使用标签引用。
标签用于引用已定义的SQL片段。
[day11 SpringBoot案例]
1. 什么是RESTful风格的后端接口?
REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格
2. 开发一个功能需要经历哪些流程?
● 查询页面原型明确需求
● 阅读接口文档(已提供)
● 思路分析
● 接口开发:就是开发后台的业务功能,一个业务功能,我们称为一个接口。
● 接口测试:功能开发完毕后,先通过Postman进行接口测试,测试通过后,和前端进行联调测试。
● 前后端联调测试:和前端开发人员开发好的前端工程一起测试。
3. 开发分页功能前端至少需要传什么参数过来,后台简化分页开发的插件叫什么?怎么用?
page,pagesize
PageHelper
引入分页插件的依赖。
在MyBatis的配置文件中配置分页插件。
在Mapper接口的方法中添加分页相关的参数和注解。
4. 部门新增逻辑?
前端页面展示
前端数据验证
后台接口设计
后台数据处理
数据库操作
返回结果
前端提示
5. 部门删除逻辑?
6. 部门查询逻辑?
7. 员工查询逻辑?怎么实现分页查询的?
8. 员工删除怎么实现?
[day11 SpringBoot案例2]
1. 用什么注解可以快速获取日志对象?
@Slf4j
2. 文件上传前端表单必须具备哪三个要素?
元素:用于选择要上传的文件。这个元素的type属性设置为file,它会显示一个文件选择框,允许用户选择本地文件。
enctype属性:用于指定表单数据的编码类型。在文件上传的情况下,需要将enctype属性设置为multipart/form-data,以支持文件的传输。
name属性:用于标识文件上传字段的名称。在后台接收表单数据时,可以通过该名称来获取上传的文件。
3. 文件上传功能开发时,后台用什么类型的参数来接收文件?
MultipartFile
4. 请说说你的图片存储方案是怎样的?
创建OSS存储空间:在阿里云OSS上创建一个存储空间,用于存放图片文件。可以根据需要设置存储空间的地域、访问权限等配置。
上传图片:使用OSS提供的API或SDK,在应用中将图片文件上传到指定的OSS存储空间中。上传时可以指定文件的存储路径和文件名。
访问图片:通过OSS提供的访问域名和图片路径,可以直接访问存储在OSS上的图片文件。可以使用HTTP或HTTPS协议进行访问,也可以配合CDN加速提高图片加载速度。
图片处理:OSS还提供了丰富的图片处理功能,如缩放、裁剪、旋转、水印等。可以根据需要对上传的图片进行处理,以满足不同场景的需求。
安全和权限控制:OSS支持对存储空间和文件进行访问权限的控制,可以通过设置Bucket Policy、访问控制列表(ACL)等方式来保护图片的安全性。
数据备份和容灾:OSS自动提供数据冗余和容灾功能,确保图片数据的可靠性和高可用性。可以根据需要选择不同的存储类型和冗余策略,如标准存储、低频访问存储、归档存储等。
5. 请说说你的员工修改是怎么实现的?
6. @Value,@ConfigurationProperties 两个注解怎么用的
@Value注解:
@Value注解可以直接用于字段、方法参数、方法返回值和构造函数参数上。
通过@Value注解,可以将配置属性的值注入到对应的字段或方法参数中。
可以使用KaTeX parse error: Expected 'EOF', got '#' at position 4: {}或#̲{}表达式来引用配置属性,如{myapp.name}。
@ConfigurationProperties注解:
@ConfigurationProperties注解用于将配置属性的值绑定到一个Java对象上。
需要在Spring容器中定义一个被@ConfigurationProperties注解标记的Bean,并在该Bean上指定前缀。
在绑定时,会根据属性名和配置属性的名字进行匹配,并将值注入到对应的属性中。
@Value注解适用于获取单个属性的值,而@ConfigurationProperties注解适用于将多个属性绑定到一个Java对象上。
7. 配置文件有几种形式,常用的那种
XML,YML,Properties,JSON
[day12 SpringBoot案例3 登录校验]
1. 登录校验的实现思路是怎样的?
项目中访问核心资源,通常都要进行登录校验,访问京东商城的订单,必须要先登录才能访问查询。
实现思路:可以在访问资源前进行访问的拦截,判断你当前会话是否有登录,如果没有登录拒绝访问。如果是登录的那就可以进行访问资源。
2. 会话技术有哪些方式可以实现?
传统技术可以使用Cookie+Session去实现会话,进行会话跟踪。但是这种传统方式有弊端:不能在集群服务中灵活使用,手机客户端无法支持Cookie。
为了解决这些问题,可以使用令牌技术来解决。令牌技术优点是:可以在集群服务中灵活使用,移动端也可以支持。
3. JWT令牌组成部分有哪些,各自作用是什么?
三部分组成:
header.payload.signature
header.payload.signature 部分的数据会以Base64的方式进行编译。
这三部分的作用分别是:
header:指定令牌类型,加密的算法…
payload:存储一些令牌要携带的信息,比如用户的基本信息id,username, 过期时间
signature :保证令牌不被篡改。
4. 怎么使用JWT令牌?(依赖,创建,校验)
1、加入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2、创建令牌
String jwt = Jwts.builder()
.addClaims(携带的数据,是一个map集合)
.signWith(SignatureAlgorithm.HS256, 秘钥)
.setExpiration(new Date(System.currentTimeMillis() + expire))
.compact();
3、解析令牌
Claims claims = Jwts.parser()
.setSigningKey(秘钥)//要和创建令牌时的秘钥保持一致
.parseClaimsJws(令牌)//要解析的令牌
.getBody();
当解析不报异常,此时就代表令牌是有效的。报任何异常都意味着令牌失效。
5 项目中在什么时候去生成令牌?
在登录时生成令牌,在访问核心资源的时候进行令牌的校验
6. 当前端携带令牌访问资源时怎么去拦截校验令牌的合法性?
有两种方案可以实现:
1、过滤器
2、拦截器
7. 过滤器具体使用的步骤是怎样的?
Filter使用步骤如下:
1、创建一个类实现接口Filter接口,重写doFilter方法
2、类上面需要加注解:@WebFilter(urlPatterns = "/*")
3、在引导类中注解:@ServletComponentScan
4、要做具体的拦截业务在doFilter中完成
public void doFilter(ServletRequest req, ServletResponse rsp, FilterChain chain) {
//登录校验拦截
xxxxxx
//放行(如果不放行,就不执行如下语句)
chain.doFilter(req,rsp);
yyyyyyy
}
8. 拦截器具体使用的步骤是怎样的?
Interceptor使用步骤如下:
1、创建一个类实现HandlerInterceptor接口,上面加上注解@Component
public class LoginCheckInterceptor implements HandlerInterceptor
2、重写方法方法
preHandler 方法可以实现在资源访问前的拦截
3、写配置类,在里面进行注册:
3.1 写一个类叫做配置,实现接口WebMvcConfigurer,并在类型上加上注解:@Configuration
@Configuration
public class WebConfig implements WebMvcConfigurer
3.2 注入拦截器对象,重写方法addInterceptors 进行注册,并设定拦截路径。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginCheckInterceptor loginCheckInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器
registry.addInterceptor(loginCheckInterceptor)
.addPathPatterns("/**");
}
}
9. 项目中异常是怎么处理的?具体怎么实现?
异常处理有两种方案:
1、在每一个Controller中的方法里面单独try-catch捕获处理(代码冗余,繁琐)
2、全局异常处理(推荐的方案)
全局异常处理的实现步骤:
1、创建一个类用来专门处理异常,在类上面加上注解:@RestControllerAdvice
2、在里面写一个方法用来处理异常:该方法返回值类型用同一响应结果Result,还需要使用注解@ExceptionHandler 去定义要处理的异常类型。
@RestControllerAdvice
@Slf4j //配置日志对象
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result ex(Exception e) {
log.error("全局异常处理", e);
return Result.error("系统繁忙,请稍后重试!!");
}
}
10. 任务:把登录校验功能实现完善,并集成全局异常处理
【day14 SpringBoot 事务管理+AOP】
1. 事务是什么?在MySQL中是怎么去开启,提交,回滚事务的。
事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
事务操作:
● 开启事务:begin /start transaction ; 一组操作开始前,开启事务
● 提交事务: commit; 全部成功后提交事务
● 回滚事务: rollback; 中间有任何一个子操作出现异常,回滚事务
2. 在Spring中怎么管理事务,用什么注解,在那个层次进行使用可以有效管理事务
● 注解:@Transactional
● 位置:业务(service)层的方法上、类上、接口上
● 作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务
● 可以通过如下配置,查看详细的事务管理日志:
logging:
level:
org.springframework.jdbc.support.JdbcTransactionManager: debug
3. 事务管理时规则:如果方法能够正常执行完自动提交事务,如果出现异常自动回滚事物。事务默认识别的异常是运行时异常,如果想要识别到编译时异常从而实现回滚,该怎么操作?
要识别并回滚编译时异常,可以在事务管理器中配置rollbackFor属性。通过设置rollbackFor属性,可以指定需要回滚的异常类型,包括编译时异常。
以下是一个示例配置:
@Transactional(rollbackFor = Exception.class)
public void yourTransactionalMethod() {
// 你的业务逻辑代码
}
在上述示例中,使用@Transactional注解标记了一个方法,并设置了rollbackFor属性为Exception.class,这意味着无论是运行时异常还是编译时异常,都会触发事务回滚
4. 事务的传播方式有哪些,含义是怎样?
REQUIRED(默认):如果当前没有事务,就创建一个新事务;如果当前已经存在事务,就加入到当前事务中。这是最常用的传播方式,适用于大多数情况。
SUPPORTS:如果当前有事务,就加入到当前事务中;如果当前没有事务,就以非事务方式执行。适用于不需要强制事务的场景。
MANDATORY:如果当前有事务,就加入到当前事务中;如果当前没有事务,就抛出异常。适用于必须在事务中执行的场景。
REQUIRES_NEW:无论当前是否有事务,都创建一个新事务。如果当前有事务,则将当前事务挂起。适用于需要独立事务的场景。
NOT_SUPPORTED:以非事务方式执行方法,如果当前有事务,将当前事务挂起。适用于不需要事务支持的场景。
NEVER:以非事务方式执行方法,如果当前有事务,则抛出异常。适用于不允许在事务中执行的场景。
NESTED:如果当前有事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新事务。嵌套事务是独立于外部事务的内部事务,可以回滚或提交。适用于需要独立事务,但又需要受外部事务控制的场景。
5. AOP叫做什么,有什么作用?举一个5岁孩子就能理解的例子?
AOP是面向切面编程的缩写,全称是Aspect-Oriented Programming。AOP是一种编程范式,用于将横切关注点(如日志记录、性能监控、事务管理等)与主要业务逻辑相分离,以提高代码的模块化和可维护性。
6. 如果要完成一个AOP的入门案例,需要有哪些步骤?
1. pom.xml 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2. 定义类抽取公共代码(执行耗时统计操作)
3. 标识当前类是一个AOP类,并被Spring容器管理
4. 配置公共代码作用于哪些目标方法
5. 执行目标方法
6. 测试运行
7. AOP的概念理解:连接点,通知,切入点,切面 ?
● 连接点:JoinPoint,可以被AOP控制的方法执行(包含方法信息)
● 通知:Advice ,重复逻辑代码
● 切入点:PointCut ,匹配连接点的条件
● 切面:Aspect,通知+切点
8. 通知有哪些类型?
● @Around:此注解标注的通知方法在目标方法前、后都被执行
● @Before:此注解标注的通知方法在目标方法前被执行
● @After :此注解标注的通知方法在目标方法后被执行,无论是否有异常
● @AfterReturning : 此注解标注的通知方法在目标方法后被执行,有异常不会执行
● @AfterThrowing : 此注解标注的通知方法发生异常后执行
@Around 需要自己调用 ProceedingJoinPoint.proceed() 来让目标方法执行,其他通知不需要考虑目标方法执行
9. 如果有不同切面的通知,增强相同的方法,执行顺序是怎样的?
● 默认按照 bean 的名称字母排序
● 用 @Order(数字) 加在切面类上来控制顺序
○ 目标前的通知方法:数字小先执行
○ 目标后的通知方法:数字小后执行
10. 切点表达式有几种,具体怎么定义?
● execution(返回值类型 包名.类名.方法名(参数类型))
○ * 可以通配任意返回值类型、包名、类名、方法名、或任意类型的一个参数
○ … 可以通配任意层级的包、或任意类型、任意个数的参数
● @annotation() 根据注解匹配
● args() 根据方法参数匹配
11. 如果有多个通知的切点表达式一样,怎么抽取?
如果有多个通知的切点表达式相同,可以通过在切面类中抽取公共的切点表达式,然后在通知注解中引用该公共切点表达式。这样可以避免代码的重复,并提高代码的可维护性。
@Aspect
@Component
public class LoggingAspect {
// 抽取公共的切点表达式
@Pointcut("execution(* com.example.MyService.method1(..))")
public void method1Pointcut() {}
@Pointcut("execution(* com.example.MyService.method2(..))")
public void method2Pointcut() {}
// 使用公共的切点表达式
@Before("method1Pointcut() || method2Pointcut()")
public void beforeAdvice() {
System.out.println("Before advice: Logging before method execution");
}
}
12. 连接点是什么可以获取哪些信息?
连接点简单理解就是 目标方法,在Spring 中用 JoinPoint 抽象了连接点,用它可以获得方法执行时的相关信息,如方法名、方法参数类型、方法实际参数等等
● 对于 @Around 通知,获取连接点信息只能使用 ProceedingJoinPoint
● 对于其他四种通知,获取连接点信息只能使用 JoinPoint,它是 ProceedingJoinPoint 的父类型
任务:完成最后一个案例?