0
点赞
收藏
分享

微信扫一扫

项目之旅(前两周)

独孤凌雪 11小时前 阅读 0

参考资料:

  • 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**注解中,有且仅有一个属性,也就是类型为RetentionPolicyvalue,而RetentionPolicy类型又是一个枚举类型,有三种取值:

  1. RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成 .class 文件的时候,被其标注的注解被遗弃;
  2. RetentionPolicy.CLASS:注解被保留到class文件中,但jvm加载 .class 文件时候,被其标注的注解会被遗弃,这是默认的生命周期;
  3. RetentionPolicy.RUNTIME:注解不仅被保留到 .class 文件中,jvm 加载 .class 文件之后,被其标注的注解仍然存在,所以这个时候才可能通过反射机制读取注解的信息,而前两个生命周期中,通过反射机制读取不到注解信息的

上述3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。
生命周期长度RUNTIME>CLASS>SOURCE。后者能作用到的地方前者一定能作用到,反之不一定。
使用场景:

  1. 一般如果需要在运行时去动态获取注解信息,那只能用生命周期最长的 RUNTIME 标注了,比如 @Deprecated 就是使用 RetentionPolicy.RUNTIME 来标注的;比如以下源码中我们常用到的注解:@Transient、@Deprecated、@Documented、@Inherited、@Retention、@Target … 等等很多。
  2. 如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;这个在源码中没有找到,但是参考其他博客写的 ButterKnife 就是被 RetentionPolicy.CLASS 标注的。
  3. 如果只是做一些检查性的操作,比如源码中的 @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;

结果的区别显而易见
image.png

前后端交互注解

@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登录

登录流程如下:
image.png

HandlerInterceptor接口

HandlerInterceptor接口是Spring MVC框架中的一个接口,主要用于在处理器处理请求前进行一些预处理和后处理操作。其提供了三个方法:

  1. preHandle:这是请求预处理的方法。当请求到达控制器之前,这个方法会被调用。它返回一个布尔值,如果返回true,则请求会继续流转,传递给下一个拦截器或目标方法;如果返回false,则请求处理流程会终止,不再调用后续的拦截器或处理器,而是直接进行response响应。
  2. postHandle:这个方法会在控制器方法调用之后,且解析视图之前执行。此时,模型数据已经填充完毕,但视图还没有渲染。如果有需要对请求域中的模型和视图进行进一步修改的操作,可以在这个方法中进行。
  3. afterCompletion:这是整个请求处理完毕后的回调方法,即在视图渲染结束之后执行。无论之前是否有异常抛出,这个方法都会被调用。因此,这个方法非常适合用于资源清理、记录日志信息等工作。

前后端数据交互格式

Query格式

Query格式通常使用URL的参数进行传递,其是一种键值对的格式,其使用**?开头,多个键值对之间使用&进行分割,键和值之间使用=**进行连接。例如http://example.com/search?name=John&age=30。在这个例子中,name=Johnage=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层,对外提供成一个服务。

举报

相关推荐

0 条评论