目录
(五)运行AccessingDataMysqlApplication
参考SpringBoot官网教程:
1.Validating Form Input
2.Handling Form Submission
3.Accessing data with MySQL
在pom.xml中引入以下依赖:
- ---------连接数据库----------
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>8.0.12</version>
- </dependency>
-
-
- -------用于启用JPA和Hibernate,实现数据的持久化-------
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
-
-
- -----------启用web应用程序----------
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
-
-
- --------用于构建交互的WEB应用程序-------
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </dependency>
-
-
- -------启用校验功能----------
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-validation</artifactId>
- <version>3.1.5</version>
- </dependency>
-
在application.properties中添加如下代码,连接数据库
- spring.jpa.hibernate.ddl-auto=update
- spring.datasource.url=jdbc:mysql://localhost:3306/db_example?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8
- spring.datasource.username=root
- spring.datasource.password=123456ab
- spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- #spring.jpa.show-sql: true
- # spring.thymeleaf.cache=false
- # spring.thymeleaf.prefix=classpath:/templates/
- # spring.thymeleaf.suffix=.html
也可以添加application.yml:
application.yml 的功能和 application.properties 是一样的,不过因为yml文件是树状结构,写起来有更好的层次感,更易于理解,所以很多人都选择了yml文件。
- spring:
- datasource:
- driver-class-name: com.mysql.jdbc.Driver
- url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=false
- username: root
- password: 123456ab
@Entity注解用于将一个类标识为 JPA 实体,它告诉 Hibernate 或其他 JPA 实现框架将这个类映射为数据库中的表
注:想深入学习校验方法及注释的小伙伴可以看看这个:
如何在 Spring/Spring Boot 中优雅地做参数校验?-腾讯云开发者社区-腾讯云 (tencent.com)
- package com.example.accessingdatamysql;
-
- import jakarta.persistence.Entity;
- import jakarta.persistence.GeneratedValue;
- import jakarta.persistence.GenerationType;
- import jakarta.persistence.Id;
- import jakarta.persistence.SequenceGenerator;
- import jakarta.validation.constraints.NotEmpty;
- import jakarta.validation.constraints.Email;
- import jakarta.validation.constraints.NotNull;
- import jakarta.validation.constraints.Size;
-
- @Entity // This tells Hibernate to make a table out of this class
- public class User {
- @Id
- //指定序列生成器,序列生成器的名称为"user_seq"
- @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
- //每次增长值为1
- @SequenceGenerator(name = "user_seq", sequenceName = "user_seq", allocationSize = 1)
- private Integer id;
-
- @NotNull(message = "姓名不能为空")
- @Size(min = 2, max = 30, message = "姓名长度必须在2-30之间")
- private String name;
-
- @Email
- @NotEmpty(message = "邮箱不能为空")
- private String email;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public String toString() {
- return "User(id:" + this.id + ",name:" + this.name + ",email:" + this.email + ")";
- }
- }
Repository接口,用于定义数据访问的方法
- package com.example.accessingdatamysql;
-
- import org.springframework.data.repository.CrudRepository;
-
- // import com.example.accessingdatamysql.User;
-
- // This will be AUTO IMPLEMENTED by Spring into a Bean called userRepository
- // CRUD refers Create, Read, Update, Delete
-
- //使用Iterable,可以根据条件来查询匹配的用户,并获取到一个包含所有符合条件的迭代的用户列表。
- public interface UserRepository extends CrudRepository<User, Integer> {
-
- //根据姓名查询用户
- Iterable<User> findByName(String name);
-
- //根据邮箱查询用户
- Iterable<User> findByEmail(String email);
-
- //根据邮箱和姓名查询用户
- Iterable<User> findByNameAndEmail(String email,String name);
-
- }
Controller类通常用于Web应用程序,它接收用户的HTTP请求,调用业务逻辑处理请求,并返回一个包含响应数据的视图。
- package com.example.accessingdatamysql;
-
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.validation.BindingResult;
- import org.springframework.validation.annotation.Validated;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.ModelAttribute;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
- import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
- import jakarta.validation.Valid;
-
- @Controller
- @Validated
- public class WebController implements WebMvcConfigurer {
- @Autowired
- private UserRepository userRepository;
-
- @Override
- public void addViewControllers(ViewControllerRegistry registry) {
- registry.addViewController("/results").setViewName("results");
- }
-
- @GetMapping("/form")
- public String showForm(Model model) {
- model.addAttribute("user", new User());
- return "form";
- }
-
- @PostMapping("/")
- public String submintForm(@Valid @ModelAttribute("user") User user, BindingResult bindingResult) {
- if (bindingResult.hasErrors()) {
- return "form";
- }
- userRepository.save(user);
- return "redirect:/list";
- }
-
- @GetMapping("/list")
- public String showList(Model model) {
- model.addAttribute("userList", userRepository.findAll());
- return "list";
- }
-
- @GetMapping(path = "/deleteAll")
- public String deleteAllUsers(Model model) {
- userRepository.deleteAll();
- Iterable<User> userList = userRepository.findAll();
- model.addAttribute("userList", userList);
- return "redirect:/list";
- }
-
- @GetMapping(path = "/delete/{id}")
- public String deleteUser(@PathVariable("id") Integer id, Model model) {
- userRepository.deleteById(id);
- Iterable<User> userList = userRepository.findAll();
- model.addAttribute("userList", userList);
- return "redirect:/list"; // 返回list.html模板
- }
-
- @GetMapping(path = "/edit/{id}")
- public String updateUser(@PathVariable("id") Integer id, Model model) {
- User user = userRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Invalid user ID"));
- model.addAttribute("user", user);
- return "edit";
- }
-
- @PostMapping(path = "/update")
- public String update(@Valid User user, Model model) {
- userRepository.save(user);
- Iterable<User> userList = userRepository.findAll();
- model.addAttribute("userList", userList);
- return "list";
- }
-
- @GetMapping("/find")
- public String findUserByNameAndEmail(@RequestParam("name") String name,
- @RequestParam("email") String email, Model model) {
- Iterable<User> userlist;
-
- if (!name.isEmpty() && !email.isEmpty()) {
- // 根据姓名和邮箱查询用户
- userlist = userRepository.findByNameAndEmail(name, email);
- } else if (!name.isEmpty()) {
- // 根据姓名查询用户
- userlist = userRepository.findByName(name);
- } else if (!email.isEmpty()) {
- // 根据邮箱查询用户
- userlist = userRepository.findByEmail(email);
- } else {
- // 返回所有用户
- userlist = userRepository.findAll();
- }
- model.addAttribute("userlist", userlist);
- return "check";
- }
- }
这里的注释
@Valid:用于验证注释是否符合要求,例如
这里就是检验密码是否为空
- @RestController
- @RequestMapping("/user")
- public class UserController {
- @PostMapping
- public User create (@Valid @RequestBody User user) {
- System.out.println(user.getId());
- System.out.println(user.getUsername());
- System.out.println(user.getPassword());
- user.setId("1");
- return user;
- }
- }
-
- public class User {
- private String id;
-
- @NotBlank(message = "密码不能为空")
- private String password;
- }
@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
- //url参数中的name必须要和@RequestParam("name")一致
- @RequestMapping("show16")
- public ModelAndView test16(@RequestParam("name")String name){
- ModelAndView mv = new ModelAndView();
- mv.setViewName("hello");
- mv.addObject("msg", "接收普通的请求参数:" + name);
- return mv;
- }
得到结果
url:localhost:8080/hello/show16?name=cc
页面:
接收普通的请求参数:cc
- package com.example.accessingdatamysql;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
-
- @SpringBootApplication
- public class AccessingDataMysqlApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(AccessingDataMysqlApplication.class, args);
- }
- }
check.html
- <!DOCTYPE html>
- <html xmlns:th="http://www.thymeleaf.org">
-
- <head>
- <meta charset="UTF-8">
- <title>Check User List</title>
- <style>
- body {
- display: flex;
- align-items: stretch;
- height: 100vh;
- background-color: #f2f2f2;
- justify-content: space-between;
- flex-wrap: wrap;
- flex-direction: column;
- align-content: center;
- }
-
- table {
- width: 600px;
- margin-top: 20px;
- border-collapse: collapse;
- background-color: #fff;
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
- }
-
- table th,
- table td {
- padding: 10px;
- text-align: center;
- border: 1px solid #ccc;
- }
-
- table th {
- background-color: #f2f2f2;
- }
-
- a {
- display: block;
- text-align: center;
- margin-top: 20px;
- text-decoration: none;
- color: #4CAF50;
- font-weight: bold;
- }
-
- a:hover {
- color: #45a049;
- }
-
- .btn-edit,
- .btn-delete {
- display: inline-block;
- padding: 5px 10px;
- border: none;
- background-color: #4CAF50;
- color: white;
- text-decoration: none;
- cursor: pointer;
- }
-
- .btn-edit:hover,
- .btn-delete:hover {
- background-color: #45a049;
- }
- </style>
- </head>
-
- <body>
- <h1 style="text-align: center; margin-bottom: 20px;">Check User List</h1>
- <form th:action="@{/find}" method="get" style="text-align: center;">
- <input type="text" name="name" placeholder="姓名">
- <input type="text" name="email" placeholder="邮箱">
- <button type="submit">查询</button>
- </form>
- <table>
- <tr>
- <th>Name</th>
- <th>Email</th>
- <th>操作</th>
- </tr>
- <tr th:each="user : ${userlist}">
- <td th:text="${user.name}"></td>
- <td th:text="${user.email}"></td>
- <td>
- <a th:href="@{'/edit/' + ${user.id}}" class="btn-edit">编辑</a>
- <a th:href="@{'/delete/' + ${user.id}}" class="btn-delete">删除</a>
- </td>
- </tr>
- </table>
- <a href="/form" style="text-align: center; margin-top: 20px; display: block;">添加新信息</a>
- </body>
-
- </html>
edit.html
- <!DOCTYPE html>
- <html xmlns:th="http://www.thymeleaf.org">
-
- <head>
- <meta charset="UTF-8">
- <title>Edit User</title>
- <style>
- body {
- display: flex;
- align-items: center;
- height: 100vh;
- background-color: #f2f2f2;
- flex-direction: column;
- flex-wrap: wrap;
- align-content: center;
- justify-content: center;
- }
-
- form {
- width: 400px;
- padding: 20px;
- background-color: #fff;
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
- text-align: center;
- }
-
- label {
- display: block;
- margin-bottom: 10px;
- font-weight: bold;
- }
-
- input {
- width: 100%;
- padding: 8px;
- margin-bottom: 20px;
- border: 1px solid #ccc;
- border-radius: 4px;
- box-sizing: border-box;
- }
-
- button {
- padding: 10px 20px;
- border: none;
- background-color: #4CAF50;
- color: white;
- text-decoration: none;
- cursor: pointer;
- }
-
- button:hover {
- background-color: #45a049;
- }
-
- a {
- display: block;
- margin-top: 20px;
- text-align: center;
- text-decoration: none;
- color: #4CAF50;
- font-weight: bold;
- }
-
- a:hover {
- color: #45a049;
- }
- </style>
- </head>
-
- <body>
- <h1>编辑信息</h1>
-
- <form th:action="@{/update}" method="post">
- <input type="hidden" th:name="id" th:value="${id}" />
-
- <label for="name">Name:</label>
- <input type="text" id="name" name="name" th:value="${name}" />
-
- <label for="email">Email:</label>
- <input type="email" id="email" name="email" th:value="${email}" />
-
- <button type="submit">保存</button>
- </form>
-
- <a href="/list">返回列表</a>
- </body>
-
- </html>
form.html
- <!DOCTYPE html>
- <html xmlns:th="http://www.thymeleaf.org">
-
- <head>
- <meta charset="UTF-8">
- <title>Form</title>
- <style>
- body {
- display: flex;
- justify-content: center;
- align-items: center;
- height: 100vh;
- background-color: #f2f2f2;
- }
-
- .form-container {
- width: 400px;
- padding: 20px;
- background-color: #fff;
- border-radius: 5px;
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
- }
-
- .form-container h1 {
- text-align: center;
- margin-bottom: 20px;
- }
-
- .form-container label {
- display: block;
- margin-bottom: 10px;
- }
-
- .form-container input[type="text"],
- .form-container input[type="email"] {
- width: 100%;
- padding: 10px;
- border: 1px solid #ccc;
- border-radius: 5px;
- }
-
- .form-container button[type="submit"] {
- display: block;
- width: 100%;
- padding: 10px;
- margin-top: 20px;
- background-color: #4CAF50;
- color: #fff;
- border: none;
- border-radius: 5px;
- cursor: pointer;
- }
-
- .form-container button[type="submit"]:hover {
- background-color: #45a049;
- }
-
- .form-container button[type="reset"] {
- display: block;
- width: 100%;
- padding: 10px;
- margin-top: 20px;
- background-color: #4CAF50;
- color: #fff;
- border: none;
- border-radius: 5px;
- cursor: pointer;
- }
-
- .form-container button[type="reset"]:hover {
- background-color: #45a049;
- }
-
- .form-container button[type="delete"] {
- display: block;
- width: 100%;
- padding: 10px;
- margin-top: 20px;
- background-color: #4CAF50;
- color: #fff;
- border: none;
- border-radius: 5px;
- cursor: pointer;
- }
-
- .form-container button[type="delete"]:hover {
- background-color: #45a049;
- }
-
- .form-container span {
- color: red;
- font-size: 12px;
- margin-top: 5px;
- }
- </style>
- </head>
-
-
- <body>
- <div class="form-container">
- <h1>表格</h1>
- <form action="#" th:action="@{/}" th:object="${user}" method="post">
- <div>
- <label for="name">Name:</label>
- <input type="text" id="name" th:field="*{name}" required>
- <span th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</span>
- </div>
- <div>
- <label for="email">Email:</label>
- <input type="text" id="email" th:field="*{email}" required>
- <span th:if="${#fields.hasErrors('email')}" th:errors="*{email}">Email Error</span>
- </div>
- <div>
- <button type="submit">Submit</button>
- <button type="reset">Reset</button>
- <button type="delete">Delete</button>
- </div>
- </form>
- </div>
- </body>
-
- </html>
list.html
- <!DOCTYPE html>
- <html xmlns:th="http://www.thymeleaf.org">
-
- <head>
- <meta charset="UTF-8">
- <title>List</title>
- <style>
- body {
- display: flex;
- align-items: stretch;
- height: 100vh;
- background-color: #f2f2f2;
- justify-content: space-between;
- flex-wrap: wrap;
- flex-direction: column;
- align-content: center;
- }
-
- table {
- width: 600px;
- margin-top: 20px;
- border-collapse: collapse;
- background-color: #fff;
- box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
- }
-
- table th,
- table td {
- padding: 10px;
- text-align: center;
- border: 1px solid #ccc;
- }
-
- table th {
- background-color: #f2f2f2;
- }
-
- a {
- display: block;
- text-align: center;
- margin-top: 20px;
- text-decoration: none;
- color: #4CAF50;
- font-weight: bold;
- }
-
- a:hover {
- color: #45a049;
- }
-
- .btn-edit,
- .btn-delete {
- display: inline-block;
- padding: 5px 10px;
- border: none;
- background-color: #4CAF50;
- color: white;
- text-decoration: none;
- cursor: pointer;
- }
-
- .btn-edit:hover,
- .btn-delete:hover {
- background-color: #45a049;
- }
-
- .btn-delete-all {
- display: block;
- text-align: center;
- margin-top: 20px;
- text-decoration: none;
- color: #f44336;
- font-weight: bold;
- }
-
- .btn-delete-all:hover {
- color: #d32f2f;
- }
- </style>
- </head>
-
- <body>
- <h1 style="text-align: center; margin-bottom: 20px;">信息系统</h1>
- <form th:action="@{/find}" method="get" style="text-align: center;">
- <input type="text" name="name" placeholder="姓名">
- <input type="text" name="email" placeholder="邮箱">
- <button type="submit">查询</button>
- </form>
- <table>
- <tr>
- <th>Name</th>
- <th>Email</th>
- <th>操作</th>
- </tr>
- <tr th:each="user : ${userList}">
- <td th:text="${user.name}"></td>
- <td th:text="${user.email}"></td>
- <td>
- <a th:href="@{'/edit/' + ${user.id}}" class="btn-edit">编辑</a>
- <a th:href="@{'/delete/' + ${user.id}}" class="btn-delete">删除</a>
- </td>
- </tr>
- </table>
- <a href="/form" style="text-align: center; margin-top: 20px; display: block;">添加新信息</a>
- <a href="/deleteAll" class="btn-delete-all">删除全部用户信息</a>
- </body>
-
- </html>
这里的页面可以通过设置css样式表等方式进行改进
结果:可以通过前端创建用户,并加入到mysql数据库中