SpringBoot-学习笔记(基础)

news2024/12/25 1:02:12

文章目录

    • 1. 概念
      • 1.1 SpringBoot快速入门
      • 1.2 SpringBoot和Spring对比
      • 1.3 pom文件坐标介绍
      • 1.4 引导类
      • 1.5 修改配置
      • 1.6 读取配置
        • 1.6.1 读取配置信息
        • 1.6.2 读取配置信息并创建类进行封装
      • 1.7 整合第三方技术
        • 1.7.1 整合JUnit
        • 1.7.1 整合Mybatis
        • 1.7.1 整合Mybatis-Plus
        • 1.7.1 整合Druid
    • 2.数据层
      • 2.1 SSMP整合-基础数据库CRUD
      • 2.2 调试日志
      • 2.3 分页
      • 2.4 条件查询
    • 3.业务层
      • 3.1 业务层定义
      • 3.2 业务层快速开发
    • 4. 表现层
      • 4.1 表现层定义
      • 4.2 消息一致性处理
      • 4.3 前后端联调
      • 4.4 页面列表数据展示
      • 4.5 列表操作

1. 概念

SpringBoot是一个用于快速构建基于Spring框架的Java应用程序的开源框架。

  • 简化了Spring应用程序的配置和部署过程;
  • 提供了约定大于配置的原则,使得开发者能够更加专注于业务逻辑的实现。
    /

Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式
Spring存在的问题:

  1. 配置繁琐:然Spring的组件代码是轻量级的,但它的配置却是重量级。
  2. 依赖繁琐:项目的依赖管理也是一件耗时耗力的事情;

SpringBoot功能

  1. 自动配置
    Spring Boot根据应用程序的依赖关系和类路径上的库,自动配置应用程序的各个组件,包括数据库连接、Web开发、安全性等。这样可以减少手动配置的工作量,提高开发效率。
  2. 起步依赖
    Spring Boot提供了一系列的Starter依赖,通过引入这些依赖,可以快速集成常用的技术栈和框架,如Spring MVC、Spring Data、JPA、Thymeleaf等。Starter依赖简化了依赖管理和版本控制的工作。
  3. 嵌入式容器
    Spring Boot集成了一些常用的嵌入式Servlet容器(如Tomcat、Jetty),可以将应用程序打包成可执行的JAR文件或WAR文件,方便部署和运行,不需要额外安装独立的Web服务器。
    4.配置管理
    Spring Boot支持多种配置文件格式,如properties、YAML等,可以方便地管理应用程序的配置信息。它还提供了属性绑定和配置注解等特性,简化了配置的读取和使用。

1.1 SpringBoot快速入门

视频:https://www.bilibili.com/video/BV15b4y1a7yG

实现步骤
① 创建Maven项目
② 导入SpringBoot起步依赖
③ 定义Controller
④ 编写引导类
⑤ 启动测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
<!--		<version>3.1.3</version>-->
		<version>2.7.7</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

  <!-- Generated by https://start.springboot.io -->
  <!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn -->
	<groupId>com.example</groupId>
	<artifactId>springboot_01_01_quickstart</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot_01_01_quickstart</name>
	<description>springboot_01_01_quickstart</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<version>2.7.3</version>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

创建controller类

package com.example.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping
    public String getById(){
        System.out.println("springboot 启动");
        return "SpringBootRunning";
    }
}

启用quickstart测试
在这里插入图片描述
在这里插入图片描述

1.2 SpringBoot和Spring对比

类/配置文件SpringSpringBoot
pom文件坐标手工勾选添加
web3.0配置类手工
配置类手工
控制器手工手工

1.3 pom文件坐标介绍

spring-boot-starter-parent坐标

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.7</version>
		<relativePath/>
	</parent>

介绍

  • spring-boot-starter-parent是一个Spring Boot的父POM(开发SpringBoot程序需要继承这个坐标)
  • 定义了依赖管理、构建配置、插件配置

