参考资料:
- java官方词典:https://docs.oracle.com/javase/tutorial/information/glossary.html#F
 - 苍穹外卖:https://www.bilibili.com/video/BV1TP411v7v6
 
JavaBean规范
JavaBean规范是一种类的规范,其要求符合下列条件:
- 若干
private实例域 - 通过public方法来读写实例域,其中的读写方法符合以下命名规范
 
//读方法;
public T getXyz(){}
//写方法;
public T setXyz(){}
 
boolean类型是一个例外,其读方法一般命名为public boolean isXyz(){}
**属性:**一组对应的读方法(getter)和写方法(writter)称为属性(property)。因此,只有getter的属性被称为只读属性read-only;只有setter的属性被称为只写属性write-only。
域
Java中的域(field),是类的一个数据成员,主要用来存储对象的状态。通常叫做“类成员”“类成员变量”“数据成员”。
静态域
声明为static的域。静态字段不属于任何对象,只属于类,必须使用类名.静态字段名进行访问,而对象名.静态字段名是无法访问到静态字段的。静态字段存储的数据在内存中只有一份。
注解
Java注解
参考:https://blog.csdn.net/weixin_44299027/article/details/105918873
 注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。
 定义注解时,会需要一些元注解(meta annotation,可以用来修饰注解),如@Target和@Retention,其中Target注解目标,Retention注解生命周期
- @Target用来定义注解修饰的对象范围(例如是一个方法或者一个域)。
 - @Retention用来定义该注解在哪一个级别可用,在源代码中(SOURCE)、类文件中(CLASS)或者运行时(RUNTIME)。
 
在注解中,一般都会包含一些元素以表示某些值。当分析处理注解时,程序或工具可以利用这些值。注解的元素看起来就像接口的方法,唯一的区别是你可以为其指定默认值。
 没有元素的注解称为标记注解(marker annotation),例如我在文章尾部自定义的注解。
 Java目前只内置了三种标准注解(下一篇文章介绍),以及四种元注解。元注解专职负责注解其他的注解。
 **@Retention**注解中,有且仅有一个属性,也就是类型为RetentionPolicy的value,而RetentionPolicy类型又是一个枚举类型,有三种取值:
- RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成 .class 文件的时候,被其标注的注解被遗弃;
 - RetentionPolicy.CLASS:注解被保留到class文件中,但jvm加载 .class 文件时候,被其标注的注解会被遗弃,这是默认的生命周期;
 - RetentionPolicy.RUNTIME:注解不仅被保留到 .class 文件中,jvm 加载 .class 文件之后,被其标注的注解仍然存在,所以这个时候才可能通过反射机制读取注解的信息,而前两个生命周期中,通过反射机制读取不到注解信息的
 
上述3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。
 生命周期长度RUNTIME>CLASS>SOURCE。后者能作用到的地方前者一定能作用到,反之不一定。
 使用场景:
- 一般如果需要在运行时去动态获取注解信息,那只能用生命周期最长的 RUNTIME 标注了,比如 
@Deprecated就是使用 RetentionPolicy.RUNTIME 来标注的;比如以下源码中我们常用到的注解:@Transient、@Deprecated、@Documented、@Inherited、@Retention、@Target … 等等很多。 - 如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;这个在源码中没有找到,但是参考其他博客写的 ButterKnife 就是被 RetentionPolicy.CLASS 标注的。
 - 如果只是做一些检查性的操作,比如源码中的 
@Override、@SuppressWarnings、@Native、@Generated等就是被 RetentionPolicy.SOURCE 标注的。 
@Mapper注解
 
@Mapper注解通常用于标识一个 Java 接口或类是 MyBatis 的映射器(Mapper)。MyBatis 是一个持久层框架,用于将数据库操作与 Java 代码进行映射,简化了数据库访问的过程。
 在Mybatis中,可以自动扫描并创建实现映射器接口的代理对象,相当于可以自动把从数据库读出的数据装入Java对象之中,即实现数据库操作与Java代码的映射。通常与@Select注解搭配使用。
 例如:
@Mapper
public interface EmployeeMapper {
    /**
     * 根据用户名查询员工
     * @param username
     * @return
     */
    @Select("select * from employee where username = #{username}")
    Employee getByUsername(String username);
}
 
在上面的代码中,Emploee类之中有多个属性,每个属性都对应着数据库表中的一个键。在通过Select命令读取之后,Mybatis会自动将读出的数据映射到一个Emploee对象并将其返回。
 通常,MyBatis 在处理数据库列名与 Java 对象属性之间的映射时,遵循一种命名规则,即数据库列名使用下划线分隔单词,而对应的** Java 对象属性使用驼峰命名法**。例如,数据库列名 first_name 在 Java 对象中对应的属性可能是 firstName。
@ConfigurationProperties注解
 
