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

news2024/11/20 8:36:37

文章目录

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

@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

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

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

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

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

    /**
     * 新增部门
     * @param dept
     */
    void add(Dept dept);
}
@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两种实现,一般后者用的多一点。

@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类的参数名要与传入的参数名一致。

@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请求路径中的变量绑定到控制器方法的参数上。

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

3.7 @RequestParam

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

@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个注解(全是干货,干的要死!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1297981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32F407-14.3.15-01单脉冲模式

单脉冲模式 单脉冲模式 (OPM) 是上述模式的一个特例。在这种模式下&#xff0c;计数器可以在一个激励信号的触发下启动&#xff0c;并可在一段可编程的延时后产生一个脉宽可编程的脉冲。 可以通过从模式控制器启动计数器。可以在输出比较模式或 PWM 模式下生成波形。将 TIMx_C…

【数据结构(九)】线索化二叉树(3)

文章目录 1. 前言——问题引出2. 线索二叉树的基本介绍3. 线索二叉树的应用案例3.1. 思路分析3.2. 代码实现 4. 遍历线索化二叉树4.1. 代码实现 1. 前言——问题引出 问题&#xff1a;     将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. &#xff08;n17个空指针域&…

软件测试:Selenium三大等待(详解版)

一、强制等待 1.设置完等待后不管有没有找到元素&#xff0c;都会执行等待&#xff0c;等待结束后才会执行下一步 2.实例&#xff1a; driver webdriver.Chrome()driver.get("https://www.baidu.com")time.sleep(3) # 设置强制等待driver.quit() 二、隐性等待 …

【数据挖掘】国科大苏桂平老师数据库新技术课程作业 —— 第三次作业

part 1 设计一个学籍管理小系统。系统包含以下信息&#xff1a; 学号、学生姓名、性别、出生日、学生所在系名、学生所在系号、课程名、课程号、课程类型&#xff08;必修、选修、任选&#xff09;、学分、任课教师姓名、教师编号、教师职称、教师所属系名、系号、学生所选课…

【GEE笔记】随机森林特征重要性计算并排序

随机森林是一种基于多个决策树的集成学习方法&#xff0c;可以用于分类和回归问题。在gee中可以使用ee.Classifier.smileRandomForest()函数来创建一个随机森林分类器&#xff0c;并用它来对影像进行分类。 随机森林分类器有一个重要的属性&#xff0c;就是可以计算每个特征&a…

计算机毕业设计springboot+ssm停车场车位预约系统java

管理员不可以注册账号 停车位包括车位所在楼层、车位编号、车位类型(全时间开放/高峰期开放)、预定状态等 用户预约时要求支付预约时间段的停车费用 违规行为&#xff1a;1.停车超过预约时间段 2.预约未使用 于系统的基本要求 &#xff08;1&#xff09;功能要求&am…

class067 二维动态规划【算法】

class067 二维动态规划 code1 64. 最小路径和 // 最小路径和 // 给定一个包含非负整数的 m x n 网格 grid // 请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 // 说明&#xff1a;每次只能向下或者向右移动一步。 // 测试链接 : https://leetcode…

【腾讯云 HAI域探秘】StableDiffusionWebUI 让我找到了宫崎骏动漫里的夏天

目录 前言一、HAI二、应用场景三、构建 Stable Diffusion 模型1、新建HAI应用2、StableDiffusionWebUI&#xff08;1&#xff09;功能介绍&#xff08;2&#xff09;页面转中文&#xff08;3&#xff09;AI绘图① 正向提示词语② 反向提示词③ “” 、“ AND”、“|” 用法④ 权…

网上下载的pdf文件,为什么不能复制文字?

不知道大家有没有到过这种情况&#xff1f;在网上下载的PDF文件打开之后&#xff0c;发现选中文字之后无法复制。甚至其他功能也都无法使用&#xff0c;这是怎么回事&#xff1f;该怎么办&#xff1f; 当我们发现文件打开之后&#xff0c;编辑功能无法使用&#xff0c;很可能是…

基于MATLAB的BPSK调制解调仿真(仿真图超多,结果超清晰)

基于MATLAB的BPSK调制解调仿真(包含中间各个环节的时域波形、功率谱、频谱图、抽样后的星座图和眼图、理论与仿真的误码率曲线) 目录 前言 一、BPSK基本原理 二、BPSK调制解调过程 三、仿真结果 1、码元信噪比eb/n0-10dB时 1、双极性不归零基带信号 2、成型滤波(根升余弦…

uni-app应用设置 可以根据手机屏幕旋转进行 (横/竖) 屏切换

首先 我们打开项目的 pages.json 在左侧导航栏中找到 源码视图 然后找到 app-plus 配置 在下面加上 "orientation": [//竖屏正方向"portrait-primary",//竖屏反方向"portrait-secondary",//横屏正方向"landscape-primary",//横屏反方…

Other -- ChatGPT 原理

本文为个人理解&#xff0c;帮助小白&#xff08;本人就是&#xff09;了解正在创建新时代的 AI 产品&#xff0c;如文中理解有误欢迎留言。 [参考链接--](https://baijiahao.baidu.com/s?id1765556782543603120&wfrspider&forpc) 1. 了解一些基本概念 大语言模型&a…

安卓MediaRecorder(2)录制源码分析

文章目录 前言JAVA new MediaRecorder() 源码分析android_media_MediaRecorder.cpp native_init()MediaRecorder.java postEventFromNativeandroid_media_MediaRecorder.cpp native_setup() MediaRecorder 参数设置MediaRecorder.prepare 分析MediaRecorder.start 分析MediaRec…

[面试题~Docker] 云原生必问基础篇

文章目录 基础相关1. Docker 是什么&#xff1f;2. 镜像是什么3. 容器是什么4. 数据卷是什么5. Docker 和虚拟机的区别&#xff1f;6. Docker 常用命令有哪些&#xff1f; 原理相关1. docker 有几种网络模式host 模式container模式none模式bridge模式 2. docker 网络实现在Linu…

AGILE-SCRUM

一个复杂的汽车ECU开发。当时开发队伍遍布全球7个国家&#xff0c;10多个地区&#xff0c;需要同时为多款车型定制不同的软件&#xff0c;头疼的地方是&#xff1a; 涉及到多方人员协调&#xff0c;多模块集成和管理不同软件团队使用的设计工具、验证工具&#xff0c;数据、工…

C语言数据结构-基于单链表实现通讯录

文章目录 1 基础要求2 通讯录功能2.1 引入单链表的文件2.2 定义联系人数据结构2.3 打开通讯录2.4 保存数据后销毁通讯录2.5 添加联系人2.6 删除联系人2.7 修改联系人2.8 查找联系人2.9 查看通讯录 3 通讯录代码展示3.1 SeqList_copy.h3.2 SeqList_copy.c3.3 Contact.h3.4 Conta…

【论文阅读】Reachability and distance queries via 2-hop labels

Cohen E, Halperin E, Kaplan H, et al. Reachability and distance queries via 2-hop labels[J]. SIAM Journal on Computing, 2003, 32(5): 1338-1355. Abstract 图中的可达性和距离查询是许多应用的基础&#xff0c;从地理导航系统到互联网路由。其中一些应用程序涉及到巨…

免费开源-数字孪生城市污水处理平台

智慧城市污水处理平台&#xff0c;基于污水厂三维模型可视化场景&#xff0c;结合物联网IOT、视频监控以及综合运营数据&#xff0c;增加污水处理厂的掌控力度。飞渡科技利用数字孪生技术结合物联网IOT技术&#xff0c;直观展现各污水处理站点的整体建设规模&#xff0c;以及污…

pytorch:YOLOV1的pytorch实现

pytorch&#xff1a;YOLOV1的pytorch实现 注&#xff1a;本篇仅为学习记录、学习笔记&#xff0c;请谨慎参考&#xff0c;如果错误请评论指出。 参考&#xff1a; 动手学习深度学习pytorch版——从零开始实现YOLOv1 目标检测模型YOLO-V1损失函数详解 3.1 YOLO系列理论合集(YOL…

Windows Service Name重复问题

Windows Service Name重复问题 1&#xff0c;问题 2&#xff0c;打开命令提示符&#xff0c;管理员身份运行 3&#xff0c;输入命令&#xff1a;sc delete MYSQL57 4&#xff0c;验证一下&#xff0c;可以看见已经没有感叹号啦 &#xff0c;可以看见已经没有感叹号啦