Thymeleaf 本身是一个模板引擎,不直接提供数据库查询功能。要实现“查询数据库表的模板tpl,组装变量数据,生成页面返回前端”,你需要将 Thymeleaf 与一个数据访问层(如 Spring Data JPA、MyBatis 或 JDBC)结合使用,并在控制器(Controller)中完成数据组装和页面渲染。
核心流程如下:
- 数据层:使用 JPA Repository、MyBatis Mapper 或 JDBC Template 查询数据库,获取数据。
- 控制层:在 Controller 方法中调用数据层,将查询结果放入模型(Model)。
- 视图层: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 模板的基本用法。
3265

被折叠的 条评论
为什么被折叠?