@ConfigurationProperties配置属性类,是Spring Framework中的一个注解,能够读取配置文件中的配置项,并将其封装到Java Bean上。以下是例子
@Component
@ConfigurationProperties(prefix = "sky.jwt")
@Data
public class JwtProperties {
    /**
     * 管理端员工生成jwt令牌相关配置
     */
    private String adminSecretKey;
    private long adminTtl;
    private String adminTokenName;
}
 
sky:
  jwt:
    # 设置jwt签名加密时使用的秘钥
    admin-secret-key: itcast
    # 设置jwt过期时间
    admin-ttl: 7200000
    # 设置前端传递过来的令牌名称
    admin-token-name: token
 
上述的(prefix="sky.jwt")指的是在application.yml文件中找到sky.jwt项目,而后该类会自动将sky.jwt下的配置文件根据命名规则(上面写了)绑定到类的属性之中。
 类中的属性往往使用的是驼峰命名法,而配置文件中则使用"-"号分隔,springboot能够自动识别。
@Component注解
 
@Component注解标识的类在应用程序启动时会被实例化,并由Spring容器进行管理。它是一种通用的注解,可以用于标识任何类,使其成为Spring容器中可被自动扫描和实例化的Bean。可以通过Spring的依赖注入(DI)机制来使用和管理这些组件。常与**@AutoWired**注解一起使用,使用@Component将类注册为Spring容器中的Bean,然后,在其他需要使用这个Bean的地方,使用@Autowired来自动注入这个Bean。
 其有三个衍生注解:
 @Controller标记控制器
 @Service标记业务层
 @Reposity标记数据访问层组件
Lombok库 注解
@Data注解
 
@Data注解是Lombok库提供的一个注解,其可以自动为类生成常用方法,包括getter、setter、equals、hashCode和toString等
@Getter、@Setter注解
这两个注解分别用于自动生成getter和setter方法。如果只需要自动生成getter或setter方法,而不是全部,可以使用这两个注解。
@ToString注解
自动生成toString方法,用于返回对象的字符串表示形式。
@EqualsAndHashCode注解
自动生成equals和hashCode方法,用于比较两个对象是否相等以及生成对象的哈希码。
@NoArgsConstructor 、@AllArgsConstructor注解
这两个注解分别用于自动生成无参构造函数和全参构造函数。
@Slf4j、@Log4j、@Log4j2 注解
这些注解用于自动生成日志对象,如SLF4J或Log4j的日志实例,方便在类中使用日志功能。
@Builder注解
 
@Builder也是Lombok库提供的一个功能,允许使用链式调用的方式构建对象。例如
@Builder  
@Getter  
public class Person {  
    private String name;  
    private int age;  
    private String gender;  
}
 
Person person = Person.builder()  
                .name("Alice")  
                .age(30)  
                .gender("Female")  
                .build();
 
@Bean注解
 
@Bean注解主要用于将一个方法标记为Spring容器中的一个Bean,常与@Configuration注解搭配使用。
@Configuration注解
 
@Configuration注解是一个类注解,用于定义配置类,可用于替换xml配置文件。当一个类被@Configuration注解标注时,它就被视为Spring的一个配置类。被@Configuration注解标注的类能够自动注册到IOC容器,并进行实例化。
 在@Configuration标注的类内部,通常包含一个或多个被@Bean注解的方法。这些被@Bean注解的方法会被Spring框架进行扫描,并用于构建bean定义。这样,我们就能够利用这些方法来定义和注册bean到Spring容器中,使得这些bean可以被其他程序组件所引用和使用。
@Api相关注解
 
| 注解 | 说明 | 
|---|---|
| @Api | 用在类上,例如Controller,表示对类的说明 | 
| @ApiModel | 用在类上,例如entity、DTO、VO | 
| @ApiModelProperty | 用在属性上,描述属性信息 | 
| @ApiOperation | 用在方法上,例如Controller的方法,说明方法的用途、作用 | 
@ExceptionHandler注解
 
@ExceptionHandler注解是SpringFramework中的一个注解,用于处理控制器中抛出的异常。当有方法使用@ExceptionHandler租界,且该方法匹配到了某个类型的异常时,Spring将会自动调用这个方法来处理控制器中抛出的相应异常。其提供了一种集中的处理异常的方式,使得代码更易维护。
 @ExceptionHandler注解可以应用于类级别或方法级别。当应用于类级别时,该类中的所有方法都可以处理该控制器中抛出的异常。当应用于方法级别时,只有该方法可以处理特定的异常。
@JsonFormat注解
 
@JsonFormat注解主要用于指定Java对象序列化成JSON字符串时的格式。一般用于时间日期上,帮助开发者进行格式化输出。
 使用@JsonFormat注解时,需要指定一些属性,例如:
