【Java】springBoot初识(Web和数据库交互)

打印 上一主题 下一主题

主题 1019|帖子 1019|积分 3057

【Java】springBoot初识(Web和数据库交互)


  
!可以先跳过前序直接看项目示例
1.前序

1.1.sping

1.1.1.依靠注入(DI)

  1. public class UserService {
  2.     private final UserRepository userRepository;
  3.     @Autowired
  4.     public UserService(UserRepository userRepository) {
  5.         this.userRepository = userRepository;
  6.     }
  7.     public void saveUser(User user) {
  8.         userRepository.save(user);
  9.     }
  10. }
复制代码


  • 字段注入:测试类
  • 构造器注入:常用
  • why:
    服务层中利用构造器注入的好处

    • 不可变性:构造器注入确保了依靠项在对象创建时就已经确定并且不可更改,这有助于保证对象的状态一致性。
    • 明确性:通过构造器显式地列出所有依靠项,可以清晰地展示哪些依靠项是必需的,这有助于提高代码的可读性和可维护性。
    • 易于测试:构造器注入使得对象更容易被测试,因为依靠项可以通过构造器传递给待测试的类。这使得我们可以很容易地为测试提供模拟对象。
    • 强制依靠:构造器注入有助于防止NullPointerException,因为在构造器中必须提供所有必需的依靠项。
    • 易于调试:由于构造器注入确保了所有依靠项在对象创建时就已经存在,因此更容易追踪和调试潜在的标题。
    测试类中利用字段注入的好处
       

    • 简化测试代码:字段注入可以淘汰测试代码的复杂性,特别是在必要注入多个依靠项的情况下。这使得测试类更加简洁明了。
    • 快速启动:字段注入可以更快地启动测试环境,因为它不必要复杂的构造器和初始化逻辑。
    • 易于明白和编写:字段注入使得依靠关系的注入变得非常直观,开发者可以直接看到哪些依靠项被注入到了类中。

1.1.2.面向切面(AOP)

  1. // 日志切面
  2. @Aspect
  3. @Component
  4. public class LoggingAspect {
  5.     @Before("execution(* com.example.service.SomeService.doSomething(..))")
  6.     public void logBefore(JoinPoint joinPoint) {
  7.         System.out.println("Before " + joinPoint.getSignature().getName());
  8.     }
  9.     @After("execution(* com.example.service.SomeService.doSomething(..))")
  10.     public void logAfter(JoinPoint joinPoint) {
  11.         System.out.println("After " + joinPoint.getSignature().getName());
  12.     }
  13. }
  14. // 服务类
  15. @Service
  16. public class SomeService {
  17.     public void doSomething() {
  18.         // 业务逻辑
  19.     }
  20. }
复制代码
1.1.3.好处

依靠注入(DI)的好处

  • 降低耦合度:DI通过将对象的创建和依靠管理交给外部容器(如Spring容器),淘汰了对象之间的直接依靠,提高了代码的可维护性和机动性。
  • 易于测试:DI使得对象更容易被测试,因为依靠项可以通过构造器或其他方式传递给待测试的类。这使得我们可以很容易地为测试提供模拟对象。
  • 代码重用:通过将依靠项注入到多个类中,可以淘汰代码重复,提高代码复用性。
  • 更好的模块化:DI有助于将系统分解为更小、更独立的模块,这些模块之间通过接口举行通信,而不是直接调用实现。
  • 淘汰样板代码:DI框架(如Spring)可以自动处理惩罚依靠项的创建和烧毁,淘汰了必要手动编写的样板代码量。
面向切面编程(AOP)的好处

  • 分离关注点:AOP允许将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,使得业务逻辑更加清晰,同时也更容易维护这些横切关注点。
  • 代码重用:AOP通过界说切面来封装横切关注点的举动,使得这些举动可以在多个不同的地方重用,淘汰了代码重复。
  • 易于扩展:新的横切关注点可以通过界说新的切面来轻松添加,而无需修改现有的业务逻辑代码。
  • 模块化:AOP使得横切关注点成为独立的模块,这些模块可以独立于核心业务逻辑举行开发和维护。
  • 透明性:AOP可以使得某些横切关注点对业务逻辑来说几乎是透明的,即业务逻辑不必要知道这些关注点是怎样被处理惩罚的。
