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

文章目录

  • 前言
  • 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*/@GetMappingpublic 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 {@Autowiredprivate DeptMapper deptMapper;@Autowiredprivate EmpMapper empMapper;@Overridepublic 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删除员工}@Overridepublic 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设置默认值。

@GetMappingpublic 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.mzph.cn/news/209986.shtml

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

相关文章

2024 年甘肃省职业院校技能大赛信息安全管理与评估赛项规程

2024 年甘肃省职业院校技能大赛高职学生组电子与信息大类信息安全管理与评估赛项规程 一、赛项名称 赛项名称&#xff1a;信息安全管理与评估 赛项类别&#xff1a;团体赛 赛项归属&#xff1a;电子与信息大类 二、竞赛目的 极安云科专注技能竞赛&#xff0c;包含网络建设…

微信小程序css实现的联系客服动画样式

一 、效果 二、代码 wxml <view class"customer-service"><button class"btn" open-type"contact"></button><image class"pic" src"https://ts4.cn.mm.bing.net/th?idOIP-C.3SGSiRPuOU9uH5VNVOMPwgHaHa…

序列的Z变换(信号的频域分析)

1. 关于Z变换 2. 等比级数求和 3. 特殊序列的Z变换 4. 因果序列/系统收敛域的特点 5. 例题

免费的AI文案生成器有哪些?AI文案生成器排行榜

在当今数字化的时代&#xff0c;内容创作已成为许多行业不可或缺的一部分。为了满足日益增长的创作需求&#xff0c;越来越多的人开始寻找能够提高效率、同时保持原创性的解决方案。本文将专心分享一些优质的AI文案生成器。 AI文案生成器的需求 内容创作已经不再是传统媒体和市…

高项备考葵花宝典-项目进度管理输入、输出、工具和技术(上,很详细考试必过)

项目进度管理的目标是使项目按时完成。有效的进度管理是项目管理成功的关键之一&#xff0c;进度问题在项目生命周期内引起的冲突最多。 小型项目中&#xff0c;定义活动、排列活动顺序、估算活动持续时间及制定进度模型形成进度计划等过程的联系非常密切&#xff0c;可以视为一…

C语言基础

常量和常量表达式的区别 #define N 4;又是常量&#xff0c;又是常量表达式&#xff0c;其在编译期预处理阶段就会直接替换 const int M 5;只是常量&#xff0c;不是常量表达式 &#xff0c;其是存储在一块内存区域之内的&#xff0c;但是存储的值不能改变 常量表达式&#xff…

【USB、串口、COM口、TTL、RS-232、RS-485区别详解】

USB&#xff0c;串口&#xff0c;COM口&#xff0c;TTL&#xff0c;RS-232&#xff0c;RS-485区别详解 1. USB&#xff0c;串口&#xff0c;COM口&#xff0c;TTL&#xff0c;RS-232&#xff0c;RS-485区别详解2 USB转TTL2 RS-232转TTL3 USB4 UART5 STM32串口异步通讯需要定义的…

iOS——定位与地图

平时在写项目的时候可能会遇到需要使用定位服务的地方&#xff0c;比如说获取位置和导航等。因此这里我会使用OC自带的库以及苹果系统的地图来获取定位以及显示在地图上。 开始前的设置 在获取定位前&#xff0c;需要在项目文件的info中添加两个关键字&#xff0c;用于向用户…

从零开始的C++(二十一)

C11 1.列表初始化&#xff1a; //允许以下代码正确运行int a[]{1,2,3};//效果与int a[]{1,2,3}一致 即允许省略等于号。同时&#xff0c;允许用花括号对所有自定义类型和内置类型进行初始化&#xff0c;而非以前花括号只能对数组进行初始化。利用花括号对自定义类型初始化时…

LeetCode刷题--- 求根节点到叶节点数字之和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述…

在python中安装库,会有conda安装,也会有pip安装,conda与pip的区别是什么?