优势

  • 简化配置:pring-boot-starter-parent包含了很多相关的子坐标或者叫依赖项。这些依赖项是Spring Boot项目常用的库和框架,例如Spring核心库、Spring Data、Spring MVC、Jackson等。
  • 统一管理:通过使用父POM,可以统一管理项目中使用的依赖库的版本,从而避免了不同项目之间因为依赖版本不一致而产生的兼容性问题。
  • 提高效率:通过使用父POM,可以方便地添加和管理常用的依赖库,从而提高了开发效率。

SpringBoot Start系列
Spring Boot Start系列是Spring Boot提供的一系列starter依赖项,用于简化Spring应用程序的构建和依赖管理

优势

  • 定义了当前项目使用的所有依赖,以达到减少配置的目的;
  • 每个Start根据功能不同,包含了多个相关依赖坐标;
  • 可以达到快速配置,简化配置的目的

类型:

坐标说明
spring-boot-starter:这是Spring Boot应用程序的基本构建器,包含了Spring Boot的核心功能和基本依赖项。
spring-boot-starter-web:用于构建Web应用程序的starter,包含了Spring MVC、Spring Web、Spring Data、Jackson等依赖项。
spring-boot-starter-data-jpa:提供了基于Spring Data的JPA数据访问抽象,简化了数据库操作。
spring-boot-starter-data-rest:提供了基于Spring Data Rest的数据暴露抽象,可以快速搭建RESTful API。
spring-boot-starter-jdbc:提供了基于Spring JDBC的数据库访问抽象,简化了数据库操作。
spring-boot-starter-amqp:用于构建基于RabbitMQ的消息传递应用程序的starter。
spring-boot-starter-integration:提供了基于Spring Integration模块的集成抽象,简化了业务集成开发。
spring-boot-starter-test:提供了用于单元测试、集成测试和端到端测试的依赖项。

spring-boot-starter-web

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<version>2.7.3</version>
		</dependency>

介绍

  • spring-boot-starter-web是一个Spring Boot的starter坐标,用于快速搭建一个基于Spring的Web项目。
  • 它包含了构建Web应用程序所需的依赖库和配置,包括Spring MVC、Spring Web、Spring Data、Jackson等

优势

  • 简化配置:通过内嵌Servlet容器,Spring Boot得以简化配置,不再需要打成war包部署到容器中。开发者只需打成一个可执行的jar包
  • 自动配置:Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。
    在这里插入图片描述

1.4 引导类

启动类:

  • 是整个程序的执行入口
  • 功能:初始化一个Spring容器,扫描引导类所在的包加载bean
package com.example;

import com.example.controller.TestController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;


//SpringBootApplication:
//Spring Boot提供的核心注解,它包含了@Configuration、@EnableAutoConfiguration、@ComponentScan等注解的功能。
@SpringBootApplication
public class Springboot0101QuickstartApplication {

	public static void main(String[] args) {

//SpringApplication.run方法来启动Spring Boot应用程序
		ConfigurableApplicationContext context = SpringApplication.run(Springboot0101QuickstartApplication.class, args);
		TestController bean = context.getBean(TestController.class);
		System.out.println(bean);
	}

}

1.5 修改配置

配置文档:
https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

查询方法
在这里插入图片描述
在这里插入图片描述
寻找配置
在这里插入图片描述

SpringBoot配置方式

  • application.properties
  • application.yml
  • application.yaml
--------------------application.properties------------------------
server.port=8080  
spring.datasource.url=jdbc:mysql://localhost:3306/mydb  
spring.datasource.username=root  
spring.datasource.password=password

---------------------application.yml(主流)/application.yaml-------------------------------
server:  
  port: 8080  
spring:  
  datasource:  
    url: jdbc:mysql://localhost:3306/mydb  
    username: root  
    password: password

1.修改端口配置
在resources下的application.properties文件中添加端口

#修改服务器端口
server.port=80

重启服务器
在这里插入图片描述
2 修改banner
banner就是启动springboot那个图片

#修改banner
#关闭
spring.main.banner-mode=off

3.修改日志

#日志
#只调错误的
logging.level.root=error

