招联金融
提示
本文主要记录了招联金融的暑期实习过程中的收获
# 1. 领域驱动设计(DDD)
# 2. 全局异常处理
通过@ControllerAdvice注解,在controller层统一处理异常,通过@ExceptionHandler注解,在controller层处理异常,通过@ResponseBody注解,在controller层返回json格式的异常信息。
# 3. 对象注入省略@Autowired注解
常规在对象上使用@Autowired注解,在spring容器中会自动注入对象。
@Autowired
private UserService userService;
2
- 当在类上使用@RequiredArgsConstructor注解时,spring容器会自动注入对象。但需要用final修饰符修改注入的对象
- 当在类上使用@AllArgsConstructor注解时,spring容器会自动注入对象。
# 4. 文件请求参数接收
当请求参数中存在文件Mutifile,不能使用@RequestBody注解,因为@RequestBody 主要设计用于处理序列化的数据格式,如 JSON,它能够将 JSON 数据转换为 Java 对象。然而,对于文件上传,应使用@ReququestParm或者@RequestPart注解
- @RequestParam 用于接收标准的表单字段。
- @RequestPart 用于接收 multipart/form-data 类型的请求体中的文件和非文件数据。
# 5. Git常用指令
# 6. Mapper请求参数
- 简单的引用类型参数(Integer、String)
- 自定义DTO(实体类)
- 数组或集合:传递多个相同类型的参数
@Param注解主要用于区分不同的参数,动态SQL(条件查询、fen ye c中引用参数时需要使用@Param注解
interface BlogMapper {
List<Post> selectPostsByTitleAndCategory(@Param("title") String title, @Param("category") String category);
}
2
3
🔎 在使用 MyBatis 时,如果你需要同时传入一个 DTO(数据传输对象)实体类和其他单独的参数?
A:将DTO和其他参数一起放入一个Map中,然后在 Mapper 接口中接受 Map 类型的参数。在 XML 映射文件中,你可以通过键名访问这些参数。
B:对于DTO和其他参数都使用@Param注解
# 7. 策略模式
定义
策略模式 定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。在 Spring 中,这通常涉及到使用依赖注入(DI)来注入不同的实现类,这些实现类都实现了相同的接口。
通过传入不同的 Bean 来利用同一个接口方法的不同实现,这主要体现了 策略设计模式(Strategy Design Pattern)的使用。
通过多态实现策略模式:父类的引用指向子类的实例,引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定
# 8. 动态sql
语法 | 说明 |
---|---|
if | 根据条件判断是否执行SQL语句(是否为空) |
choose | 选择一个分支执行SQL语句(类似于switch-case) |
trim | 去除SQL语句的前后空格(常用于where和set) |
where | 添加where关键字,可自动去除多余的and,使其符合sql语法规则 |
foreach | 循环遍历集合 |
set | 添加set关键字(更新操作),可自动去除多余的逗号,使其符合sql语法规则 |
bind | 绑定变量 |
# 9. 枚举类型转换器
# 10. spring注入list集合
笔记
spring在帮我们管理bean的时候,会帮我们完成自动注入,其中有一个比较特殊的类型:list。这篇笔记主要记录spring注入list集合的原理
public interface Rest {}
@Component
public class RestServiceImpl01 implements Rest{}
@Qualifier("restServiceImpl02")
@Component
public class RestServiceImpl02 implements Rest{}
@Component
public class OrderService {
@Autowired
//@Qualifier
private List<Rest> restList;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring中,在使用@Autowired注解注入list集合的时候,并不会根据List类型去容器中查找,而是根据list集合的元素类型,从spring容器中找到所有的实现类,放在list集合中,然后注入到bean中
🔎那如果我们想要指定只注入部分bean怎么办?
💡在需要注入的集合和需要注入的类上添加@Qualifier注解
# 11. 同时上传表单数据和文件
@RequestBody只能接收json格式的请求体
# 注意事项
- 尽量只使用@GetMapping(查)、@PostMapping(增删改)
- @GetMapping(查)请求不存在请求体,无法使用@RequestBody注解接受请求参数,应该使用@RequestParam注解接受请求参数
- 若请求参数类型相同,可以使用Map接收前端参数,例如@RequestParam(value = "id", required = false) Map<String, Object> params
- 禁止使用不明确的数字,例如0,1,2,3,4,5,6,7,8,9,使用常量代替
- 尽量使用枚举类型代替字符串类型,枚举类型具有类型安全,字符串类型没有类型安全,容易出错
- 使用try- catch-resources,自动关闭资源(输入流、输出流等),不正常关闭会导致系统崩溃
- 避免使用for循环遍历查询到的数据记录,应在查询时一次性完成
- 在Mybatis的mapper XML文件中,输入参数通常被当作字符串处理,因为它们被包含在XMl标签中,当你使用#{}占位符时,Mybatis会自动将输入参数转换成适当的JDBC类型
- 继承closeable接口,必须在close方法中关闭资源,防止资源泄漏(或者使用try-catch-resources)自动释放
- 尽量对前端的请求参数进行必要的校验(@Validated)
- 一般使用redis作为缓存,不开启MyBatis的二级缓存
- 当修改了多张数据表的数据时,应使用@Transactional注解,保证事务的完整性(例如批量删除)
- mybatis-generator-maven-plugin插件可以快速生成数据表对应的 Mapper 接口和对应的 XML 映射文件,以及实体类 (Entity)
- 时刻注意空指针异常
- 判空条件尽量使用现有的方法,包括集合判空,字符串判空等
- 响应类中的属性如果不是自定义的类,可以无需实现序列化接口,因为这些属性已经默认实现了序列化接口
- 合并代码之前一定要先提交!!!