判断是否为空
判断字符串 :要判断是否为和是否为 string a a==null and a=''
判断集合:dataList == null || dataList.isEmpty() 不能写反,,要先判断是否初始化,在判断是否为空
若List
未初始化(list = null
),直接调用list.isEmpty()
会抛出NullPointerException
(NPE)。
若List
已初始化为空集合(list = new ArrayList<>()
),list != null
为true
,但list.isEmpty()
为true
。
正确方式:先判断null,再判断isEmpty() if (dataList == null || dataList.isEmpty())
- 逻辑或(
||
)的执行规则:当第一个条件为true
时,第二个条件不会被执行。 - 具体执行流程:
- 先判断
dataList == null
。 - 如果
dataList
确实为null
,第一个条件成立,整个表达式结果为true
,dataList.isEmpty()
不会被执行,因此不会触发 NPE。 - 只有当
dataList != null
时,才会执行dataList.isEmpty()
。此时dataList
已被确认非空,调用isEmpty()
是安全的。
dto.getProjectPlans() != null && !dto.getProjectPlans().isEmpty()){ //空集合无法避免为空,保证的是,已初始化且不为null,无法避免sql插入空值,仍然要在sql中进行大于0的判断
数据返回的结果是两列的数据,就是map的list集合(list<map>) 如果要求返或,两列的集合
一:可以定义
过滤器(先于拦截器)java实现
拦截器 springmvc实现的
在 AOP(面向切面编程)中,环绕通知(Around Advice) 需要显式调用 joinPoint.proceed()
来执行目标方法,而前置通知(Before)、后置通知(After)和返回通知(AfterReturning)不需要,这是由它们的执行时机和职责决定的
- 环绕通知需要显式调用
proceed()
,因为它负责完全控制目标方法的执行。 - 其他通知不需要调用目标方法,因为它们的执行时机是在目标方法执行前、执行后或返回后,Spring 框架会自动处理目标方法的调用。
- 选择合适的通知类型:根据需要增强的逻辑位置,选择对应的通知类型(如仅前置处理用
@Before
,完全控制用@Around
)。
环绕通知(Around)的拦截逻辑
- 若某环绕通知捕获异常并吞掉(不重新抛出):
异常终止传播,后续切面的环绕通知不会执行,但@After
通知仍会触发。 - 若某环绕通知捕获异常后重新抛出:
异常继续传播,后续切面的环绕通知可能被触发(取决于异常类型是否匹配)。
2. 异常后通知(AfterThrowing)的作用
@AfterThrowing
仅用于处理已抛出的异常,无法阻止异常传播。
即使在@AfterThrowing
中捕获异常,原始异常仍会继续向上传播。
around 如果针对异常未进行抛出,那么最终会导致,异常未抛出(会抑制异常的传播),Afterthrowing不会阻止异常的抛出
各层返回结果规范
- Mapper 层:这一层要返回精准的数据结构。
- 当返回单条记录时,可使用实体类进行封装。
- 若返回多条记录,则采用
List<实体类>
的形式。 - 只有在结果列不固定的情况下,才考虑使用
List<Map>
。
- Service 层:该层要返回业务对象或者状态。
- 对于单个业务对象,直接返回。
- 多个业务对象,就返回
List<业务对象>
。 - 涉及增删改操作时,返回布尔值或者自定义的
Result
对象。
- Controller 层:此层要返回统一的 API 响应。
- 一般会返回封装好的
Result<T>
,其中包含状态码、消息以及数据。
- 结果列不固定的场景:
- 动态查询(多条件组合)
- 聚合统计(自定义字段)
- 多表关联(字段冗余)
- 动态计算字段
- 业务对象的特点:
- 封装业务逻辑
- 可能包含计算字段或组合数据
- 与业务需求强相关,而非数据库结构
- 三层架构协作原则:
- Mapper 层:返回原始数据(实体类或 Map)
- Service 层:将原始数据转换为业务对象
- Controller 层:直接返回业务对象给前端
2025.6.26 针对mapper常用就是实体类,mapper有聚合函数才用map
- SQL 查询结果:提供值(value)
- 实体类:通过属性名定义键(key)和值的类型
- ORM 映射:负责将 SQL 列值填入实体类属性
- JSON 序列化:将实体类属性名→JSON 的 key,属性值→JSON 的 value
最终的 JSON 结构完全由实体类决定,与 SQL 列名无关(除非通过 ORM 显式配置映射)。
ORM 映射配置(以 MyBatis 为例)(当属性名与字段名不一致时)
通过@Results
注解显式指定列名到属性名的映射:
@Select("SELECT id AS user_id, name FROM user WHERE id = #{id}") @Results({ @Result(column = "user_id", property = "id"), // 列名→属性名映射 @Result(column = "name", property = "name") }) User getUserById(Long id);