Thymeleaf结合JPA实现查询数据库表模板,动态生成页面渲染

Thymeleaf 本身是一个模板引擎,不直接提供数据库查询功能。要实现“查询数据库表的模板tpl,组装变量数据,生成页面返回前端”,你需要将 Thymeleaf 与一个数据访问层(如 Spring Data JPA、MyBatis 或 JDBC)结合使用,并在控制器(Controller)中完成数据组装和页面渲染。

核心流程如下:

  1. 数据层:使用 JPA Repository、MyBatis Mapper 或 JDBC Template 查询数据库,获取数据。
  2. 控制层:在 Controller 方法中调用数据层,将查询结果放入模型(Model)。
  3. 视图层:Thymeleaf 模板通过表达式从模型中获取并渲染数据。

一、项目结构与依赖

一个典型的 Spring Boot + Thymeleaf + JPA 项目依赖如下:

<!-- pom.xml -->
<dependencies>
    <!-- Spring Boot Web支持 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Thymeleaf 模板引擎 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <!-- Spring Data JPA 用于数据库操作 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!-- 数据库驱动,例如 MySQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

二、定义数据实体与 Repository

假设有一个 User 表,对应实体和存储库如下:

// User.java - 数据实体
import javax.persistence.*;

@Entity
@Table(name = "user") // 对应数据库中的 user 表
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String email;
    // 省略 getter/setter 和构造函数
}
// UserRepository.java数据访问层
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface UserRepository extends JpaRepository<User, Long> {
    // Spring Data JPA 会自动实现此方法 List<User> findAll();
}

三、编写控制器组装数据并返回视图

在 Controller 中查询数据并传递给 Thymeleaf 模板。

// UserController.java
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;

@Controller
public class UserController {

    private final UserRepository userRepository;

    // 通过构造器注入 Repository public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @GetMapping("/users")
    public String getUserList(Model model) {
        // 1. 查询数据库:获取所有用户数据 List<User> userList = userRepository.findAll();
 // 2. 组装变量数据:将查询结果放入 Model,供模板使用
        model.addAttribute("users", userList); // "users" 是模板中的变量名 model.addAttribute("pageTitle", "用户列表");
        
        // 3. 返回逻辑视图名,Thymeleaf 会自动渲染对应的模板文件 // 默认会查找 `src/main/resources/templates/user-list.html`
        return "user-list"; }
}

四、创建 Thymeleaf 模板渲染数据

src/main/resources/templates/ 目录下创建 user-list.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title th:text="${pageTitle}">用户列表</title>
    <!-- 引入 Bootstrap 样式 -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container mt-4">
        <h1 th:text="${pageTitle}">用户列表</h1>
        <table class="table table-striped">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>用户名</th>
                    <th>邮箱</th>
                </tr>
            </thead>
            <tbody>
                <!-- 使用 th:each 遍历控制器传入的 users 列表 -->
                <tr th:each="user : ${users}">
                    <td th:text="${user.id}">1</td>
                    <td th:text="${user.username}">admin</td>
                    <td th:text="${user.email}">admin@example.com</td>
                </tr>
                <!-- 如果列表为空,显示提示 -->
                <tr th:if="${users.isEmpty()}">
                    <td colspan="3" class="text-center">暂无用户数据</td>
                </tr>
            </tbody>
        </table>
    </div>
</body>
</html>

五、关键步骤与替代方案对比

步骤使用 Spring Data JPA (如上例)使用 MyBatis使用纯 JDBC Template
1. 数据查询通过继承 JpaRepository 的接口自动生成 SQL。需编写 XML 映射文件或注解定义 SQL。在 Service 或 Dao 中手动编写 SQL 字符串。
2. 数据组装在 Controller 中直接调用 Repository 方法。在 Controller 中调用 MyBatis Mapper 接口。在 Controller 中调用使用 JdbcTemplate 的 Service 类。
3. 返回视图完全相同:return "template-name";完全相同:return "template-name";完全相同:return "template-name";
模板渲染完全相同:Thymeleaf 通过 ${variable} 获取 Model 中的数据。完全相同:Thymeleaf 通过 ${variable} 获取 Model 中的数据。完全相同:Thymeleaf 通过 ${variable} 获取 Model 中的数据。

六、直接使用 JDBC Template 的代码示例

如果你不想用 JPA,以下是在 Service 层使用 JdbcTemplate 的示例:

// UserService.java
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

@Service
public class UserService {
    private final JdbcTemplate jdbcTemplate;

    public UserService(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public List<User> getAllUsers() {
        String sql = "SELECT id, username, email FROM user";
        return jdbcTemplate.query(sql, new RowMapper<User>() {
            @Override public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                User user = new User();
                user.setId(rs.getLong("id"));
                user.setUsername(rs.getString("username"));
                user.setEmail(rs.getString("email"));
                return user;
            }
        });
    }
}
// UserController.java (使用 JDBC Template 版本)
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/users")
    public String getUserList(Model model) {
        // 通过 Service 层调用 JdbcTemplate 查询数据库 model.addAttribute("users", userService.getAllUsers());
        model.addAttribute("pageTitle", "用户列表 (JDBC)");
        return "user-list"; // 使用同一个 Thymeleaf 模板 }
}

总结:Thymeleaf 生成页面的核心是 Controller从数据库获取数据 -> 存入 Model -> 模板渲染。数据库查询的具体技术选型(JPA/MyBatis/JDBC)不影响 Thymeleaf 模板的基本用法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI产品实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值