[SpringBoot]AOP
1. AOP 基础1.1 连接点 (Join Point) 定义:程序执行过程中的任意位置,在 Spring AOP 中,主要指所有可以被增强的方法。 通俗理解:你的 Service 类里写了 10 个方法,这 10 个方法理论上都有资格被 AOP 拦截,它们都是连接点。 1.2 切入点 (Pointcut) 定义:对连接点进行过滤的定义(通常使用表达式 execution(...) 或注解 @annotation)。 通俗理解:虽然 Service 有 10 个方法(连接点),但我只想拦截其中的 saveUser() 方法。这个**“选中的规则”**就是切入点。 关系:连接点是候选者,切入点是最终选中的集合。 1.3 通知 (Advice) 定义:指在切入点上要执行的具体逻辑代码。 类型:包括前置通知 (@Before)、后置通知 (@After)、环绕通知 (@Around) 等。 通俗理解:你拦截到方法后想干什么?比如“记录日志”、“开启事务”或者“权限校验”,这些具体的业务逻辑就是通知。 1.4 切面 (Aspect) 定义:是切入点 (Pointcut) 和通...
[SpringBoot]学习杂记260128
在 XML 文件中,< (小于号)和 > (大于号)是保留字符,用于定义标签(比如 <select>、<if>)。 当 XML 解析器读到 WHEN CURDATE() < begin_date 中的 < 时,它以为你要开始写一个新的标签,结果后面跟的是空格和 begin_date,它就懵了,所以报语法错误。 解决方案你有两种修改方式,推荐使用第一种。 方法一:使用转义字符(推荐)把 SQL 中的特殊符号替换成 XML 能识别的转义符。 原符号 含义 XML 转义写法 记忆口诀 < 小于 < less than > 大于 > greater than & 和 & ampersand 为什么这个时候识别不出来实体类的名字?开着驼峰命名呢 这是一个非常经典的误解。 核心结论: “驼峰命名映射”(map-underscore-to-camel-case)只对“查询(Select)”的结果封装生效,对“插入/更新(Insert/Update)”的参数传...
[SpringBoot]注解@Transactional
一、 工作原理@Transactional 的本质是基于 Spring AOP 实现的。当 Spring 容器启动时,它会扫描标注了该注解的类或方法,并为这些 Bean 生成一个 代理对象(Proxy)。 执行流程当调用方请求一个被 @Transactional 修饰的方法时,实际上是在调用代理对象。执行顺序如下: 拦截请求:代理对象拦截对目标方法的调用。 开启事务:代理对象向事务管理器(Transaction Manager)申请,通过数据库连接设置 conn.setAutoCommit(false)。 执行业务:执行目标类中的实际业务方法。 结果处理: Commit:如果方法正常返回,代理对象执行事务提交。 Rollback:如果方法抛出特定异常,代理对象执行事务回滚。 资源清理:关闭数据库连接或将其归还连接池。 核心提示:理解“代理对象”是理解事务机制的关键。如果调用没有经过代理对象,事务逻辑就不会执行。 二、 核心属性详解虽然 @Transactional 开箱即用,但在生产环境中,我们必须关注以下两个关键参数以确保数据一致性。 1. rollbackFor(...
[SpringBoot]注解@Options
常用功能主键返回假设你的数据库里 user 表的主键 id 是 自增 (Auto Increment) 的。 当你执行一个 insert 操作时: 12@Insert("INSERT INTO user (username, password) VALUES (#{username}, #{password})")int insert(User user); 默认情况:这个方法返回的 int 是 “受影响的行数”(成功插入 1 行,就返回 1)。 你的痛点:刚刚插入的那个用户,ID 到底是多少?Java 对象里的 user.getId() 此时还是 null。 解决方案:使用 @Options你需要告诉 MyBatis:“插入完之后,帮我去数据库问问刚才生成的 ID 是多少,然后填回到我的 User 对象里。” 12345// 1. 插入语句@Insert("INSERT INTO user (username, password) VALUES (#{username}, #{...
[SpringBoot]前端请求参数的接收方式
核心速查表 数据来源位置 数据格式/类型 典型请求方式 关键注解 Content-Type URL 路径 /users/{id} GET / DELETE @PathVariable - URL 参数 ?id=1&name=so GET (主要) @RequestParam - Body (请求体) JSON 字符串 POST / PUT @RequestBody application/json Body (请求体) 表单 (k=v&k=v) POST 无注解 (直接用对象接) application/x-www-form-urlencoded Body (请求体) 文件上传 POST @RequestPart multipart/form-data Header (请求头) Token / 自定义头 任意 @RequestHeader - 详细代码示例1. URL 路径参数 (@PathVariable)场景:RESTful 风格接口,参数是 URL 的一部分。 ...
[MyBatis]动态SQL
简介 动态SQL,指的就是随着用户的输入或外部的条件的变化而变化的SQL语句。 比如说现在根据这个员工查询系统设计后端逻辑 前端会请求姓名 | 性别 | 入职开始日期 | 入职结束日期 但是不是每次请求都返回完完整整的四个参数 如果只根据姓名查询 或者只根据性别查询,则最普通的WHERE ... AND ...SQL语句查询不了这种情况 所以MyBatis提供了一中拼接and语句的SQL注入方式 该操作需要在定义在xml文件中的SQL语句进行修改 <if test=”…”>123<if test="判断条件"> 待拼接语句</if> 当test后的判断条件成立时才会拼接包围的SQL语句 但是这样做仍有一个弊端 比如需要执行 WHERE a = ? AND b = ? 当我a的判断条件不成立而b的判断条件成立时 只会进行b的拼接 就变成了``WHERE AND b = ?` 这显然是语法错误了 所以需要引入where这个标签 <where>被where包围的...
[SpringBoot]PageHelper插件
PageHelper是第三方提供的Mybatis框架中的一款功能强大、方便易用的分页插件,支持任何形式的单标、多表的分页查询。 官网:https://pagehelper.github.io/ 依赖123456<!--分页插件PageHelper--><dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.7</version></dependency> 无插件下的分页查询操作Service层1234567891011 @Override//参数://-page 要查询的页数//-pageSize 每页的数据数 public pageResult<Emp> page(Integer page, Integer pageSize) {...
STL速查
通用提示: 所有容器均需 using namespace std;。 所有容器都有 .size() (大小) 和 .empty() (判空),复杂度均为 $O(1)$,下文不再赘述。 这里的 $N$ 指容器当前元素个数。 一、 顺序容器 (动态数组与字符串)1. vector (动态数组)头文件: <vector> 特点: 尾部操作 $O(1)$,中间插入/删除 $O(N)$,随机访问 $O(1)$。 声明与初始化 C++ 12345vector<int> v; // 空数组vector<int> v(n); // 大小为 n,默认值为 0vector<int> v(n, val); // 大小为 n,初值为 valvector<int> v = {1, 2, 3}; // 列表初始化vector<vector<int>> mat(n, vector<int>(m)); // n*m 二...
[算法]二分法
整数二分单调递增找x或x后继123456789int bin_search(int *a, int n, intx){ int left = 0, right = n; while(l < r){ int mid = (l + r) >> 1; if(a[mid] >= x) r = mid; else l = mid + 1; } return l;} 单调递增找x或x前驱123456789int bin_search(int *a, int n, intx){ int left = 0, right = n; while(l < r){ int mid = (l + r) >> 1; if(a[mid] <= x) l = mid; else r = mid - 1; } return l;} 不建议用 (l + r...
[SpringBoot]三层框架的分层解耦
三层框架介绍在开发中,尽可能让每一个接口,方法,类的职责分工明确,提高可读性,扩展性;利于后期维护。 这种原则叫做单一职责原则: 一个类或一个方法,就只做一件事情,只管一块功能。 对于一个业务,可以拆分成三层: Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。 Service:业务逻辑层。处理具体的业务逻辑。 Dao:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。 执行流程为: 前端发起请求 Controller层接收请求 Controller层调用Service进行逻辑处理 Service去调用Dao获取所需数据 Dao层从网路上或者数据库中拿到数据并返回Service Service对待处理数据进行逻辑处理并返回Controller Controller把最终结果响应给前端 前端收到响应 针对于这三层 一般会创建第三个包方便管理 controller service dao 对于每个包内一般采用面向接口的方式进行代码书写: 在每一层的包下书写接口类,再定义一个impl...
![[SpringBoot]AOP](/img/post_springboot_260124.jpg)
![[MyBatis]动态SQL](/img/post_MyBatis.png)

![[算法]二分法](/img/post_daily_260125.png)