Notas de estudio de SpringBoot (básico)

1. Concepto

Spring Boot es un marco de código abierto para aplicaciones Java 用于快速构建basado en SpringBoot.Spring框架

  • 简化了Springel 配置和部署proceso de solicitud;
  • Los principios proporcionados 约定大于配置permiten a los desarrolladores centrarse más en la implementación de la lógica empresarial.
    /

Spring Boot no es una mejora funcional de Spring, sino una forma de utilizar Spring rápidamente .
Problemas con la primavera:

  1. La configuración es engorrosa : aunque el código del componente Spring es liviano, su configuración es pesada.
  2. La dependencia es engorrosa : la gestión de la dependencia del proyecto también requiere mucho tiempo y trabajo;

Función de arranque de primavera

  1. Configuración automática
    Spring Boot configura automáticamente los diversos componentes de la aplicación, incluida la conectividad de la base de datos, el desarrollo web, la seguridad y más, en función de las dependencias y bibliotecas de la aplicación en el classpath. Esto puede reducir la carga de trabajo de la configuración manual y mejorar la eficiencia del desarrollo.
  2. Dependencia inicial
    Spring Boot proporciona una serie de dependencias iniciales. Al introducir estas dependencias, puede integrar rápidamente marcos y pilas de tecnología de uso común, como Spring MVC, Spring Data, JPA, Thymeleaf, etc. Las dependencias iniciales simplifican el trabajo de gestión de dependencias y control de versiones.
  3. Contenedor integrado
    Spring Boot integra algunos contenedores de servlet integrados de uso común (como Tomcat, Jetty) y puede empaquetar aplicaciones en archivos JAR ejecutables o archivos WAR para una fácil implementación y operación sin la instalación adicional de un servidor web separado.
    4. Gestión de la configuración
    Spring Boot admite una variedad de formatos de archivos de configuración, como propiedades, YAML, etc., que pueden administrar fácilmente la información de configuración de la aplicación. También proporciona funciones como enlace de propiedades y anotaciones de configuración, que simplifican la lectura y el uso de la configuración.

1.1 Inicio rápido de SpringBoot

Vídeo: https://www.bilibili.com/video/BV15b4y1a7yG

Pasos de implementación
① Crear proyecto Maven
② Importar dependencias de inicio de SpringBoot
③ Definir controlador
④ Escribir clase de arranque
⑤ Iniciar la prueba

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí


<?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>

Crear la clase de controlador

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";
    }
}

Habilitar prueba de inicio rápido
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

1.2 Comparación entre SpringBoot y Spring

archivo de clase/configuración Primavera arranque de primavera
coordenadas del archivo pom manual Marque para agregar
clase de configuración web3.0 manual ninguno
clase de configuración manual ninguno
controlador manual manual

1.3 Introducción a las coordenadas del archivo pom

1.3.1 coordenadas spring-boot-starter-parent

coordenadas spring-boot-starter-parent

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

introducir

  • spring-boot-starter-parent es un POM principal de Spring Boot (el desarrollo de programas SpringBoot debe heredar esta coordenada)
  • Define la gestión de dependencias, la configuración de compilación y la configuración de complementos.

Ventaja

  • Configuración simplificada: pring-boot-starter-parent contiene muchas subcoordenadas o dependencias relacionadas. Estas dependencias son bibliotecas y marcos comúnmente utilizados en proyectos Spring Boot, como la biblioteca Spring Core, Spring Data, Spring MVC, Jackson, etc.
  • Gestión unificada: al utilizar el POM principal, la versión de la biblioteca dependiente utilizada en el proyecto se puede gestionar de forma unificada, evitando así problemas de compatibilidad entre diferentes proyectos debido a versiones de dependencia inconsistentes.
  • Mejore la eficiencia: al utilizar el POM principal, las bibliotecas dependientes de uso común se pueden agregar y administrar fácilmente, mejorando así la eficiencia del desarrollo.

SpringBoot Start系列
La serie Spring Boot Start es una serie de dependencias iniciales proporcionadas por Spring Boot para simplificar la construcción y la gestión de dependencias de las aplicaciones Spring.

Ventaja

  • Todas las dependencias utilizadas por el proyecto actual están definidas para lograr el propósito de reducir la configuración;
  • Cada Inicio contiene múltiples coordenadas de dependencia relacionadas según diferentes funciones;
  • Puede lograr el propósito de una configuración rápida y una configuración simplificada.

tipo:

