Java Web 学习之路(2) —— 概念、SpringBoot + MyBatis(controller+service+mapper)开发流程与过程梳理

文章目录

  • 前言
  • [1. 常见的一些概念](#1. 常见的一些概念)
    • [1.1 POJO(Plain Ordinary Java Object 简单Java对象)](#1.1 POJO(Plain Ordinary Java Object 简单Java对象))
    • [1.2 DAO和Mapper](#1.2 DAO和Mapper)
  • [2. Java的三层架构](#2. Java的三层架构)
    • [2.1 包的层级结构](#2.1 包的层级结构)
    • [2.2 交互层 controller(用户界面、网页)jsp文件](#2.2 交互层 controller(用户界面、网页)jsp文件)
    • [2.3 业务处理层 service](#2.3 业务处理层 service)
    • [2.4 Mapper层](#2.4 Mapper层)
  • [3. 注解](#3. 注解)
    • [3.1 @SpringBootApplication](#3.1 @SpringBootApplication)
    • [3.2 Bean对象的声明](#3.2 Bean对象的声明)
    • [3.3 @Autowired](#3.3 @Autowired)
    • [3.4 @RequestBody](#3.4 @RequestBody)
    • [3.5 @ResponseBody](#3.5 @ResponseBody)
    • [3.6 @PathVariable](#3.6 @PathVariable)
    • [3.7 @RequestParam](#3.7 @RequestParam)
    • [3.8 @RequestMapping、@GetMapping、@@PostMapping等等](#3.8 @RequestMapping、@GetMapping、@@PostMapping等等)
    • [3.9 @Configuration](#3.9 @Configuration)
    • [3.10 @Import](#3.10 @Import)
    • [3.11 @Bean](#3.11 @Bean)
    • [3.12 @Transactional](#3.12 @Transactional)
    • [3.13 切面](#3.13 切面)
    • [3.14 @Slf4j](#3.14 @Slf4j)
    • [3.15 lombok](#3.15 lombok)
  • 总结

前言

这段时间在继续沉淀Java后端的东西,看的网课是黑马的23版JavaWeb开发,整体只是把很多知识点过了一遍,发现好多知识点都不明白,加之前面基础不牢,整体感受就是面向注解编程,感觉整个人就稀里糊涂。做完了这个Demo后,我也打算来好好整理一下目前的知识点。

最大的一个感觉就是Java的生态圈是真的庞大,这也是为啥这么多年了Java仍然能在国内市场当老大的原因吧。

1. 常见的一些概念

1.1 POJO(Plain Ordinary Java Object 简单Java对象)

POJO就是一个非常简单的对象,一般只包含一些基本的参数,一般就用来表示数据结构,例如数据库中的表结构。

POJO的内在含义是指:那些没有继承任何类、也没有实现任何接口,更没有被其它框架侵入的java对象。

它仅包含自身的属性以及自身属性的getter和setter方法,这意味者POJO可以方便的从一个框架迁移到另一个框架中,或者框架升级也会对代码毫无影响,因此而得到复用。

Bean

Bean是POJO的特殊类型,所有的Java Bean都是POJO。

  • JavaBean是遵循特定编写规范的Java类,主要用于封装数据。具体来说,一个JavaBean需要满足以下规范:实现Serializable接口以支持序列化;提供一个无参构造函数;使用私有属性存储数据,并提供公共的getter和setter方法访问和修改这些属性;对于值类型的属性,使用私有属性存储数据;对于引用类型的属性,使用私有属性存储对对象的引用,并提供公共的getter和setter方法访问和修改这些引用。

  • 相比之下,POJO(Plain Ordinary Java Object)是一种更纯净、简单的Java类或接口。它严格地遵守简单对象的概念,也就是说,POJO主要用于装载数据,作为数据存储的载体,而不具有业务逻辑处理的能力 。与JavaBean不同,POJO没有严格的编写规范,只要它包含属性和相应的getter和setter方法,就可以被视为POJO

(以上资料来自GPT)

1.2 DAO和Mapper

DAO通常是一个接口,它定义了一些数据访问方法,而具体的实现则由其他类来完成;而Mapper则是用于将Java对象与SQL语句进行映射的,它通常是一个XML文件,包含了一些SQL语句和一些与Java对象相关的配置信息。

2. Java的三层架构

Java设计三层架构主要目的还是分层解耦。

  • 控制反转:简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想被称为控制反转。
  • 依赖注入:简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
  • Bean对象:IOC容器中创建、管理的对象,称之为Bean。

2.1 包的层级结构

Java开发的包的层级特别多也特别深,在之前我自己做C++开发的时候,都没有过这种感觉。

这里主要用的是Maven,也是目前最流行的打包方式。

2.2 交互层 controller(用户界面、网页)jsp文件

controller层作为与前端交互的层,主要用来接受请求,并且调用业务层service层。

java 复制代码
@Slf4j  // 自动生成一个名为log的日志对象
@RequestMapping("/depts")
@RestController // 包含ResponseBody注解,将返回对象直接转为json再响应回来(controller层必要的注解)
public class DeptController {

    @Autowired	// 自动装配注解,是用来将这个注解下面的对象进行实例化的
    private DeptService deptService;	// 调用业务逻辑层需要声明相应的业务逻辑层对象

    /**
     * 查询部门数据
     * @return
     */
    @GetMapping
    public Result list() {
        log.info("查询全部部门数据");

        // 调用service查询部门数据
        List<Dept> deptList = deptService.list();
        return Result.success(deptList);
    }
    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id) {	// 前端需要传递的参数
        log.info("根据id删除部门:{}", id);
        deptService.delete(id);
        return Result.success();
    }
}

2.3 业务处理层 service

主要作用是:与交互层进行数据传输,调用数据处理层,完成各种业务功能。

首先要有个业务层接口,然后再有实现类。

java 复制代码
public interface DeptService {
    /**
     * 查询全部部门数据
     * @return
     */
    List<Dept> list();

    /**
     * 删除部门
     * @param id
     */
    void delete(Integer id);

    /**
     * 新增部门
     * @param dept
     */
    void add(Dept dept);
}
java 复制代码
@Service	// 这个注解来表明这是个业务逻辑层,到时候自动装配就可以找到这个层
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptMapper deptMapper;
    @Autowired
    private EmpMapper empMapper;

    @Override
    public List<Dept> list() {
        return deptMapper.list();
    }

    @Override
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)  // spring事务管理;默认只有RuntimeException才回滚;这里指定所有异常
    public void delete(Integer id) {
        deptMapper.deleteById(id);
//        int i = 1 / 0;
        empMapper.deleteByDeptId(id);   // 根据部门id删除员工
    }

    @Override
    public void add(Dept dept) {
        dept.setCreateTime(LocalDateTime.now());
        dept.setUpdateTime(LocalDateTime.now());

        deptMapper.insert(dept);
    }
}

2.4 Mapper层

这一层就是进行数据库的操作了。在这一层,spring有DAO和Mapper两种实现,一般后者用的多一点。

java 复制代码
@Mapper	// Mapper层要有的东西
public interface DeptMapper {
    /**
     * 查询全部部门数据
     * @return
     */
    @Select("select * from dept")
    List<Dept> list();

    @Delete("delete from dept where id = #{id}")
    void deleteById(Integer id);

    @Insert("insert into dept (name, create_time, update_time) values(#{name}, #{createTime}, #{updateTime})")
    void insert(Dept dept);
}

关于Mapper层和Service层,前者主要负责和数据库打交道,而Service层更多则是业务逻辑的处理,包括事务的添加也在这一层,比如从A扣掉100,再从B加上100,这个过程在Service层打包成了一个事务。

3. 注解

初次学习的时候,接触了太多的注解了,一方面感慨java后端就是面向注解编程,可以帮助我们快速构建应用程序;另一方面觉得对底层认值还不够清晰。这一小节把常用的注解都记录下来总结一下。

3.1 @SpringBootApplication

作用:这是一个组合注解,包括了@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解。用于标识SpringBoot应用程序的入口类。

  • @Configuration:指示这个类是一个配置类,它定义了一个或多个@Bean方法,用于创建和配置Spring应用程序上下文中的Bean。

  • @EnableAutoConfiguration:启用Spring Boot的自动配置机制,它会自动添加所需的依赖项和配置,以使应用程序能够运行。

  • @ComponentScan:指示Spring Boot扫描当前包及其子包中的所有@Component、@Service、@Repository和@Controller注解的类,并将它们注册为Spring Bean。

@SpringBootApplication注解通常被用于Spring Boot应用程序的入口类上,用于启动Spring Boot应用程序。它可以简化Spring应用程序的配置和启动过程。

3.2 Bean对象的声明

作用:把某个对象交给IOC容器管理。即完成控制反转。

注解 说明 位置
@Component 声明bean的基础注解 不属于以下三类时,用此注解
@Controller @Component的衍生注解 标注在控制器类上
@Service @Component的衍生注解 标注在业务类上
@Mapper @Component的衍生注解 标注在Mapper上

在springboot中,控制类用@RestController,该类不仅包含了@Controller,还可以将返回值类转换为json类型给前端。

3.3 @Autowired

作用:用于自动装配Spring容器中的Bean。即完成依赖注入。

3.4 @RequestBody

作用:用于将HTTP请求的主体转换为方法的参数。@RequestBody是Spring MVC框架中的一个注解,用于将HTTP请求体中的数据绑定到控制器方法的参数上需要注意,后端pojo类的参数名要与传入的参数名一致。

java 复制代码
@RestController
@RequestMapping("/api")
public class UserController {

    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // 创建用户
    }
}

3.5 @ResponseBody

作用:用于将方法的返回值转换为HTTP响应的主体。@ResponseBody是Spring MVC框架中的一个注解,用于将控制器方法的返回值转换为HTTP响应体中的数据。

3.6 @PathVariable

作用:用于获取URL中的参数值。@PathVariable是Spring MVC框架中的一个注解,用于将HTTP请求路径中的变量绑定到控制器方法的参数上。

java 复制代码
@DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id) {
        log.info("根据id删除部门:{}", id);
        deptService.delete(id);
        return Result.success();
}

3.7 @RequestParam

作用:用于获取请求参数的值,如果未声明则参数和变量参数名一样;同时还可以用defaultValue设置默认值。

java 复制代码
@GetMapping
    public Result page(@RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10") Integer pageSize,
                       String name, Short gender,
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
        log.info("分页查询,参数:{}, {}", page, pageSize);
        PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);
        return Result.success(pageBean);
}

3.8 @RequestMapping、@GetMapping、@@PostMapping等等

用于处理HTTP的各种请求。

3.9 @Configuration

作用:用于标识一个类是Spring的配置类。@Configuration是Spring框架中的一个注解,用于标注一个类作为配置类。

3.10 @Import

作用:用于导入其他配置类或Bean。

3.11 @Bean

作用:用于将一个方法返回的对象注册到Spring容器中。@Bean是Spring框架中的一个注解,用于将一个方法返回的对象注册为一个Spring Bean。

3.12 @Transactional

作用:用于指定事务的范围。

3.13 切面

@Aspect

作用:用于定义切面。

@Aspect是Spring框架中的一个注解,用于标识一个类为切面类,从而可以在该类中定义切面逻辑以实现AOP(面向切面编程)。

在Spring框架中,如果需要使用AOP来实现某些功能,我们可以使用@Aspect注解来标识一个类为切面类。在切面类中,我们可以定义切面逻辑,包括切入点、通知类型和切面顺序等,从而实现AOP编程的功能。

同时,我们还使用@Component注解标识这个类,以便Spring框架能够自动将它加入到Spring容器中。

@Pointcut

作用:用于定义切点。

@Pointcut是Spring框架中的一个注解,用于定义一个切入点,从而可以在该切入点上定义通知类型以实现AOP(面向切面编程)。

在Spring框架中,如果需要使用AOP来实现某些功能,我们可以使用@Pointcut注解来定义一个切入点。在切入点上,我们可以定义切面逻辑,包括通知类型和切面顺序等,从而实现AOP编程的功能。
@Pointcut("execution(* com.example.UserService.*(..))")

@Before

作用:用于在方法执行前执行通知。
@After

作用:用于在方法执行后执行通知。
@Around

作用:用于在方法执行前后执行通知。

3.14 @Slf4j

作用:用于简化日志记录。

3.15 lombok

@Data

作用:用于自动生成JavaBean的getters、setters、toString、hashCode和equals方法。
@NoArgsConstructor

作用:用于生成无参构造函数。
@AllArgsConstructor

作用:用于生成全参构造函数。


总结

感觉学到这虽说把后端的框架都拉通了一遍,但也只是浅尝辄止。后续还需要做更多的研究才行,未来的安排是通过做黑马的项目和背八股文来加深理解。今天把这篇博客写完也算是对这段时间的学习进行了一个总结,然后就准备回家休息几天了。

References

java三层架构,有图有案例有代码,一看就懂!!!
SpringBoot最常用的50个注解(全是干货,干的要死!)

相关推荐
ImomoTo1 小时前
HarmonyOS学习(十三)——数据管理(二) 关系型数据库
数据库·学习·harmonyos·arkts·鸿蒙
everyStudy1 小时前
前端五种排序
前端·算法·排序算法
甜兒.2 小时前
鸿蒙小技巧
前端·华为·typescript·harmonyos
Dola_Pan3 小时前
Linux文件IO(二)-文件操作使用详解
java·linux·服务器
wang_book3 小时前
Gitlab学习(007 gitlab项目操作)
java·运维·git·学习·spring·gitlab
weixin_455446173 小时前
Python学习的主要知识框架
开发语言·python·学习
蜗牛^^O^4 小时前
Docker和K8S
java·docker·kubernetes
从心归零4 小时前
sshj使用代理连接服务器
java·服务器·sshj
IT毕设梦工厂5 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
Jiaberrr5 小时前
前端实战:使用JS和Canvas实现运算图形验证码(uniapp、微信小程序同样可用)
前端·javascript·vue.js·微信小程序·uni-app