首页 > 编程语言 >2024年1月Java项目开发指南5:controller、service、mapper

2024年1月Java项目开发指南5:controller、service、mapper

时间:2024-01-25 15:45:42浏览次数:24  
标签:mapper java service Controller import Java 注解

准备工作

你知道什么是JSON吗?
JSON是什么?
格式是什么?
有什么用?
有什么优点?
有什么缺点?

请自己百度探索一下,对JSON做了个了解,如果你不知道什么是JSON的话,知道就免了,直接下一步吧。

image

开始:项目目录结构

image

先确保你已经创建了上图的那些文件夹。这都是我们需要用到。简单的做个介绍

controller层:里面存放的都是 有什么用
service层:里面存放的是 有什么用
mapper层:里面存放的是 有什么用
resource里面的mapper文件夹,里面存放的是 有什么用

在Spring Boot项目中,采用分层的架构模式是很常见的,这样可以将不同的关注点分离,使得代码更加清晰、可维护和可测试。以下是关于controller层、service层和mapper层以及resource里面的mapper文件夹的详细说明:

Controller层

Controller层(有时也被称为Web层或表示层)是处理HTTP请求的入口点。它的主要职责是:

  • 接收来自客户端(如浏览器或其他HTTP客户端)的请求。
  • 调用Service层的方法来处理业务逻辑。
  • 返回响应给客户端,通常是以HTML、JSON或XML格式。
  • 处理异常和错误,并将适当的错误消息返回给客户端。
  • 可以进行数据的简单转换和格式化,以符合客户端的需求。

Controller类通常使用Spring MVC的注解,如@RestController@RequestMapping@GetMapping@PostMapping等,来定义路由和处理HTTP方法。

Service层

Service层(也被称为业务逻辑层)是应用程序的核心,它包含了执行特定业务任务的逻辑。它的主要职责是:

  • 实现应用程序的业务逻辑。
  • 调用Mapper层(或DAO层)的方法来与数据库交互。
  • 执行数据验证和转换。
  • 处理业务规则和逻辑。
  • 管理事务。
  • 可以调用其他服务(如外部API)来执行集成操作。

Service类通常不包含与特定HTTP方法或路由相关的代码,而是专注于实现可重用的业务功能。

Mapper层

Mapper层(也被称为数据访问层或DAO层)负责与数据库交互。它的主要职责是:

  • 定义与数据库表对应的接口。
  • 使用MyBatis的注解或XML映射文件来编写SQL语句。
  • 执行CRUD(创建、读取、更新、删除)操作。
  • 处理数据库连接和事务。
  • 将数据库查询结果映射到Java对象(实体或DTO)。

Mapper接口通常不包含任何业务逻辑,而是专注于数据库操作的实现。

resource里面的mapper文件夹

src/main/resources目录下的mapper文件夹通常用于存放MyBatis的XML映射文件。这些文件的作用包括:

  • 定义SQL语句,包括查询、插入、更新和删除操作。
  • 使用动态SQL来构建复杂的查询。
  • 定义结果映射,将数据库表的行映射到Java对象的属性。
  • 可以包含存储过程、函数和触发器的定义。

XML映射文件为SQL语句的编写提供了更大的灵活性,特别是当SQL语句很复杂或需要动态生成时。它们通过namespace和id与Mapper接口的方法关联起来。

综上所述,每一层都有其特定的职责,通过分层架构可以实现关注点分离,使得代码更加模块化、可维护和可扩展。

好的,你不需要看的很明白,大概知道有什么用就行了.

现在,请跟我一步一步的写代码

例如我们刚才生成了用户对象(Users)

image

Controller层编写

那我们就在controller层下创建一个Users相关接口的文件 UsersControllerjava

image

在文件里面写上@Controller注解表示这是一个controller层的文件

除了写@Controller还可以写@RestController
那这两东西有啥不一样呢?我们后面再来探究,你可以简单阅读下面文字做一个了解

Controller, RestController的不同点

@Controller:标识一个Spring类是Spring MVC controller处理器