coordinar ilustrar
arrancador de arranque de primavera: Este es el constructor básico para una aplicación Spring Boot, que contiene la funcionalidad principal y las dependencias básicas de Spring Boot.
spring-boot-starter-web: Un iniciador para crear aplicaciones web, incluidas dependencias como Spring MVC, Spring Web, Spring Data y Jackson.
spring-boot-starter-datos-jpa: Proporciona abstracción de acceso a datos JPA basada en Spring Data, lo que simplifica las operaciones de la base de datos.
spring-boot-starter-data-rest: Proporciona una abstracción de exposición de datos basada en Spring Data Rest, que puede crear rápidamente una API RESTful.
spring-boot-starter-jdbc: Proporciona una abstracción de acceso a la base de datos basada en Spring JDBC, que simplifica las operaciones de la base de datos.
spring-boot-starter-amqp: Un iniciador para crear aplicaciones de mensajería basadas en RabbitMQ.
integración de arranque de arranque de primavera: Proporciona una abstracción de integración basada en el módulo Spring Integration, que simplifica el desarrollo de la integración empresarial.
prueba de arranque de primavera: Se proporcionan dependencias para pruebas unitarias, pruebas de integración y pruebas de un extremo a otro.
arranque-de-primavera-arranque-hoja de tomillo Thymeleaf es un motor de plantillas, una herramienta de desarrollo web que combina plantillas y datos y genera documentos finales utilizando thymeleaf.

1.3.2 coordenadas web de inicio de arranque de primavera

spring-boot-starter-web

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

introducir

  • spring-boot-starter-web es una coordenada inicial de Spring Boot para construir rápidamente un proyecto web basado en Spring.
  • Contiene las bibliotecas dependientes y las configuraciones necesarias para crear aplicaciones web, incluidas Spring MVC, Spring Web, Spring Data, Jackson, etc.

Ventaja

  • Configuración simplificada: al incorporar el contenedor de servlet, Spring Boot puede simplificar la configuración y ya no es necesario implementarlo en el contenedor como un paquete de guerra. Los desarrolladores solo necesitan crear un paquete jar ejecutable
  • Configuración automática: Spring Boot puede configurar beans automáticamente de acuerdo con las clases y paquetes jar en la ruta de clase actual. Por ejemplo, agregar un iniciador spring-boot-starter-web puede tener funciones web sin otra configuración.
    inserte la descripción de la imagen aquí

1.3.3 inicio rápido de hoja de tomillo

Thymeleaf es un motor de plantillas Java que se puede utilizar para crear páginas web dinámicas y páginas web estáticas.
Ventajas de Thymeleaf:

  • Aparece como un atributo de html para garantizar que no se destruya la estructura gramatical completa de html: al devolver directamente la ruta del archivo de plantilla, Thymeleaf puede mantener la estructura gramatical completa de html para garantizar que la página se muestre y represente correctamente.
  • El navegador puede obtener una vista previa directa del archivo de plantilla sin soporte del lado del servidor: dado que Thymeleaf puede devolver directamente la ruta del archivo de plantilla al cliente, el navegador puede abrir y obtener una vista previa directamente del archivo de plantilla sin soporte del lado del servidor.

usando spring-boot-starter-thymeleaf

paso:

  1. importar coordenadas
  2. Escribe la clase de controlador.
  3. Configure el prefijo y el sufijo de la página web en el archivo de la aplicación
  4. Cree un directorio de plantillas en el recurso para almacenar archivos html (cambie el recurso de un directorio normal a un directorio de código fuente)
  5. prueba

1. Importar coordenadas

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

2. Escribe la clase de controlador.

package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
public class TestController {
    
    
    @RequestMapping("/test")
    public String thymeleaf(Model model){
    
    
        model.addAttribute("name","nini");
        return "hello";//返回模板名,与模板文件名对应
    }
}

3. Configure el prefijo y el sufijo de la página web en el archivo de la aplicación.

#配置网页前缀和后缀
#配置网页前缀和后缀
#classpath:/templates/,表示模板文件位于项目的/src/main/resources/templates/目录下。
#.html,表示模板文件的扩展名为.html。

spring.thymeleaf.prefix = classpath:/templates/
spring.thymeleaf.suffix = .html 

4. Cree un directorio de plantillas en el recurso para almacenar archivos html (cambie el recurso de un directorio normal a un directorio de código fuente)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>hello_jaja_thy</h1>
<!--th:text="${title}"是一个Thymeleaf表达式语言(TEL)表达式。它表示将模板中的文本内容替换为Spring控制器传递给模板的模型属性。-->
<p th:text="'hello:'+${name}" ></p>
</body>
</html>

inserte la descripción de la imagen aquí
5. Prueba
inserte la descripción de la imagen aquí

1.4 Clase de arranque