1.6 读取配置

1.6.1 读取配置信息

server:
  port: 81

@Value(value = “${server.port}”):
这个注解用于注入环境变量server.port的值到类的成员变量port中。这里使用了Spring的注解@Value,它可以将外部的配置属性注入到Spring Bean中。

package com.example.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {


    @Value(value = "${server.port}")
    private Integer port;

    @GetMapping
    public String getById(){
        System.out.println("springboot 启动");
        System.out.println("当前的端口:"+port);
        return "SpringBootRunning";
    }
}

在这里插入图片描述


方法2:先加载所有配置,在读取需要的


    //加载所有配置
    @Autowired
    private Environment env;
    
    @GetMapping
    public String getById(){
        System.out.println("springboot 启动");
        System.out.println("当前的端口:"+env.getProperty("server.port"));
        return "SpringBootRunning";
    }

1.6.2 读取配置信息并创建类进行封装

步骤:

  1. 创建类用于封装yaml文件中对应的数据
  2. 定义Springboot管控的bean
  3. 指定特定的属性
package com.example;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

//1.创建类用于封装yaml文件中对应的数据
//2. 定义Springboot管控的bean
@Component

//3.指定特定的属性
@ConfigurationProperties(prefix = "datasource")
@Data
public class MyDataSource {
    private String driver;
    private String url;
    private String username;
    private String password;


}

测试:

@Autowired
    private MyDataSource myDataSource;

    @GetMapping
    public String getById(){
        System.out.println("springboot 启动");
        System.out.println(myDataSource);
        return "SpringBootRunning";
    }

在这里插入图片描述

1.7 整合第三方技术

1.7.1 整合JUnit

介绍
JUnit是一个Java语言的单元测试框架,用于编写和运行可重复的测试。它是用于单元测试框架体系xUnit的一个实例,可以用于进行单元测试(即白盒测试)。

步骤:

  1. 导入测试对应的starter
  2. 测试类使用@SpringBootTest修饰
  3. 使用自动装配的形式添加要测试的对象
package com.example.dao;

public interface BooDao {
    public void save();
}
-----------------------------------------------------
package com.example.dao.impl;

import com.example.dao.BooDao;
import org.springframework.stereotype.Repository;

//@Repository是一个注解,用于标识数据访问对象(DAO)组件
@Repository
public class BookDaoImpl implements BooDao {
    @Override
    public void save() {
        System.out.println("book dao is runing");
    }
}
--------------------------------------------------
package com.example;

import com.example.dao.BooDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Springboot0101QuickstartApplicationTests {

	//1.注入要测试的对象
	@Autowired
	private BooDao booDao;

	//02.执行要测试的对应的方法
	@Test
	void contextLoads() {
		System.out.println("执行测试");
		booDao.save();
	}
}


在这里插入图片描述

1.7.1 整合Mybatis

步骤:

  1. 导入对应的starter;
  2. 配置相关信息;
  3. 定义数据层接口与映射配置;
  4. 测试类中注入dao接口,测试功能;

1.导入对应的starter

<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.2.0</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

2.配置相关信息

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: dbc:mysql://localhost:3306/db1
    username: root
    password: 123456

3.定义数据接口层和映射层

package com.example.domain;


import lombok.Data;

@Data
public class User {
    private int id;
    private String username;
    private String password;
}

-----------------------------------------------------------
package com.example.dao;

import com.example.domain.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

//用户增删改查接口
@Mapper
public interface UserDao {

    @Insert("INSERT INTO tb_user values (null,#{username},#{password})")
    public void save(User user);

    @Update("UPDATE tb_user set username=#{username},password=#{password} where id=#{id}")
    public void update(User user);

    @Delete("DELETE from tb_user where id = #{id}")
    public void delete(Integer id);

    @Select("SELECT * FROM tb_user")
    public List<User> selectAll();

    @Select("SELECT * FROM tb_user WHERE id=#{id}")
    public User selectById(Integer id);

}

4.编写测试类

package com.example;