1.2.spingboot的作用


  • 简化配置:Spring Boot 内置了许多默认配置,这意味着开发者不必要编写大量的 XML 或 properties 文件来配置应用程序。Spring Boot 会自动配置许多常见的功能,如嵌入式服务器、安全、数据访问、日志记录等。
  • 自动配置:Spring Boot 提供了自动配置机制,它可以根据类路径中存在的 jar 包来自动配置 Spring Bean 和组件。这大大减轻了开发者手动配置的负担。
  • 依靠管理:Spring Boot 提供了一套默认的依靠管理战略,包括版本管理和依靠排除,使得开发者不必担心版本辩说标题。
  • 开箱即用的特性:Spring Boot 提供了许多开箱即用的功能,如嵌入式的 Tomcat、Jetty 或 Undertow 服务器,使得开发者可以快速启动 Web 应用程序,而无需额外配置服务器。
  • 生产预备特性:Spring Boot 提供了一些生产预备特性,如健康检查、监控指标、审计和外部配置管理等,这些特性使得应用程序更容易部署和管理。
  • 简化开发流程:Spring Boot 支持利用下令行界面(CLI)举行快速原型开发,并且提供了许多启动器(starter)项目,这些项目包含了一组预界说的依靠项,使得开发者可以快速搭建起基本的应用程序结构。
  • 易于创建独立的、生产级别的基于 Spring 的应用程序:Spring Boot 应用程序可以被打包成独立的 JAR 或 WAR 文件,这意味着应用程序可以作为一个单一的可执行文件运行,无需外部部署。
2.项目示例

2.1利用IDEA创建SpringBoot项目


点击next,进入依靠的选择

先选择这些依靠后点击create,之后刷新maven下载这些依靠

2.2依靠的解释


  1. <dependencies>
  2.    
  3.    
  4.     <!-- 1 -->
  5.         <dependency>
  6.         <groupId>org.springframework.boot</groupId>
  7.         <artifactId>spring-boot-starter-parent</artifactId>
  8.     </dependency>
  9.    
  10.    
  11.     <!-- 2 -->
  12.     <dependency>
  13.         <groupId>org.springframework.boot</groupId>
  14.         <artifactId>spring-boot-starter-test</artifactId>
  15.         <scope>test</scope>
  16.     </dependency>
  17.    
  18.    
  19.     <!-- 3 -->
  20.     <dependency>
  21.                         <groupId>org.springframework.boot</groupId>
  22.                         <artifactId>spring-boot-starter-web</artifactId>
  23.         </dependency>
  24.    
  25.    
  26.     <!-- 4 -->
  27.     <dependency>
  28.                         <groupId>org.springframework.boot</groupId>
  29.                         <artifactId>spring-boot-starter-thymeleaf</artifactId>
  30.         </dependency>
  31.    
  32.    
  33.     <!-- 5 -->
  34.     <dependency>
  35.                         <groupId>org.springframework.boot</groupId>
  36.                         <artifactId>spring-boot-starter-data-jpa</artifactId>
  37.         </dependency>
  38.    
  39.    
  40.     <!-- 6 -->
  41.     <dependency>
  42.         <groupId>org.projectlombok</groupId>
  43.         <artifactId>lombok</artifactId>
  44.         <optional>true</optional>
  45.     </dependency>
  46.    
  47.         
  48. </dependencies>
复制代码
1.spring-boot-starter-parent


  • 统一依靠版本管理:spring-boot-starter-parent界说了一系列Spring Boot依靠的版本号。当你在项目中添加Spring Boot相关的依靠时,不必要指定版本号,因为spring-boot-starter-parent已经为你指定了这些依靠的版本。
  • 提供默认配置:spring-boot-starter-parent包含了Spring Boot的一些默认配置,比如自动配置和启动器(starters)。这意味着你可以利用Spring Boot提供的自动配置功能,而不必要手动配置大量的XML或properties文件。
  • 简化项目结构:通过继承spring-boot-starter-parent,你可以在项目中利用Spring Boot的启动器(starters),这些启动器是预先配置好的依靠集合,可以帮助你快速搭建项目的底子结构。
  • 提供构建插件:spring-boot-starter-parent还提供了一些构建插件,如spring-boot-maven-plugin,这个插件可以用来打包Spring Boot应用程序,使其成为一个可执行的JAR文件。
