参考资料:
- 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层,对外提供成一个服务。