SpringBoot+Jpa+Thymeleaf realizes adding, deleting, modifying and checking

SpringBoot+Jpa+Thymeleaf realizes adding, deleting, modifying and checking

This article introduces how to use Jpa and Thymeleaf to make an example of CRUD.

1. pom dependency

Add related package references of Jpaand in the pom packageThymeleaf

<?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.1.0.RELEASE</version>
    </parent>

    <groupId>com.example</groupId>
    <artifactId>spring-boot-jpa-thymeleaf-curd</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-jpa-thymeleaf-curd</name>
    <description>spring-boot-jpa-thymeleaf-curd</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2. Add configuration to application.properties

spring.datasource.url=jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.properties.hibernate.hbm2ddl.auto=create
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true
spring.thymeleaf.cache=false

Among them propertiesspring.thymeleaf.cache=falseis to turn off Thymeleaf's cache, otherwise modifying the page during the development process will not

It needs to be restarted to take effect immediately, and production can be configured as true.

resourcesThere will be two folders under the project directory: staticthe directory is used to place the static content of the website such as css, js, 图片;

templatesThe directory is used to hold the page templates used by the project.

3. Startup class

The startup class needs to add Servlet support

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    
    

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    
    
        return application.sources(Application.class);
    }

    public static void main(String[] args) throws Exception {
    
    
        SpringApplication.run(Application.class, args);
    }
}

4. Database layer code

Entity class mapping database table

package com.example.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class User {
    
    

    @Id
    @GeneratedValue
    private long id;

    @Column(nullable = false, unique = true)
    private String userName;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private int age;

    public long getId() {
    
    
        return id;
    }

    public User setId(long id) {
    
    
        this.id = id;
        return this;
    }

    public String getUserName() {
    
    
        return userName;
    }

    public User setUserName(String userName) {
    
    
        this.userName = userName;
        return this;
    }

    public String getPassword() {
    
    
        return password;
    }

    public User setPassword(String password) {
    
    
        this.password = password;
        return this;
    }

    public int getAge() {
    
    
        return age;
    }

    public User setAge(int age) {
    
    
        this.age = age;
        return this;
    }
}

5、 JpaRepository

package com.example.repository;

import com.example.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    
    

    User findById(long id);

    void deleteById(Long id);
}

Inheriting the JpaRepository class will automatically implement many built-in methods, including adding, deleting, modifying and checking, and can also automatically generate related Sql according to the method name.

6. Business layer processing

Service calls Jpa to implement related additions, deletions, changes, and queries. In actual projects, the Service layer handles specific business codes.

package com.example.service;

import com.example.model.User;

import java.util.List;

public interface UserService {
    
    

    public List<User> getUserList();

    public User findUserById(long id);

    public void save(User user);

    public void edit(User user);

    public void delete(long id);

}
package com.example.service.impl;

import com.example.model.User;
import com.example.repository.UserRepository;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {
    
    

    @Autowired
    private UserRepository userRepository;

    @Override
    public List<User> getUserList() {
    
    
        return userRepository.findAll();
    }

    @Override
    public User findUserById(long id) {
    
    
        return userRepository.findById(id);
    }

    @Override
    public void save(User user) {
    
    
        userRepository.save(user);
    }

    @Override
    public void edit(User user) {
    
    
        userRepository.save(user);
    }

    @Override
    public void delete(long id) {
    
    
        userRepository.deleteById(id);
    }
}

7. Control layer

package com.example.web;

import com.example.model.User;
import com.example.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.annotation.Resource;
import java.util.List;

@Controller
public class UserController {
    
    

    @Resource
    UserService userService;

    @RequestMapping("/")
    public String index() {
    
    
        return "redirect:/list";
    }

    @RequestMapping("/list")
    public String list(Model model) {
    
    
        List<User> users = userService.getUserList();
        model.addAttribute("users", users);
        return "user/list";
    }

    @RequestMapping("/toAdd")
    public String toAdd() {
    
    
        return "user/userAdd";
    }

    @RequestMapping("/add")
    public String add(User user) {
    
    
        userService.save(user);
        return "redirect:/list";
    }

    @RequestMapping("/toEdit")
    public String toEdit(Model model, Long id) {
    
    
        User user = userService.findUserById(id);
        model.addAttribute("user", user);
        return "user/userEdit";
    }

    @RequestMapping("/edit")
    public String edit(User user) {
    
    
        userService.edit(user);
        return "redirect:/list";
    }

    @RequestMapping("/delete")
    public String delete(Long id) {
    
    
        userService.delete(id);
        return "redirect:/list";
    }
}

