介绍:这个项目是一个初学者项目,使用了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框架的例子完成了。

制作不易 | 点个赞吧 | 我将在编程的路上持续更新!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