Clase de inicio:

  • es el punto de entrada de ejecución de todo el programa
  • Función: inicializa un contenedor Spring, escanea el paquete donde se encuentra la clase de arranque para cargar beans
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 modificar configuración

Documentación de configuración:
https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

Método de consulta
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Buscar configuración
inserte la descripción de la imagen aquí

Método de configuración SpringBoot

  • propiedades.de.aplicación
  • aplicación.yml
  • aplicación.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. Modifique la configuración del puerto.
Agregue el puerto al archivo application.properties en recursos.

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

Reinicie el servidor
inserte la descripción de la imagen aquí
2 para modificar el banner
banner es iniciar la imagen de springboot

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

3. Modificar registro

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

1.6 Leer configuración

1.6.1 Leer información de configuración

server:
  port: 81

@Value(value = "${server.port}"):
esta anotación se utiliza para inyectar el valor de la variable de entorno server.port en el puerto de la variable miembro de la clase. Aquí se utiliza la anotación @Value de Spring, que puede inyectar propiedades de configuración externas en 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";
    }
}

inserte la descripción de la imagen aquí


Método 2: cargue todas las configuraciones primero y luego lea las requeridas


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

1.6.2 Leer información de configuración y crear clases para encapsulación

paso:

  1. Cree una clase para encapsular los datos correspondientes en el archivo yaml
  2. Definir los beans controlados por Springboot
  3. especificar atributos específicos
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;


}

prueba:

@Autowired
    private MyDataSource myDataSource;

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

inserte la descripción de la imagen aquí

1.7 Integrar tecnología de terceros

1.7.1 Integración de JUnit

Introducción
JUnit es un marco de pruebas unitarias del lenguaje Java para escribir y ejecutar pruebas repetibles. Es una instancia de xUnit, un sistema marco de pruebas unitarias, y puede usarse para pruebas unitarias (es decir, pruebas de caja blanca).

paso:

  1. Importar el iniciador correspondiente a la prueba.
  2. La clase de prueba está decorada con @SpringBootTest
  3. Agregar objetos para probar usando cableado automático
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();
	}
}


inserte la descripción de la imagen aquí

1.7.1 Integrar Mybatis

paso:

  1. Importar el motor de arranque correspondiente;
  2. Información relacionada con la configuración;
  3. Definir la interfaz de la capa de datos y la configuración del mapeo;
  4. Inyecte la interfaz dao en la clase de prueba para probar la función;

1. Importar el motor de arranque correspondiente

<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. Información relacionada con la configuración

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

3. Definir la capa de interfaz de datos y la capa de mapeo.

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. Escribe la clase de prueba.

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);
	}


}

inserte la descripción de la imagen aquí

1.7.1 Integrar Mybatis-Plus

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

paso:

  1. Importar el motor de arranque correspondiente;
  2. Definir la interfaz de la capa de datos y la configuración del mapeo, heredar BaseMapper
  3. Definir la interfaz de la capa de datos y la configuración del mapeo;
  4. Inyecte la interfaz dao en la clase de prueba para probar la función;
<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.4.3</version>
		</dependency>
@Mapper
public interface UserDaoPlus extends BaseMapper<User> {
    
    

Otros son similares a mybatis.
inserte la descripción de la imagen aquí

1.7.1 Integración druida

Dirección: https://blog.csdn.net/qq_47436772/article/details/115185046

Druid es un sistema de consulta y almacenamiento de datos distribuidos diseñado para admitir el análisis de datos en tiempo real.

  • Druid es una de las plataformas de código abierto de Alibaba 数据库连接池实现, que combina las ventajas de C3P0, DBCP y otros grupos de bases de datos, y agrega monitoreo de registros al mismo tiempo.
  • Adopta una arquitectura distribuida, puede manejar flujos de datos a gran escala y proporciona funciones de consulta y agregación en tiempo real.
<!-- 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

inserte la descripción de la imagen aquí

2. Capa de datos

2.1 Integración SSMP: base de datos básica CRUD

paso:

  1. importar coordenadas
  2. Información relacionada con la configuración
  3. Escribir archivo de dominio/dao
  4. implementar prueba
<?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> {
    
    

}


prueba

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("删除用户");
    }
}

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

2.2 Registro de depuración

Abra el registro en el modo de configuración y configure el modo de salida del registro en salida estándar

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

inserte la descripción de la imagen aquí

2.3 Paginación

paso

  1. Utilice IPage para encapsular datos de paginación
  2. La operación de paginación se basa en el interceptor de paginación MyBatisPlus para implementar la función.
  3. Verifique y ejecute declaraciones SQL con la ayuda de los registros MyBatisPlus