import com.example.dao.BooDao;
import com.example.dao.UserDao;
import com.example.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class Springboot0101QuickstartApplicationTests {

	//1.注入要测试的对象

	@Autowired
	private UserDao userDao;

	//02.执行要测试的对应的方法
	@Test
	void contextLoads() {
		System.out.println("执行测试");
		List<User> users = userDao.selectAll();
		System.out.println(users);
	}


}

在这里插入图片描述

1.7.1 整合Mybatis-Plus

Mybatis和Mybatis-plus有什么区别?
- 导入坐标不同
- 数据层实现简化

步骤:

  1. 导入对应的starter;
  2. 定义数据层接口与映射配置,继承BaseMapper
  3. 定义数据层接口与映射配置;
  4. 测试类中注入dao接口,测试功能;
<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.4.3</version>
		</dependency>
@Mapper
public interface UserDaoPlus extends BaseMapper<User> {

其他和mybatis类似
在这里插入图片描述

1.7.1 整合Druid

地址:https://blog.csdn.net/qq_47436772/article/details/115185046

Druid是一种分布式的数据存储和查询系统,旨在支持实时数据分析。

  • Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控
  • 它采用分布式架构,可以处理大规模的数据流,并提供实时聚合和查询功能。
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.5</version>
</dependency>

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db1
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSourceC3P0Adapter

在这里插入图片描述

2.数据层

2.1 SSMP整合-基础数据库CRUD

步骤:

  1. 导入坐标
  2. 配置相关信息
  3. 编写domain/dao文件
  4. 实现测试
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.7</version>
		<relativePath/>
	</parent>


	<groupId>com.example</groupId>
	<artifactId>springboot_01_01_quickstart</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot_01_01_quickstart</name>
	<description>springboot_01_01_quickstart</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<version>2.7.3</version>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.2.0</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.4.3</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.2.5</version>
		</dependency>


	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

server:
  port: 81



spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db1
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource

mybatis-plus:
  global-config:
    db-config:
      table-prefix: tb_user
package com.example.domain;


import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName(schema = "db1", value = "tb_user")
public class User {
    private int id;
    private String username;
    private String password;
}
-----------------------------------------------------------
package com.example.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.domain.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

//用户增删改查接口
@Mapper
public interface UserDaoPlus extends BaseMapper<User> {

}


测试

package com.example.dao;

import com.example.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
public class UserDaoTastCase {
    @Autowired
    private UserDaoPlus userDaoPlus;



    @Test
    void testGetById(){
        User user = userDaoPlus.selectById(1);
        System.out.println("根据id查用户");
        System.out.println(user);
    }

    @Test
    void testDelete(){
        userDaoPlus.deleteById(2);
        System.out.println("删除用户");
    }
}

在这里插入图片描述
在这里插入图片描述

2.2 调试日志

配置方式开启日志,设置日志输出方式为标准输出

mybatis-plus:
  global-config:
    db-config:
      table-prefix: tb_user
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

2.3 分页

步骤

  1. 使用IPage封装分页数据
  2. 分页操作依赖MyBatisPlus分页拦截器实现功能
  3. 借助MyBatisPlus日志查阅执行SQL语句
@Test
void testGetPage(){
	IPage page = new Page(1,5);
	bookDao.selectPage(page,null);
}

在这里插入图片描述

IPage对象中封装了分页操作中的所有数据

  • 数据;当前页面值;每页数据总量;最大页码值;数据总量;

在这里插入图片描述
使用MyBatisPlus拦截器实现条件限制

package com.example.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //1.定义Mp拦截器
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
       
        //2.添加具体的拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mpInterceptor;
    }
}

再次运行
在这里插入图片描述

2.4 条件查询

步骤

  1. 使用QueryWrapper对象封装查询条件
  2. 推荐使用LambdaQueryWrapper对象
  3. 所有查询操作封装成方法调用
  4. 查询条件支持动态条件拼装