@RestController:@RestController是@Controller和@ResponseBody的结合体,两个标注合并起来的作用。

@Controller类中的方法可以直接通过返回String跳转到jsp、ftl、html等模版页面。在方法上加@ResponseBody注解,也可以返回实体对象。

@RestController类中的所有方法只能返回String、Object、Json等实体对象,不能跳转到模版页面。

好,我们先来编写一个查询用户的接口

image


    // 读取用户列表
    @GetMapping
    @ResponseBody
    public List<Users> readAllUsers() {
        return usersService.readAllUsers();
    }

首先搞清楚这两个注解:

@GetMapping 是指的接受Get请求
@ResponseBody 是指返回的是数据,而不是视图

@ResponseBody
@ResponseBody 是一个表示方法返回值应该直接写入 HTTP 响应体(body)的注解,而不是被解析为一个视图名称。通常,这意味着返回的数据会被转换成一个特定的格式,如 JSON 或 XML,然后发送给客户端。
或者,如果你使用的是 Spring 4.0 或更高版本,你可以使用 @RestController 注解来代替 @Controller,这样类中的所有方法都会默认加上 @ResponseBody:

然后搞清楚返回的数据类型:List
就是说,以Users对象为元素构成的列表

继续,可以看到方法体就调用了service层的方法。
我们要调用service层的方法,需要先去写

@Autowired
    private UsersService usersService;

在Spring框架中,@Autowired是一个注解,用于自动装配bean依赖。

这里的意思是,Spring容器会自动查找一个类型为UsersService的bean,并将其注入到usersService字段中。这样,你就可以在当前的类中直接使用usersService来调用UsersService中的方法,而不需要手动去获取或创建UsersService的实例。

这个过程是自动的,因此称为自动装配(Autowiring)。Spring通过扫描你的应用程序中的bean定义和它们之间的关系,能够自动地解决许多依赖关系,从而减少了手动配置的工作量。

写了这个之后我们就可以直接在方法体里面调用usersService的方法了。

那么我们接下来的任务,就是写usersService

Service层编写

先创建文件(interface java)
image

image

继续创建impl文件夹,然后在这个文件夹下面创建UsersServiceImpl.java
image

image

image

先编写 UsersService.java 这个interface java文件


package cc.xrilang.serversystem.service;

import cc.xrilang.serversystem.domain.Users;
import java.util.List;

public interface UsersService {
    List<Users> readAllUsers();
}

再去UsersServiceImpl.java文件中,编写这个方法的具体实现

image

package cc.xrilang.serversystem.service.impl;

import cc.xrilang.serversystem.domain.Users;
import cc.xrilang.serversystem.mapper.UsersMapper;
import cc.xrilang.serversystem.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UsersServiceImpl implements UsersService {

    @Autowired
    private UsersMapper usersMapper;

    @Override
    public List<Users> readAllUsers() {
        return usersMapper.selectAllUsers();
    }


}

service层就这样了,具体数据是通过mapper层去操作数据库数据的,接下来就去写mapper文件

Mapper

创建对应的mapper文件(interface java)

image

image

不要忘记了添加@Mapper注解

image

利用注解的方式写SQL语句,如下图
image

package cc.xrilang.serversystem.mapper;

import cc.xrilang.serversystem.domain.Users;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface UsersMapper {

    @Select("SELECT * FROM users")
    List<Users> selectAllUsers();
}

到这一步,已经没有爆红的地方了。

配置文件检查

现在,让我们去检查一下配置文件application.properties

image

可以看到我们之前配置的路径和实际路径不符合,改为实际的路径。

image

运行
image

后端运行起来了,可是如何判断我们写的接口有没有问题呢,我们下一节,就是使用测试工具,对接口进行测试

哔哩哔哩/博客园/CSDN:萌狼蓝天
笔记首发博客园,自动同步CSDN。博客园笔记修改后不会自动同步修改内容到CSDN,悉知。

标签:mapper,java,service,Controller,import,Java,注解
From: https://www.cnblogs.com/mllt/p/17987264/project202401-5