@Test
void testGetPage(){
    
    
	IPage page = new Page(1,5);
	bookDao.selectPage(page,null);
}

inserte la descripción de la imagen aquí

Todos los datos de la operación de paginación se encapsulan en el objeto IPage

  • Datos; valor de la página actual; cantidad total de datos por página; valor máximo del número de página; cantidad total de datos;

inserte la descripción de la imagen aquí
Utilice el interceptor MyBatisPlus para implementar restricciones condicionales

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;
    }
}

corre de nuevo
inserte la descripción de la imagen aquí

2.4 Consulta de condición

paso

  1. Utilice el objeto QueryWrapper para encapsular las condiciones de consulta
  2. Se recomienda utilizar el objeto LambdaQueryWrapper.
  3. Todas las operaciones de consulta se encapsulan en llamadas a métodos.
  4. Las condiciones de consulta admiten el ensamblaje de condiciones dinámicas
//使用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);
    }

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

3. Capa empresarial

3.1 Definición de capa empresarial

  • interfaz
  • Clase de implementación
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);
    }
}

definición de prueba

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);
    }
}

Resultados de la prueba

3.2 Rápido desarrollo de la capa empresarial

  • Utilice MyBatisPlus para proporcionar una interfaz común para la capa empresarial (ISerivce) y una clase de implementación común para la capa empresarial (ServiceImpl<M,T>)
  • Realice sobrecarga de funciones o adición de funciones sobre la base de clases comunes

interfaz

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);
    }
}

clase de implementación de interfaz

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 {
    
    

}

prueba

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. Capa de presentación

4.1 Definición de capa de presentación

  1. Cree una interfaz de capa de presentación basada en Restful
    Agregar: POST
    Eliminar: DELETE
    Modificar: PUT
    Consulta: GET
  2. Recibir parámetro
    Datos de entidad: @RequestBody
    Variable de ruta: @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);
    }
}

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

4.2 Procesamiento de coherencia de mensajes

  • Diseñe la clase de modelo del resultado devuelto por la capa de presentación, que se utiliza para unificar el formato de datos entre el backend y el frontend, también conocido como protocolo de datos frontend y backend.
  • La interfaz de la capa de presentación devuelve uniformemente resultados de tipo de valor.
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);
    }
}

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

4.3 Depuración conjunta de front-end y back-end

  • Las páginas pertenecen al servidor front-end en el diseño de la estructura de separación de front-end y back-end
  • Las páginas del proyecto único se colocan en el directorio estático debajo del directorio de recursos (se recomienda limpiar)
    inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Vue.js es un marco de JavaScript popular para crear interfaces de usuario.
Su idea central es la componenteización, que consiste en descomponer una aplicación en una serie de componentes reutilizables que se pueden combinar para crear aplicaciones más complejas.

  • Como marco de front-end, Vue.js es el principal responsable de procesar la interfaz de usuario y la interacción del usuario, convertir las operaciones del usuario en datos y mostrarlos.
    En el desarrollo front-end, Vue.js actúa como capa de vista, interactúa con la capa de lógica empresarial, recibe datos de la capa de lógica empresarial y los muestra en la página. Al mismo tiempo, las operaciones del usuario también se pueden convertir en datos y enviarse a la capa de lógica empresarial para su procesamiento.

<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>

Una función de enlace
es una función especial cuya función principal es interceptar llamadas a funciones, eventos o mensajes pasados ​​entre componentes de software. Las funciones de enlace se pueden utilizar para manejar eventos específicos o ejecutar lógica personalizada antes y después de llamadas a funciones específicas.

inserte la descripción de la imagen aquí

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

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

            },

inserte la descripción de la imagen aquí

4.4 Visualización de datos de lista de páginas

Devuelva los datos de la consulta a la página y utilice el enlace bidireccional de datos de front-end para la visualización de datos

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

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

            }

Lista
inserte la descripción de la imagen aquí

4.5 Operaciones de lista

  1. El método de solicitud utiliza POST para llamar a la operación correspondiente en segundo plano.
  2. Actualiza dinámicamente la página para cargar datos después de la operación de adición.
  3. Dependiendo del resultado de la operación, se mostrará la información del mensaje correspondiente
  4. Borrar datos del formulario cuando la ventana emergente agrega Div

Agregar
inserte la descripción de la imagen aquí

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

inserte la descripción de la imagen aquí

borrar datos

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

añadir
inserte la descripción de la imagen aquí

            //添加
            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();
                });
            },

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

cancelar agregando

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

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/meini32/article/details/132544107
Recomendado
Clasificación