//使用QueryWrapper对象封装查询条件,推荐使用LambdaQueryWrapper对象,所有查询操作封装成方法调用
    @Test
    void testGetByCondition(){
        IPage page = new Page(1,10);
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(User::getUsername,"tudou");
        userDaoPlus.selectPage(page, wrapper);
    }

    @Test
    void testGetByConditions(){
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.like("password","888");
        userDaoPlus.selectList(userQueryWrapper);
    }

在这里插入图片描述
在这里插入图片描述

3.业务层

3.1 业务层定义

  • 接口
  • 实现类
package com.example.service;

import com.example.domain.User;

import java.util.List;

public interface UserService {
    boolean save(User user);
    boolean delete(Integer id);
    boolean update(User user);
    User getById(Integer id);
    List<User> getAll();
    
}

package com.example.service.impl;

import com.example.dao.UserDaoPlus;
import com.example.domain.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

public class UserServiceImpl implements UserService {

    @Autowired
    UserDaoPlus userDaoPlus;

    @Override
    public boolean save(User user) {
        return userDaoPlus.insert(user)>0;
    }

    @Override
    public boolean delete(Integer id) {
        return userDaoPlus.deleteById(id)>0;
    }

    @Override
    public boolean update(User user) {
        return userDaoPlus.updateById(user)>0;
    }

    @Override
    public User getById(Integer id) {
        return userDaoPlus.selectById(id);
    }

    @Override
    public List<User> getAll() {
        return userDaoPlus.selectList(null);
    }
}

测试定义

package com.example.service;

import com.example.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserServiceTestCase {
    @Autowired
    private UserService userService;

    @Test
    void testGetById(){
        userService.getById(7);
    }

    @Test
    void testGetAll(){
        userService.getAll();
    }

    @Test
    void testInsert(){
        User user = new User();
        user.setUsername("新生");
        user.setPassword("202392");
        userService.save(user);
    }
}

测试结果

3.2 业务层快速开发

  • 使用MyBatisPlus提供有业务层通用接口(ISerivce)与业务层通用实现类(ServiceImpl<M,T>)
  • 在通用类基础上做功能重载或功能追加

接口

package com.example.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.domain.User;

import java.io.Serializable;

//定义业务层接口
public interface IUserService extends IService<User> {
    @Override
    default boolean save(User entity) {
        return IService.super.save(entity);
    }

    @Override
    default boolean removeById(Serializable id) {
        return IService.super.removeById(id);
    }

    @Override
    default boolean updateById(User entity) {
        return IService.super.updateById(entity);
    }

    @Override
    default User getById(Serializable id) {
        return IService.super.getById(id);
    }
}

接口实现类

package com.example.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.dao.UserDaoPlus;
import com.example.domain.User;
import com.example.service.IUserService;
import org.springframework.stereotype.Service;

@Service
public class IUserServiceImpl extends ServiceImpl<UserDaoPlus, User> implements IUserService {

}

测试

package com.example.service;

import com.example.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserServiceTestCase {
    @Autowired
    private IUserService iUserService;

    @Test
    void testGetById(){
        iUserService.getById(1);
    }

    @Test
    void testInsert(){
        User user = new User();
        user.setUsername("又梨");
        user.setPassword("221133");
        iUserService.save(user);

    }

    @Test
    void deleteTest(){
        iUserService.removeById(7);
    }
}

4. 表现层

4.1 表现层定义

  1. 基于Restful制作表现层接口
    新增:POST
    删除:DELETE
    修改:PUT
    查询:GET
  2. 接收参数
    实体数据:@RequestBody
    路径变量:@PathVariable
package com.example.controller;

