介绍:这个项目是一个初学者项目,使用了Spring Boot三层架构的原理和Spring MVC的思想,希望能够帮助到一些初入Java这一行的同学理解项目的架构,去提升自己成长。
步骤1:新建数据库dsschool,新建数据表t_student,具体内容如图
附:数据库SQL文件内容,可复制语句快捷创建。
/*
Navicat Premium Data Transfer
Source Server : Mysql
Source Server Type : MySQL
Source Server Version : 80030
Source Host : localhost:3306
Source Schema : dsschool
Target Server Type : MySQL
Target Server Version : 80030
File Encoding : 65001
Date: 19/08/2025 23:29:24
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_student
-- ----------------------------
DROP TABLE IF EXISTS `t_student`;
CREATE TABLE `t_student` (
`stuno` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`stuname` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
`stusex` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`stuno`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of t_student
-- ----------------------------
INSERT INTO `t_student` VALUES ('1', '赵一', '男');
INSERT INTO `t_student` VALUES ('2', '林二', '男');
INSERT INTO `t_student` VALUES ('3', '张三', '男');
INSERT INTO `t_student` VALUES ('4', '李四', '女');
SET FOREIGN_KEY_CHECKS = 1;
步骤2:新建Spring Boot项目,自定义命名即可。这里附上我的pom.xml文件内容,大家可以自行导入,然后刷新Maven依赖更新即可。
<?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.5.10</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gzlg</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</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-test</artifactId>
<version>3.0.3</version>
<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>
步骤3:修改application.properties配置文件,添加数据库配置。
# MySQL数据库连接配置
# 数据库配置参数
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/dsschool?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
步骤4:创建domain包(也叫实体类包,项目中专门用来存放实体类的包),在该包下创建与数据库t_student表对应的实体类Student,(数据库表的字段和实体类表的属性一一对应,并添加@Data依赖自动生成get,set,toString等方法。)
package com.gzlg.domain;
import lombok.Data;
@Data // 小辣椒
public class Student {
private String stuno;
private String stuname;
}
步骤5:创建repository包,创建StuRepository类,此层为dao层(也叫repository层,数据访问层),用于与数据库数据交互,这里使用代码定义一个查询数据库操作。
package com.gzlg.repository;
import com.gzlg.domain.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.*;
@Repository // 这个注解表示会创建一个对象,dao层对象的灵魂
public class StuRepository {
@Autowired // 依赖注入
private JdbcTemplate jdbcTemplate;
//JdbcTemplate是Spring框架提供的一个简化JDBC操作的模板类。它提供了大量的方法,
// 用于执行SQL查询、更新、存储过程等操作,并且自动处理了资源的释放(如关闭连接)。
public List<Student> findStudent(){
try {
String sql = "SELECT stuno,stuname from t_student";
// BeanProperty 类的属性 Row 表的一行数据 Mapper 映射
BeanPropertyRowMapper<Student> stuRowMapper = new BeanPropertyRowMapper<>(Student.class);
// 直接得到一蓝子 荷兰豆
List<Student> studentList = jdbcTemplate.query(sql, stuRowMapper);
return studentList;
} catch (DataAccessException e) {
e.printStackTrace();
return null;
}
}
}
步骤6:创建service包,创建StuService类,此层叫做Service层(业务逻辑层),用于处理Controller层传来的一些数据校验,例如密码、账号等一些操作,这里使用注入依赖的方式,调用dao层的数据查询方法。
package com.gzlg.service;
import com.gzlg.domain.Student;
import com.gzlg.repository.StuRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
public class StuService {
@Autowired // dao层对象的依赖
private StuRepository stuRepository;
public List<Student> findStudent() {
List<Student> studentList = stuRepository.findStudent();
return studentList;
}
}
步骤7:创建controller包,创建StuController类,此层叫做Controller层(又叫控制层、接口层),负责处理前端传过来的请求,编写接口。这里注入了依赖,用于调用service层(因为三层java架构遵循着一层调用一层的构思,不要跨层调用),并且编写了两个接口。
package com.gzlg.controller;
import com.gzlg.domain.Student;
import com.gzlg.service.StuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.List;
@Controller
public class StuController {
@Autowired
private StuService stuService;
@GetMapping("/index")
public String start(){
// 省略.html
return "showStu";
}
@RequestMapping(value = "/query", method = RequestMethod.GET)
public String query(Model model){
List<Student> student = stuService.findStudent();
model.addAttribute("result", student);
return "queryrs";
}
}
步骤8:编写前端模板文件,在resource资源文件夹下面创建templates文件夹,在该文件夹下创建showStu.html文件,这个文件发送一个路径为/query的get请求。
showStu.html文件内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/query" method="get">
<input type="submit" value="查询班级情况——三层架构">
</form>
</body>
</html>
步骤9:编写前端模板文件,在templates文件夹下新建queryrs.html,在<html>标签中引入thymeleaf模板,就是下面这句,引入后就可以使用thymeleaf的语句。
<html lang="en" xmlns:th="http://www.thymeleaf.org">
queryrs.html文件内容如下:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1">
<tr>
<td>学号</td>
<td>姓名</td>
</tr>
<tr th:each="stuent:${result}">
<td th:text="${stuent.stuno}"></td>
<td th:text="${stuent.stuname}"></td>
</tr>
</table>
</body>
</html>
至此,整个项目编写完毕,最后,我们进行最后一个演示阶段,帮助大家理解。
附件(项目目录):
步骤10:理解这个项目。
1.启动项目,输入localhost:8080/index路径,这个路径会调用到我们controller层的start方法,这个方法会return "showStu"; (意思就是直接返回到showStu.html),具体效果如图所示:
2.点击"查询班级情况——三层架构"按钮。
根据我们showStu的内容来分析,当我们点击这个按钮时,他会提交一个/query的get请求。
这个请求的方法会调用我们controller层的query方法,有意思的是,我们的query方法有一个model参数。
这个model参数是什么?Model参数其实不用你去传入数据,Model是一个接口,是一个模型,用于在控制层和视图之间传递数据,也就著名的Spring MVC思想,M是Model,它是一个虚拟的接口,你可以想象成一个不存在的空间,这个空间连接着V和C,V即视图View,也就是前端,C即Controller,也就是控制层,通过这个Model,我们的前端和后端进行交互,也就是Spring MVC。
回归正题,当我们点击"查询班级情况——三层架构"按钮后,调用了controller层的query方法,这个方法调用了service层查询数据,service层判断用户资格(当然这里判断语句没写,因为是”简洁版“),service层判断通过后,调用repository层的查询方法,repository查询数据库。查完之后,再逐级返回,图示如下,仅供参考。
我们controller层的query方法在调用service层的方法后,还使用了model模型的方法,将查询后的数据添加到Model模型里面。
model.addAttribute("result", student);
上面的代码student对象添加到Model模型,并取名result,最后query方法使用return代码返回到queryrs前端模板。
return "queryrs";
调用上述代码后,便会返回到静态文件queryrs.html页面,也就是说,我们点击按钮后,将查询数据库,并返回到queryrs模板。
3.最后的最后,我们分析queryrs模板,这个模板可以直接从model模型拿取属性。
模板这里从Model模型拿了一个叫result的属性,并取名叫做stuent,并使用增强for循环遍历这个属性。
最后的查询结果如图所示,至此,我们这个简单的三层架构+MVC框架的例子完成了。
制作不易 | 点个赞吧 | 我将在编程的路上持续更新!