IT评测·应用市场-qidao123.com
标题:
【Java】springBoot初识(Web和数据库交互)
[打印本页]
作者:
用户云卷云舒
时间:
2024-9-30 21:10
标题:
【Java】springBoot初识(Web和数据库交互)
【Java】springBoot初识(Web和数据库交互)
!可以先跳过前序直接看项目示例
1.前序
1.1.sping
1.1.1.依靠注入(DI)
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void saveUser(User user) {
userRepository.save(user);
}
}
复制代码
字段注入:测试类
构造器注入:常用
why:
服务层中利用构造器注入的好处
不可变性
:构造器注入确保了依靠项在对象创建时就已经确定并且不可更改,这有助于保证对象的状态一致性。
明确性
:通过构造器显式地列出所有依靠项,可以清晰地展示哪些依靠项是必需的,这有助于提高代码的可读性和可维护性。
易于测试
:构造器注入使得对象更容易被测试,因为依靠项可以通过构造器传递给待测试的类。这使得我们可以很容易地为测试提供模拟对象。
强制依靠
:构造器注入有助于防止NullPointerException,因为在构造器中必须提供所有必需的依靠项。
易于调试
:由于构造器注入确保了所有依靠项在对象创建时就已经存在,因此更容易追踪和调试潜在的标题。
测试类中利用字段注入的好处
简化测试代码
:字段注入可以淘汰测试代码的复杂性,特别是在必要注入多个依靠项的情况下。这使得测试类更加简洁明了。
快速启动
:字段注入可以更快地启动测试环境,因为它不必要复杂的构造器和初始化逻辑。
易于明白和编写
:字段注入使得依靠关系的注入变得非常直观,开发者可以直接看到哪些依靠项被注入到了类中。
1.1.2.面向切面(AOP)
// 日志切面
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.SomeService.doSomething(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before " + joinPoint.getSignature().getName());
}
@After("execution(* com.example.service.SomeService.doSomething(..))")
public void logAfter(JoinPoint joinPoint) {
System.out.println("After " + joinPoint.getSignature().getName());
}
}
// 服务类
@Service
public class SomeService {
public void doSomething() {
// 业务逻辑
}
}
复制代码
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依靠的解释
<dependencies>
<!-- 1 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
</dependency>
<!-- 2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 3 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 4 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 5 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 6 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</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
<!-- 注释这个 -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-data-jpa</artifactId>-->
<!-- </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驱动的依靠:
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</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
<!-- pom.xml -->
<?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.3.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.exam</groupId>
<artifactId>projectOf002</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>projectOf002</name>
<description>projectOf002</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</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>
复制代码
2.HelloWorld.java
// HelloWorld.java
package com.exam.projectof002.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloWorld {
@GetMapping("/")
public String helloWorld() {
return "helloWorld";
}
}
复制代码
3.helloWorld.html
<!-- helloWorld.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>hello,world!</h1>
</body>
</html>
复制代码
4.application.properties
# application.properties
spring.application.name=projectOf002
spring.datasource.url=jdbc:mysql://localhost:3306/first
spring.datasource.username=root
spring.datasource.password=yourPassword
复制代码
5.MovieModel.java
// MovieModel.java
package com.exam.projectof002.model;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Data;
@Entity
@Data
@Table(name="second")
public class MovieModel {
@Id
@GeneratedValue
private Long id;
private String title;
private int year;
private String subject;
private String duration;
private String intro;
}
复制代码
6.MysqlRepository.java
// MysqlRepository.java
package com.exam.projectof002.dao;
import com.exam.projectof002.model.MovieModel;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface MysqlRepository extends JpaRepository<MovieModel,Long> {
}
复制代码
7.MysqlCrudService.java
// MysqlCrudService.java
package com.exam.projectof002.service;
import com.exam.projectof002.dao.MysqlRepository;
import com.exam.projectof002.model.MovieModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class MysqlCrudService {
private final MysqlRepository mysqlRepository;
@Autowired
public MysqlCrudService(MysqlRepository mysqlRepository) {
this.mysqlRepository = mysqlRepository;
}
public List<MovieModel> getAllMovies() {
return mysqlRepository.findAll();
}
}
复制代码
8.MysqlFindDataTest.java
// MysqlFindDataTest.java
package com.exam.projectof002;
import com.exam.projectof002.model.MovieModel;
import com.exam.projectof002.service.MysqlCrudService;
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 MysqlFindDataTest {
@Autowired
MysqlCrudService mysqlCrudService;
@Test
public void test() {
List<MovieModel> movieModelList=mysqlCrudService.getAllMovies();
for(MovieModel movieModel:movieModelList){
System.out.println(movieModel.getTitle());
}
}
}
复制代码
9.ShowMysqlData.java
// ShowMysqlData.java
package com.exam.projectof002.controller;
import com.exam.projectof002.dao.MysqlRepository;
import com.exam.projectof002.model.MovieModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.ui.Model;
import java.util.List;
@Controller
public class ShowMysqlData {
MysqlRepository mysqlRepository;
@Autowired
public ShowMysqlData(MysqlRepository mysqlRepository) {
this.mysqlRepository = mysqlRepository;
}
@GetMapping("/mysqlData")
public String showMysqlData(Model model) {
List<MovieModel> movieModelList = mysqlRepository.findAll();
model.addAttribute("movieModelList", movieModelList);
return "mysqlData";
}
}
复制代码
10.mysqlData.html
<!-- mysqlData.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>MysqlData</title>
<style>
table,th,td{
border: 1px solid black;
border-collapse: collapse;
padding: 8px;
}
</style>
</head>
<body>
<table>
<thead>
<tr>
<th>序号</th>
<th>电影名</th>
<th>出版年份</th>
<th>标语</th>
<th>片长</th>
<th>简介</th>
</tr>
</thead>
<tbody>
<tr th:each="movie : ${movieModelList}">
<td th:text="${movie.id}"></td>
<td th:text="${movie.title}"></td>
<td th:text="${movie.year}"></td>
<td th:text="${movie.subject}"></td>
<td th:text="${movie.duration}"></td>
<td th:text="${movie.intro}"></td>
</tr>
</tbody>
</table>
</body>
</html>
复制代码
4.结语
本人资历尚浅,发博客主要是记录与学习,接待大佬们批评指教!大家也可以在评论区多多交换,相互学习,共同成长。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4