- pattern:日期、时间格式的模式,比如"yyyy-MM-dd HH:mm:ss"。
 - shape:日期、时间格式的类型,可以是STRING、NUMBER、NUMBER_INT、NUMBER_FLOAT、OBJECT等。
 - locale:使用的Locale。
 - timezone:时区。
 
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
 
结果的区别显而易见
 
前后端交互注解
@RequestParam注解
 
@PathVariable是 Spring Framework 中的一个注解,主要用于从 URI 模板变量中获取值,并将其绑定到控制器方法的参数上。其方法是Query方法。只要前台form表单中name属性和controller中参数写得一样就可以省略@requestParam。自动注入
@PathVariable注解
 
@PathVariable注解主要用于从URL中直接获取值,并将其绑定到控制器方法的参数上。例子如下:
@RestController  
public class UserController {  
    @GetMapping("/users/{id}")  
    public String getUserById(@PathVariable("id") Long id) {  
        // 假设这里有一些逻辑来根据ID获取用户信息  
        return "User with ID: " + id;  
    }  
}
 
当请求/user/123时,@PathVariable会捕获123,然后将其绑定到参数id上。其参数("id")是可选的,如果不写则会默认绑定到使用方法的参数。
@RequestBody注解
 
@RequestBody是Spring框架中的一个注解,主要用于将http请求的body映射到一个java对象上。当你发送一个 POST 或 PUT 请求,并且请求体包含 JSON、XML 或其他格式的数据时,@RequestBody可以帮助你自动解析这些数据到一个 Java 对象中。
@PostMapping("/user")  
public User createUser(@RequestBody User user) {  
    // 在这里,user 对象已经被自动填充了请求体中的数据  
    // 你可以进行其他操作,比如保存到数据库等  
}  
 
public class User {
    private String name;
    private int age;
}
 
{  
  "name": "John Doe",  
  "age": 30  
}
 
@Mapper注解
 
@Mapper注解是Mybatis框架中定义的一个描述数据层(DAO层)接口的注解。当在接口类上添加@Mapper注解后,程序运行时会自动创建接口的实现类对象,并交给Spring IOC进行管理。
Mapper
mapper通常用来指代数据映射器或对象映射器。对象映射器是一种用于在不同数据表示之间进行映射的工具。在数据库开发中,这通常用于将数据库表中的数据映射到应用程序中的对象,或者将应用程序中的对象映射到数据库表中的数据。
不同的POJO
| 名称 | 说明 | 
|---|---|
| Entity | 实体,通常和数据库中的表对应 | 
| DTO | 数据传输对象,通常用于程序中各层之间传递数据 | 
| VO | 视图对象,为前端展示数据提供的对象 | 
| POJO | 普通Java对象,只有属性和对应的getter和setter | 
JWT登录
登录流程如下:
 
HandlerInterceptor接口
HandlerInterceptor接口是Spring MVC框架中的一个接口,主要用于在处理器处理请求前进行一些预处理和后处理操作。其提供了三个方法:
- preHandle:这是请求预处理的方法。当请求到达控制器之前,这个方法会被调用。它返回一个布尔值,如果返回true,则请求会继续流转,传递给下一个拦截器或目标方法;如果返回false,则请求处理流程会终止,不再调用后续的拦截器或处理器,而是直接进行response响应。
 - postHandle:这个方法会在控制器方法调用之后,且解析视图之前执行。此时,模型数据已经填充完毕,但视图还没有渲染。如果有需要对请求域中的模型和视图进行进一步修改的操作,可以在这个方法中进行。
 - afterCompletion:这是整个请求处理完毕后的回调方法,即在视图渲染结束之后执行。无论之前是否有异常抛出,这个方法都会被调用。因此,这个方法非常适合用于资源清理、记录日志信息等工作。
 
前后端数据交互格式
Query格式
Query格式通常使用URL的参数进行传递,其是一种键值对的格式,其使用**?开头,多个键值对之间使用&进行分割,键和值之间使用=**进行连接。例如http://example.com/search?name=John&age=30。在这个例子中,name=John和age=30就是使用Query格式传递的参数。使用Query格式传入Controller层不需要进行@RequestBody进行映射,JSON是需要的。Query格式只需要前后端参数名一样就可以。
JSON格式
JSON格式则是一种轻量级的通用数据交换格式,其也是一种键值对形式表示数据,但是键和值都必须使用双引号括起来,且整个JSON对象必须使用大括号括起来,例如
{  
  "name": "John",  
  "age": 30  
}
 