2.spring-boot-starter-test


  • 简化测试依靠管理:spring-boot-starter-test包含了编写和运行Spring Boot应用程序测试所需的各种库。这包括JUnit、Mockito、Spring Test等,它们都是编写高质量测试的紧张工具。
  • 自动配置:spring-boot-starter-test提供了一些自动配置,使得开发者可以轻松地利用Spring Boot的测试支持特性,如自动配置测试环境、MockMVC等。
  • 简化测试代码:通过利用spring-boot-starter-test,开发者可以更容易地编写简洁的测试代码。例如,可以利用Spring Test的@RunWith(SpringRunner.class)和@SpringBootTest注解来配置测试上下文。
3.spring-boot-starter-web


  • 简化依靠管理:spring-boot-starter-web包含了创建Web应用程序所需的各种依靠,如Spring Web MVC、Spring WebFlux、Jackson JSON处理惩罚器等。利用这个启动器可以避免手动添加和管理这些依靠。
  • 自动配置:spring-boot-starter-web提供了一系列自动配置,使得开发者不必要编写大量的配置代码就可以启动一个Web应用。例如,它会自动配置嵌入式的Servlet容器(如Tomcat、Jetty或Undertow),以及Spring MVC相关的配置。
  • 简化开发过程:利用spring-boot-starter-web可以极大地简化Web应用的开发过程,使得开发者可以专注于业务逻辑的实现,而不是配置。
4.spring-boot-starter-thymeleaf


  • 简化依靠管理:spring-boot-starter-thymeleaf包含了Thymeleaf的核心库以及其他相关依靠,如Thymeleaf Spring Integration等。利用这个启动器可以避免手动添加和管理这些依靠。
  • 自动配置:spring-boot-starter-thymeleaf提供了一系列自动配置,使得开发者不必要编写大量的配置代码就可以利用Thymeleaf模板。例如,它会自动配置Thymeleaf的模板解析器和视图解析器。
  • 简化开发过程:利用spring-boot-starter-thymeleaf可以极大地简化Web应用的开发过程,使得开发者可以专注于业务逻辑的实现,而不是配置。
5.spring-boot-starter-data-jpa


  • 简化依靠管理:spring-boot-starter-data-jpa 包含了 JPA 实现(如 Hibernate)、JDBC 驱动、Spring Data JPA 等相关依靠,无需手动添加这些依靠。
  • 自动配置:Spring Boot 会自动配置 JPA 和相关的数据源(DataSource),开发者不必要手动配置大量的 XML 文件或 Java 配置类。
  • 简化开发过程:利用 spring-boot-starter-data-jpa 可以极大地简化数据访问层的开发过程,使得开发者可以专注于业务逻辑的实现。
6.lombok


  • @Getter 和 @Setter

    • 自动生成所有字段的 getter 和 setter 方法。
    • 可以指定 private、protected、public 等访问级别。

  • @Data

    • 结合了 @Getter、@Setter、@ToString、@EqualsAndHashCode 等注解的功能,适用于简单的 POJO 类。

2.3.spring-boot-starter-web与spring-boot-starter-thymeleaf的利用

源码在末了
我们单独测试这两项,以是将jpa依靠注释掉并刷新maven
  1.     <!-- 注释这个 -->
  2. <!--        <dependency>-->
  3. <!--                <groupId>org.springframework.boot</groupId>-->
  4. <!--                <artifactId>spring-boot-starter-data-jpa</artifactId>-->
  5. <!--        </dependency>-->
复制代码
创建cotroller包,在里面创建HelloWord类,写下如下代码


打开resources里面的templates,在里面创建helloWorld.html模板,写上如下代码


之后启动springBoot程序,并在浏览器访问http://127.0.0.1:8080/ (端口默以为8080) 则会看到hello,world字样


2.4 毗连mySQL数据库

首先取消对jpa依靠的注释,并刷新maven
由于是毗连mySQL数据库,以是我们还必要添加一个mySQL JDBC驱动的依靠:
  1.     <dependency>
  2.         <groupId>com.mysql</groupId>
  3.         <artifactId>mysql-connector-j</artifactId>
  4.         <scope>runtime</scope>
  5.     </dependency>
复制代码
配置application.properties文件,填写毗连mySQL的信息
first是我的一个数据库的名称


为first数据库中的表创建模型:
这是我的first数据库中的名为second的表

对应其表头创建模型


创建mySQL仓,里面有mySQL数据库增删改查的很多方法



利用findAll()方法找到second表中的所有数据并将电影名打印出来


写好测试类并运行,观看效果