import com.example.domain.User;
import com.example.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private IUserService userService;

    @GetMapping
    List<User> getAll(){
        return userService.list();
    }

    @GetMapping("/{id}")
    User getById(@PathVariable Integer id){
        return userService.getById(id);
    }

    @PostMapping
    Boolean save(@RequestBody User user){
        return userService.save(user);
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2 消息一致性处理

  • 设计表现层返回结果的模型类,用于后端与前端进行数据格式统一,也称为前后端数据协议。
  • 表现层接口统一返回值类型结果
package com.example.controller;

import lombok.Data;

//返回结果的模型类
@Data
public class ResultModel {
    private Boolean flag;
    private Object data;

    public ResultModel() {
    }

    public ResultModel(Boolean flag) {
        this.flag = flag;
    }

    public ResultModel(Boolean flag, Object data) {
        this.flag = flag;
        this.data = data;
    }
}

package com.example.controller;

import com.example.domain.User;
import com.example.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private IUserService userService;

    @GetMapping
    ResultModel getAll(){
        List<User> list = userService.list();
        return new ResultModel(true,list);
    }

    @GetMapping("/{id}")
    ResultModel getById(@PathVariable Integer id){
        User byId = userService.getById(id);
        return new ResultModel(true,byId);
    }

    @PostMapping
    ResultModel save(@RequestBody User user){
        boolean save = userService.save(user);
        return new ResultModel(save);
    }
}

在这里插入图片描述
在这里插入图片描述

4.3 前后端联调

  • 前后端分离结构设计中页面归属前端服务器
  • 单体工程中页面放置在resources目录下的static目录中(建议执行clean)
    在这里插入图片描述

在这里插入图片描述

Vue.js是一种流行的JavaScript框架,用于构建用户界面。
它的核心思想是组件化,即将应用程序分解为一系列可复用的组件,这些组件可以组合起来构建更复杂的应用程序。

  • Vue.js作为前端框架,主要负责处理用户界面和用户交互,将用户的操作转化为数据并展示出来。
    在前端开发中,Vue.js作为视图层,与业务逻辑层进行交互,接收来自业务逻辑层的数据,并将其展示到页面上。同时,也可以将用户的操作转化为数据发送给业务逻辑层进行处理。

<script>
    var vue = new Vue({
        el: '#app',
        data:{
            dataList: [],//当前页要展示的列表数据
            dialogFormVisible: false,//添加表单是否可见
            dialogFormVisible4Edit:false,//编辑表单是否可见
            formData: {},//表单数据
            rules: {//校验规则
                type: [{ required: true, message: '图书类别为必填项', trigger: 'blur' }],
                name: [{ required: true, message: '图书名称为必填项', trigger: 'blur' }]
            },
            pagination: {//分页相关模型数据
                currentPage: 1,//当前页码
                pageSize:10,//每页显示的记录数
                total:0//总记录数
            }
        },

        //钩子函数,VUE对象初始化完成后自动执行
        created() {
        },

        methods: {
            //列表
            getAll() {
            },

            //弹出添加窗口
            handleCreate() {
            },

            //重置表单
            resetForm() {
            },

            //添加
            handleAdd () {
            },

            //取消
            cancel(){
            },
            // 删除
            handleDelete(row) {
            },

            //弹出编辑窗口
            handleUpdate(row) {
            },

            //修改
            handleEdit() {
            },

            //分页查询

            //切换页码
            handleCurrentChange(currentPage) {
            },

            //条件查询
        }
    })

</script>

钩子函数
是一种特殊的函数,其主要作用是处理拦截在软件组件之间传递的函数调用或事件或消息。钩子函数可以用来处理特定事件,或者在特定的函数调用前后执行自定义的逻辑。

在这里插入图片描述