文章目录 一、Conda是什么&#xff1f;二、pip是什么&#xff1f;三、pip与conda的区别&#xff1a;总结 一、Conda是什么&#xff1f; Conda是一个开源的包管理系统&#xff0c;它是Anaconda公司为Python和其他编程语言开发的。它主要用于数据科学和机器学习领域&#xff0c;…

【Vue】日常错误总结(持续更新)

日常遇到的小问题汇总, 内容小篇幅少的就全放这里了, 内容多的会在Vue专栏单独分享~ 目录 【Q】 el-form-item值为 null 或 undefined显示““ 【Q】dialog内组件数据刷新总是延迟慢一拍 问题背景描述 解决方案 代码简单模拟 JS 【Q】el-input 不能输入的解决办法 方法…

Orcal数据库Schema理解、表分区理解

目录 1 Schema1.1 Orcal数据库示例1.2 MySQL数据库示例 2 Orcal表分区2.1 创建表分区2.2 查看表分区2.3 查看指定分区数据 此前未了解过Schema的概念&#xff0c;仅知道Orcal数据库比较侧重这个概念&#xff0c;搜遍全网都&#xff0c;都是啰哩吧嗦的搬抄定义&#xff0c;特此在…

LeetCode算法题解(单调栈)|LeetCode503. 下一个更大元素 II、LeetCode42. 接雨水

一、LeetCode503. 下一个更大元素 II 题目链接&#xff1a;503. 下一个更大元素 II 题目描述&#xff1a; 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的…

LIMoE:使用MoE学习多个模态

文章链接&#xff1a;Multimodal Contrastive Learning with LIMoE: the Language-Image Mixture of Experts 发表期刊&#xff08;会议&#xff09;: NeurIPS 2022 目录 1.背景介绍稀疏模型 2.内容摘要Sparse Mixture-of-Experts ModelsContrastive LearningExperiment Analy…

Kubernetes入门笔记 ——(3)理解pod对象

为什么需要pod 最为熟知的一句话&#xff1a;pod是k8s的最小调度单位。刚开始听到这句话时会想&#xff0c;已经有容器了&#xff0c;k8s为什么还要搞个pod出来&#xff1f;容器和pod是什么关系&#xff1f;容器的本质是进程&#xff0c;而k8s本质上类似操作系统。 熟悉Linux的…

SpringBoot系列之启动成功后执行业务的方法归纳

SpringBoot系列之启动成功后执行业务逻辑。在Springboot项目中经常会遇到需要在项目启动成功后&#xff0c;加一些业务逻辑的&#xff0c;比如缓存的预处理&#xff0c;配置参数的加载等等场景&#xff0c;下面给出一些常有的方法 实验环境 JDK 1.8SpringBoot 2.2.1Maven 3.2…

欧拉回路欧拉路【详解】

1.引入 2.概念 3.解决方法 4.例题 5.回顾 1.引入 经典的七桥问题 哥尼斯堡是位于普累格河上的一座城市&#xff0c;它包含两个岛屿及连接它们的七座桥&#xff0c;如下图所示。 可否走过这样的七座桥&#xff0c;而且每桥只走过一次&#xff1f; 你怎样证明&#xff1f;…

Linux上使用独立显卡Tesla T4(测试视频压缩)

背景 将视频处理程序单独部署至K8S之外&#xff0c;使用独立GPU显卡的一台服务器上。 需事先对GPU性能做简单测试。 已通过zabbix对Linux进行了系统资源监控。 已通过PrometheusGrafana对显卡Tesla T4做了性能监控。 逐步补充&#xff0c;稍等 2023年12月6日 操作 查看当前…

鸿蒙Harmony开发初探

一、背景 9月25日华为秋季全场景新品发布会&#xff0c;余承东宣布鸿蒙HarmonyOS NEXT蓄势待发&#xff0c;不再支持安卓应用。网易有道、同程旅行、美团、国航、阿里等公司先后宣布启动鸿蒙原生应用开发工作。 二、鸿蒙Next介绍 HarmonyOS是一款面向万物互联&#xff0c;全…