MyBatis
PageHelper插件
GET方法和POST方法和PUT方法
参考:https://cloud.tencent.com/developer/news/39873
 GET方法和POST方法都是HTTP协议中用于发送请求到服务器的方法。其用途不同
 GET方法主要用于请求数据。当使用GET方法时,请求的数据会跟在URL后以字符串形式发出,这意味着GET请求的数据是可见的,且URL有长度限制。
 使用PUT时,必须明确知道要操作的对象,如果对象不存在,创建对象;如果对象存在,则全部替换目标对象。同样POST既可以创建对象,也可以修改对象。
 但用POST创建对象时,之前并不知道要操作的对象,由HTTP服务器为新创建的对象生成一个唯一的URI;使用POST修改已存在的对象时,一般只是修改目标对象的部分内容。
数据库
主键:一张表中,可以用于唯一标识一条记录的字段组。给一个主键的值,就能找到一条确定的记录
 外键:外键是另一组表的主键。外键可以对两个表进行链接,可以用于建立表和表的关系
 主键有且只有一个,而外键可以有多个
配置文件
application.yml文件是整个springboot项目的主配置文件,
控制器类
控制器(Controller)类是Spring MVC框架的重要参与者。
 主要工作:处理HTTP请求。
 控制器类使用@Controler注解进行修饰
 当一个类被注解为@Controller时,Spring会将其视为一个处理HTTP请求的组件,并且会扫描其中的方法,将他们与特定的URL路径进行关联。在@Controller注解下,其@Target的参数是TYPE,也就是说其只能作用在类、接口之上。
@RestController注释
 
RestController注释实际上就是@Resposebody+@Controller。
 其主要作用是将控制器中方法的返回值直接序列化为JSON或其他格式的数据,作为HTTP响应体返回到客户端,而不是渲染为视图页面。
@RequestMapping注解 及其简化注解
 
@RequestMapping是 Spring MVC 的注解,它用于映射 web 请求(如 HTTP GET、POST、PUT、DELETE 请求)到特定的处理器函数或方法上。
基本用法
你可以将@RequestMapping注解添加到类或者方法上。当添加到类上时,它表示该类中的所有方法都会有一个共同的路径前缀。当添加到方法上时,它表示该方法会处理具有特定路径的请求。
添加到类上
@Controller  
@RequestMapping("/users")  
public class UserController {  
  
    @GetMapping("/{id}")  
    public String getUser(@PathVariable Long id, Model model) {  
        // 获取用户信息,并添加到模型中  
        User user = userService.getUserById(id);  
        model.addAttribute("user", user);  
        return "userDetails";  
    }  
  
    @PostMapping("/create")  
    public String createUser(@ModelAttribute User user) {  
        // 创建新用户  
        userService.createUser(user);  
        return "redirect:/users"; // 重定向到用户列表页面  
    }  
}
 
在这个例子中,@RequestMapping("/users")添加到 UserController 类上,意味着该控制器中的所有方法都会有一个 /users 的路径前缀。因此,getUser 方法会处理/users/{id} 的 GET 请求,而 createUser 方法会处理 /users/create 的 POST 请求。
添加到方法上
@Controller  
public class HomeController {  
  
    @RequestMapping(value = "/", method = RequestMethod.GET)  
    public String home() {  
        return "home";  
    }  
  
    @RequestMapping(value = "/about", method = RequestMethod.GET)  
    public String about() {  
        return "about";  
    }  
}
 
home方法处理根目录/的GET请求,而about方法处理目录/about的GET请求
属性
@RequestMapping 注解有几个属性可以配置:
- value:指定请求映射的路径。
 - method:指定请求映射的 HTTP 方法(如 RequestMethod.GET、RequestMethod.POST 等)。
 - consumes:指定处理请求的媒体类型(如 application/json)。
 - produces:指定响应的媒体类型。
 - params:指定请求中必须包含的参数。
 - headers:指定请求中必须包含的头部信息。
 
简化形式注解
- @GetMapping:等价于 @RequestMapping(method = RequestMethod.GET)。
 - @PostMapping:等价于 @RequestMapping(method = RequestMethod.POST)。
 - @PutMapping:等价于 @RequestMapping(method = RequestMethod.PUT)。
 - @DeleteMapping:等价于 @RequestMapping(method = RequestMethod.DELETE)。
 - @PatchMapping:等价于 @RequestMapping(method = RequestMethod.PATCH)。
 
Spring分层
DAO层
DAO层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表的增删改查,也就是说某个DAO一定是和数据库的某一张表一一对应的,其中封装了增删改查基本操作,建议DAO只做原子操作,增删改查。
Service层:
Service层叫服务层,被称为服务,粗略的理解就是对一个或多个DAO进行的再次封装,封装成一个服务,所以这里也就不会是一个原子操作了,需要事物控制。
Controler层:
Controler负责请求转发,接受页面过来的参数,传给Service处理,接到返回值,再传给页面。
总结:
DAO面向表,Service面向业务。后端开发时先数据库设计出所有表,然后对每一张表设计出DAO层,然后根据具体的业务逻辑进一步封装DAO层成一个Service层,对外提供成一个服务。



