/钩子函数,VUE对象初始化完成后自动执行
        created() {
            this.getAll();
        },

        methods: {
            //列表
            getAll() {
                console.log("run")
                //发送异步请求
                axios.get("/user").then((res)=>{
                    console.log(res.data);
                });

            },

在这里插入图片描述

4.4 页面列表数据展示

将查询数据返回到页面,利用前端数据双向绑定进行数据展示

 //钩子函数,VUE对象初始化完成后自动执行
        created() {
            this.getAll();
        },

        methods: {
            //列表
            getAll() {
                //发送异步请求
                axios.get("/user").then((res)=>{
                    this.dataList=res.data.data;
                });

            }

列表页
在这里插入图片描述

4.5 列表操作

  1. 请求方式使用POST调用后台对应操作
  2. 添加操作结束后动态刷新页面加载数据
  3. 根据操作结果不同,显示对应的提示信息
  4. 弹出添加Div时清除表单数据

新增
在这里插入图片描述

//弹出添加窗口
            handleCreate() {
                this.dialogFormVisible = true;
            },

在这里插入图片描述

清除数据

resetForm() {
this.formData = {};
},
//弹出添加窗口
handleCreate() {
this.dialogFormVisible = true;
this.resetForm();
}

添加
在这里插入图片描述

            //添加
            handleAdd () {
                //发送异步请求
                axios.post("/user",this.formData).then((res)=>{
                         //如果操作成功,关闭弹层,显示数据
                    if(res.data.flag){
                        this.dialogFormVisible = false;
                        this.$message.success("添加成功");
                    }else {
                        this.$message.error("添加失败");
                    }
                }).finally(()=>{
                    this.getAll();
                });
            },

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

取消添加

//取消
cancel(){
this.dialogFormVisible = false;
this.$message.info("操作取消");
},

在这里插入图片描述

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

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

相关文章

stm32HAL库 G4 SPI 从机DMA可变长度接受数据乱码问题

使用一个引脚当作SPI CS, 边沿触发; 在电平位0时候接受SPI数据20个字节 如果实际主机只发了小于20字节时候, 下一个帧就会错乱; 去老外找了之后,需要复位SPi RCC时钟才能复位掉SPI 下面的不行 正确的做法

Redis集群操作-----主从互换

一、将节点cluster1的主节点7000端口的redis关掉 [rootredis-cluster1 src]# ps -ef |grep redis 二、查看集群信息&#xff1a;

JavaScript实现系统级别的取色器、EyeDropper、try、catch、finally

文章目录 效果图htmlJavaScript关键代码EyeDroppertry...catch颜色值相减(色差)的传送门 效果图 html <div class"d_f fd_c ai_c"><button id"idBtn" class"cursor_pointer">开始取色</button><div id"idBox" c…

Java-Optional类

概述 Optional是JAVA 8引入的一个类&#xff0c;用于处理可能为null的值。 利用Optional可以减少代码中if-else的判断逻辑&#xff0c;增加代码的可读性。且可以减少空指针异常的发生&#xff0c;增加代码的安全性。 常用的方法 示例 代码 public class OptionalTest {pub…

我能“C“——指针进阶(上)

目录 指针的概念 1. 字符指针 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 4. 数组参数、指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 5. 函数指针 阅读两段有趣的代码&…

2023年打脸面试官之TCP--瞬间就懂

1.TCP 三次握手之为什么要三次呢&#xff1f;事不过三&#xff1f; 过程如下图&#xff1a; 先来解释下上述的各个标志的含义 序列号seq&#xff1a;占4个字节&#xff0c;用来标记数据段的顺序&#xff0c;TCP把连接中发送的所有数据字节都编上一个序号&#xff0c;第一个字节…

python3.11教程2:基础数据类型(数字和字符串)、组合数据类型(集合、元组、列表、字典)

文章目录 五、基本数据类型5.1 整数和浮点数5.1.1 整数和浮点数的类型5.1.2 进制和进制转换5.1.3 round函数 5.2 运算符5.2.1 常用运算符、运算符函数和逻辑运算符5.2.2 位运算符5.2.3 运算符的优先级及其进阶使用 5.3 布尔类型5.4 字符串5.3.1 字符串的基本操作5.3.2 字符串函…

揭秘大厂面试成功秘籍:V2.0版面试指南全新上线

我们程序员这一群体&#xff0c;大家都知道最好的涨薪方法是通过跳槽&#xff0c;在你把一个公司的精华都吸收完之后&#xff0c;有追求的肯定会跳去更好的公司发展自己&#xff0c;特别在金三银四&#xff0c;金九银十这样的招聘旺季里 &#xff0c;会有很多需要准备的面试会有…

Nginx配置及优化3

Nginx配置及优化3 一、网页状态页二、nginx第三方模块2.1、echo模块 三、变量3.1、内置变量3.1.1、常用的内置变量3.1.2、举个例子 3.2、自定义变量 四、自定义访问日志优化4.1、自定义访问日志的格式4.2、自定义json格式日志 五、nginx压缩功能六、HTTPS功能6.1、nginx的HTTPS…

【C语言】字符函数,字符串函数,内存函数

大家好&#xff01;今天我们来学习C语言中的字符函数&#xff0c;字符串函数和内存函数。 目录 1. 字符函数 1.1 字符分类函数 1.2 字符转换函数 1.2.1 tolower&#xff08;将大写字母转化为小写字母&#xff09; 1.2.2 toupper&#xff08;将小写字母转化为大写字母&…

把c++的函数导出为dll文件

目录 什么是dll文件 把c函数变为dll有什么好处 开始教程 打开Visual Studio 2022创建 调整编译器设置 创建头文件 DLL1.h 创建源文件编辑函数内容 DLL1.cpp 编译成dll文件 什么是dll文件 DLL&#xff08;Dynamic Link Library&#xff0c;动态链接库&#xff09;是一种…

1、Nginx 简介

文章目录 1、Nginx 简介1.1 Nginx 概述1.2 Nginx 作为 web 服务器1.3 正向代理1.4 反向代理1.5 负载均衡1.6 动静分离 【尚硅谷】尚硅谷Nginx教程由浅入深 志不强者智不达&#xff1b;言不信者行不果。 1、Nginx 简介 1.1 Nginx 概述 Nginx (“engine x”) 是一个高性能的 HT…

嵌入式如何入门?

学好嵌入式的前提是精通C语言。虽然在大学期间可能不需要参加电赛或者与老师合作项目&#xff0c;但C语言的学习却必不可少。如果把切菜比作厨师的基本功&#xff0c;那么C语言就是嵌入式程序员的基本功。因此&#xff0c;很多招聘公司会通过考察面试者的C语言来评判其水平。 另…

vue 根据数值判断颜色

1.首先style样式给两种颜色 用:class 三元运算符判断出一种颜色 第一步&#xff1a;在style里边设置两种颜色 .green{color: green; } .orange{color: orangered; }在取数据的标签 里边 判断一种颜色 :class"item.quote.current >0 ?orange: green"<van-gri…

服务器监控可视化

IT监控可视化是一种将IT监控数据以图形化的方式呈现给用户的技术&#xff0c;可以帮助用户更直观、更易懂地了解IT系统的运行状况。服务器监控可视化是其中的一个重要应用场景&#xff0c;可以将服务器的各种性能指标以图表、仪表盘等形式展示&#xff0c;以便管理员更好地了解…

多级缓存 架构设计

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;多次遇到一个很重要的面试题&#xff1a; 20w的QPS的场景下&#xff0c;服务端架构应如何设计&#xff1f;10w的QPS…

4G版本云音响设置教程阿里云平台版本

4G版本云音响设置教程介绍 第一章 介绍了在阿里云物联网平台生一个设备使用的三元素 第二章 转换阿里云三元素 为MQTT参数&#xff0c;并下载到设备中 第三章 阿里云物联网套件协议使用说明&#xff0c;如何发送数据至设备并播放 目录 4G版本云音响设置教程介绍 一、申请设…

常用查看linux服务器配置命令

常用查看服务器配置命令 查看内存 free -h查看cpu lscpu cat /proc/cpuinfo查看操作系统版本 uname -a cat /etc/redhat-release #centos系统查看查看磁盘空间 df -h lsblk fdisk -l查看指定目录大小 du -sh 查看环境变量资源 env其他命令查看 hostname # 查看计算…

一款不能错过的Git客户端:Fork for Mac,让你的代码管理更便捷

Fork for Mac是一款强大的Git客户端&#xff0c;让用户在Mac电脑上更方便地进行版本控制和代码管理。它具有以下特点&#xff1a; 易用性&#xff1a;Fork for Mac界面简洁明了&#xff0c;操作简单易懂&#xff0c;让用户可以快速上手。功能强大&#xff1a;支持各种Git功能&…