2.5 将数据库中的表格在前端显示出来

写一个显示数据库数据的路由,读取数据库中的数据并将其添加到model中方便html模板调用


写html模板,将表second中的数据在前端呈现出来


运行springBoot程序,访问http://127.0.0.1:8080/mysqlData 可以看到以下的显示效果

3.源码

1.pom.xml

  1. <!-- pom.xml -->
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.         <modelVersion>4.0.0</modelVersion>
  6.         <parent>
  7.                 <groupId>org.springframework.boot</groupId>
  8.                 <artifactId>spring-boot-starter-parent</artifactId>
  9.                 <version>3.3.3</version>
  10.                 <relativePath/> <!-- lookup parent from repository -->
  11.         </parent>
  12.         <groupId>com.exam</groupId>
  13.         <artifactId>projectOf002</artifactId>
  14.         <version>0.0.1-SNAPSHOT</version>
  15.         <name>projectOf002</name>
  16.         <description>projectOf002</description>
  17.         <url/>
  18.         <licenses>
  19.                 <license/>
  20.         </licenses>
  21.         <developers>
  22.                 <developer/>
  23.         </developers>
  24.         <scm>
  25.                 <connection/>
  26.                 <developerConnection/>
  27.                 <tag/>
  28.                 <url/>
  29.         </scm>
  30.         <properties>
  31.                 <java.version>17</java.version>
  32.         </properties>
  33.         <dependencies>
  34.                 <dependency>
  35.                         <groupId>org.springframework.boot</groupId>
  36.                         <artifactId>spring-boot-starter-data-jpa</artifactId>
  37.                 </dependency>
  38.                 <dependency>
  39.                         <groupId>org.springframework.boot</groupId>
  40.                         <artifactId>spring-boot-starter-thymeleaf</artifactId>
  41.                 </dependency>
  42.                 <dependency>
  43.                         <groupId>org.springframework.boot</groupId>
  44.                         <artifactId>spring-boot-starter-web</artifactId>
  45.                 </dependency>
  46.                 <dependency>
  47.                         <groupId>org.projectlombok</groupId>
  48.                         <artifactId>lombok</artifactId>
  49.                         <optional>true</optional>
  50.                 </dependency>
  51.                 <dependency>
  52.                         <groupId>org.springframework.boot</groupId>
  53.                         <artifactId>spring-boot-starter-test</artifactId>
  54.                         <scope>test</scope>
  55.                 </dependency>
  56.                 <dependency>
  57.                         <groupId>com.mysql</groupId>
  58.                         <artifactId>mysql-connector-j</artifactId>
  59.                         <scope>runtime</scope>
  60.                 </dependency>
  61.         </dependencies>
  62.         <build>
  63.                 <plugins>
  64.                         <plugin>
  65.                                 <groupId>org.springframework.boot</groupId>
  66.                                 <artifactId>spring-boot-maven-plugin</artifactId>
  67.                                 <configuration>
  68.                                         <excludes>
  69.                                                 <exclude>
  70.                                                         <groupId>org.projectlombok</groupId>
  71.                                                         <artifactId>lombok</artifactId>
  72.                                                 </exclude>
  73.                                         </excludes>
  74.                                 </configuration>
  75.                         </plugin>
  76.                 </plugins>
  77.         </build>
  78. </project>
复制代码
2.HelloWorld.java

  1. // HelloWorld.java
  2. package com.exam.projectof002.controller;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. @Controller
  6. public class HelloWorld {
  7.     @GetMapping("/")
  8.     public String helloWorld() {
  9.         return "helloWorld";
  10.     }
  11. }
复制代码
3.helloWorld.html

  1. <!-- helloWorld.html -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <title>Title</title>
  7. </head>
  8. <body>
  9. <h1>hello,world!</h1>
  10. </body>
  11. </html>
复制代码
4.application.properties

  1. # application.properties
  2. spring.application.name=projectOf002
  3. spring.datasource.url=jdbc:mysql://localhost:3306/first
  4. spring.datasource.username=root
  5. spring.datasource.password=yourPassword
复制代码
5.MovieModel.java

  1. // MovieModel.java
  2. package com.exam.projectof002.model;
  3. import jakarta.persistence.Entity;
  4. import jakarta.persistence.GeneratedValue;
  5. import jakarta.persistence.Id;
  6. import jakarta.persistence.Table;
  7. import lombok.Data;
  8. @Entity
  9. @Data
  10. @Table(name="second")
  11. public class MovieModel {
  12.     @Id
  13.     @GeneratedValue
  14.     private Long id;
  15.     private String title;
  16.     private int year;
  17.     private String subject;
  18.     private String duration;
  19.     private String intro;
  20. }