The Controller is responsible for receiving the request and returning the page content to the front end after processing.

  • return "user/userEdit";The representative will go directly to resourcesthe directory to find the relevant files.

  • return "redirect:/list";Represents forwarding to the corresponding Controller, this example is equivalent to automatically adjusting to the

    list request, and then output to the page.

8. Page content

list listlist.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>userList</title>
    <link rel="stylesheet" th:href="@{/css/bootstrap.css}"></link>
</head>
<body class="container">
<br/>
<h1>用户列表</h1>
<br/><br/>
<div class="with:80%">
    <table class="table table-hover">
        <thead>
        <tr>
            <th>#</th>
            <th>User Name</th>
            <th>Password</th>
            <th>Age</th>
            <th>Edit</th>
            <th>Delete</th>
        </tr>
        </thead>
        <tbody>
        <tr  th:each="user : ${users}">
            <th scope="row" th:text="${user.id}">1</th>
            <td th:text="${user.userName}">neo</td>
            <td th:text="${user.password}">Otto</td>
            <td th:text="${user.age}">6</td>
            <td><a th:href="@{/toEdit(id=${user.id})}">edit</a></td>
            <td><a th:href="@{/delete(id=${user.id})}">delete</a></td>
        </tr>
        </tbody>
    </table>
</div>
<div class="form-group">
    <div class="col-sm-2 control-label">
        <a href="/toAdd" th:href="@{/toAdd}" class="btn btn-info">add</a>
    </div>
</div>

</body>
</html>

Access http://localhost:8080/, the effect is shown in the figure below:
insert image description here

<tr th:each="user : ${users}">Here, the relevant content will be obtained from the object of the model set in the Controler layer, th:eachas shown in

The display will loop through the object content.

Clicking Addthe button will jump to the new page.

new pageuserAdd.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>user</title>
    <link rel="stylesheet" th:href="@{/css/bootstrap.css}"></link>
</head>
<body class="container">
<br/>
<h1>添加用户</h1>
<br/><br/>
<div class="with:80%">
    <form class="form-horizontal"   th:action="@{/add}"  method="post">
        <div class="form-group">
            <label for="userName" class="col-sm-2 control-label">userName</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" name="userName"  id="userName" placeholder="userName"/>
            </div>
        </div>
        <div class="form-group">
            <label for="password" class="col-sm-2 control-label" >Password</label>
            <div class="col-sm-10">
                <input type="password" class="form-control" name="password" id="password" placeholder="Password"/>
            </div>
        </div>
        <div class="form-group">
            <label for="age" class="col-sm-2 control-label">age</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" name="age"  id="age" placeholder="age"/>
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <input type="submit" value="Submit" class="btn btn-info" />
                &nbsp; &nbsp; &nbsp;
                <input type="reset" value="Reset" class="btn btn-info" />
            </div>

        </div>
    </form>
</div>
</body>
</html>

insert image description here

Fill in the data and click Submitthe button, the user is successfully added and jumps to the user list page.

insert image description here

Click editthe button to jump to the user modification page.

edit pageuserEdit.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>user</title>
    <link rel="stylesheet" th:href="@{/css/bootstrap.css}"></link>
</head>
<body class="container">
<br/>
<h1>修改用户</h1>
<br/><br/>
<div class="with:80%">
    <form class="form-horizontal"   th:action="@{/edit}" th:object="${user}"  method="post">
        <input type="hidden" name="id" th:value="*{id}" />
        <div class="form-group">
            <label for="userName" class="col-sm-2 control-label">userName</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" name="userName"  id="userName" th:value="*{userName}" placeholder="userName"/>
            </div>
        </div>
        <div class="form-group">
            <label for="password" class="col-sm-2 control-label" >Password</label>
            <div class="col-sm-10">
                <input type="password" class="form-control" name="password" id="password"  th:value="*{password}" placeholder="Password"/>
            </div>
        </div>
        <div class="form-group">
            <label for="age" class="col-sm-2 control-label">age</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" name="age"  id="age" th:value="*{age}" placeholder="age"/>
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <input type="submit" value="Submit" class="btn btn-info" />
                &nbsp; &nbsp; &nbsp;
                <a href="/toAdd" th:href="@{/list}" class="btn btn-info">Back</a>
            </div>

        </div>
    </form>
</div>
</body>
</html>

insert image description here

Modify the user's age to 100 and click Submitthe button to submit the modification.

Then jump to the user list page and find that the data has been modified.

insert image description here

Users can deletebe deleted by clicking the button.

Jump to the user list page after deletion.

insert image description here

Such a CRUD example using Jpa and Thymeleaf is completed.

Guess you like

Origin blog.csdn.net/qq_30614345/article/details/131948106