相关文章

  • Java中SimpleDateFormat时YYYY与yyyy以及HH和hh的区别注意踩坑
    场景Java开发手册中为什么要求SimpleDateFormat时用y表示年,而不能用Y:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131052335在使用SimpleDateFormat在获取当前日期时因使用了YYYY导致20231231这个日期被格式化为20241231这里推荐在日期处理时统一使用封装工具......
  • java线程数量如何确定
    1.概述使用线程池的好处降低资源消耗:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,通过重复利用己创建的线程可以降低线程创建和销毁造成的消耗。提高响应速度:当任务到达时,可以不需要等待线程创建就能立即执行提高线程的可管理性:线程池提......
  • java线程池-2
    1.Executors创建线程池的潜在问题在很多公司的编程规范中,非常明确地禁止使用Executors创建线程池。为什么呢?这里从源码讲起,介绍使用Executors工厂方法创建线程池将会面临的潜在问题。1.1Executors创建固定数量的线程池的潜在问题使用newFixedThreadPool工厂方法固定数......
  • 2024年1月Java项目开发指南4:IDEA里配置MYSQL
    提前声明:文章首发博客园(cnblogs.com/mllt)自动“搬家”(同步)到CSDN,如果博客园中文章发生修改是不会同步过去的,所以建议大家到我的博客园中查看前提条件:1.你已经设计好了数据库,并成功创建了数据库。2.你的springboot项目中已经配置好了MySQL的连接。填写好信息后点测试连......
  • K8s笔记-使用 Service 把前端连接到后端
    1配置configMap1.1配置cm[root@k8s-master~]#kubectlexec-itnginx-deploy-78d8bf4fd7-2xtd2-ntest--sh-c"cat/etc/nginx/nginx.conf"[root@k8s-master~]#kubectlexec-itnginx-deploy-78d8bf4fd7-2xtd2-ntest--sh-c"cat/usr/share/ngi......
  • JavaScript 中 eval() 函数
    JavaScript的eval()函数的作用是将一个字符串作为脚本代码进行解析和执行。它可以动态地执行字符串中的JavaScript代码,并返回执行结果。eval()函数可以用于执行任何有效的JavaScript代码,包括声明变量、定义函数、执行表达式等。eval()函数的语法如下:varformArray=$('#formRec......
  • Java 中 float 与 double 的区别
    1.float是单精度浮点数,内存分配4个字节,占32位,有效小数位6-7位double是双精度浮点数,内存分配8个字节,占64位,有效小数位15位 2.java中默认声明的小数是double类型的,如doubled=4.0如果声明:floatx=4.0则会报错,需要如下写法:floatx=4.0f或者floatx=(float)4.0其中4.0f后......
  • HTTP连接池在Java中的应用:轻松应对网络拥堵
    网络拥堵是现代生活中无法避免的问题,尤其是在我们这个“点点点”时代,网页加载速度直接影响到我们的心情。此时,我们需要一位“救世主”——HTTP连接池。今天,就让我们一起探讨一下,这位“救世主”如何在Java中大显神通。首先,我们要明白,什么是HTTP连接池?简单来说,它就像一个“连接银行”......
  • 使用Java中的OkHttp库进行HTTP通信:快速、简单且高效
    在Java的世界里,进行HTTP通信的方式多种多样。其中,OkHttp以其简单、高效和强大的功能受到了开发者的广泛欢迎。今天,我们就来深入探讨如何使用OkHttp库在Java中进行HTTP通信。首先,OkHttp是一个基于HTTP/2和SPDY的客户端,提供了现代且高效的通信方式。它不仅支持同步请求和异步请求,还提......
  • java常用集合
    java集合,也叫作容器,主要是由两大接口派生而来:一个是Collection接口,主要用于存放单一元素;另一个是Map接口,主要用于存放键值对。对于Collection接口,下面又有三个主要的子接口:List、Set和Queue。Map主要实现类HashMap,LinkHashMap,HashTable,TreeMapList主要实现类Arra......