复制代码
6.MysqlRepository.java

  1. // MysqlRepository.java
  2. package com.exam.projectof002.dao;
  3. import com.exam.projectof002.model.MovieModel;
  4. import org.springframework.data.jpa.repository.JpaRepository;
  5. import org.springframework.stereotype.Repository;
  6. @Repository
  7. public interface MysqlRepository extends JpaRepository<MovieModel,Long> {
  8. }
复制代码
7.MysqlCrudService.java

  1. // MysqlCrudService.java
  2. package com.exam.projectof002.service;
  3. import com.exam.projectof002.dao.MysqlRepository;
  4. import com.exam.projectof002.model.MovieModel;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. import java.util.List;
  8. @Service
  9. public class MysqlCrudService {
  10.     private final MysqlRepository mysqlRepository;
  11.     @Autowired
  12.     public MysqlCrudService(MysqlRepository mysqlRepository) {
  13.         this.mysqlRepository = mysqlRepository;
  14.     }
  15.     public List<MovieModel> getAllMovies() {
  16.         return mysqlRepository.findAll();
  17.     }
  18. }
复制代码
8.MysqlFindDataTest.java

  1. // MysqlFindDataTest.java
  2. package com.exam.projectof002;
  3. import com.exam.projectof002.model.MovieModel;
  4. import com.exam.projectof002.service.MysqlCrudService;
  5. import org.junit.jupiter.api.Test;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.test.context.SpringBootTest;
  8. import java.util.List;
  9. @SpringBootTest
  10. public class MysqlFindDataTest {
  11.     @Autowired
  12.     MysqlCrudService mysqlCrudService;
  13.     @Test
  14.     public void test() {
  15.         List<MovieModel> movieModelList=mysqlCrudService.getAllMovies();
  16.         for(MovieModel movieModel:movieModelList){
  17.             System.out.println(movieModel.getTitle());
  18.         }
  19.     }
  20. }
复制代码
9.ShowMysqlData.java

  1. // ShowMysqlData.java
  2. package com.exam.projectof002.controller;
  3. import com.exam.projectof002.dao.MysqlRepository;
  4. import com.exam.projectof002.model.MovieModel;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.ui.Model;
  9. import java.util.List;
  10. @Controller
  11. public class ShowMysqlData {
  12.     MysqlRepository mysqlRepository;
  13.     @Autowired
  14.     public ShowMysqlData(MysqlRepository mysqlRepository) {
  15.         this.mysqlRepository = mysqlRepository;
  16.     }
  17.     @GetMapping("/mysqlData")
  18.     public String showMysqlData(Model model) {
  19.         List<MovieModel> movieModelList = mysqlRepository.findAll();
  20.         model.addAttribute("movieModelList", movieModelList);
  21.         return "mysqlData";
  22.     }
  23. }
复制代码
10.mysqlData.html

  1. <!--  mysqlData.html -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <title>MysqlData</title>
  7.     <style>
  8.         table,th,td{
  9.             border: 1px solid black;
  10.             border-collapse: collapse;
  11.             padding: 8px;
  12.         }
  13.     </style>
  14. </head>
  15. <body>
  16. <table>
  17.     <thead>
  18.     <tr>
  19.         <th>序号</th>
  20.         <th>电影名</th>
  21.         <th>出版年份</th>
  22.         <th>标语</th>
  23.         <th>片长</th>
  24.         <th>简介</th>
  25.     </tr>
  26.     </thead>
  27.     <tbody>
  28.     <tr th:each="movie : ${movieModelList}">
  29.         <td th:text="${movie.id}"></td>
  30.         <td th:text="${movie.title}"></td>
  31.         <td th:text="${movie.year}"></td>
  32.         <td th:text="${movie.subject}"></td>
  33.         <td th:text="${movie.duration}"></td>
  34.         <td th:text="${movie.intro}"></td>
  35.     </tr>
  36.     </tbody>
  37. </table>
  38. </body>
  39. </html>
复制代码
4.结语

本人资历尚浅,发博客主要是记录与学习,接待大佬们批评指教!大家也可以在评论区多多交换,相互学习,共同成长。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表