• SpringBoot+Jpa+Thymeleaf实现增删改查


    SpringBoot+Jpa+Thymeleaf实现增删改查

    这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例。

    1、pom依赖

    pom 包里面添加JpaThymeleaf 的相关包引用

    
    <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.0modelVersion>
    	
        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.1.0.RELEASEversion>
        parent>
    
        <groupId>com.examplegroupId>
        <artifactId>spring-boot-jpa-thymeleaf-curdartifactId>
        <version>0.0.1-SNAPSHOTversion>
        <name>spring-boot-jpa-thymeleaf-curdname>
        <description>spring-boot-jpa-thymeleaf-curddescription>
    
        <properties>
            <java.version>1.8java.version>
        properties>
    
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-thymeleafartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-data-jpaartifactId>
            dependency>
    
            <dependency>
                <groupId>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-devtoolsartifactId>
                <optional>trueoptional>
            dependency>
    
        dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                    <configuration>
                        <fork>truefork>
                    configuration>
                plugin>
            plugins>
        build>
    
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    2、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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其中propertiesspring.thymeleaf.cache=false是关闭 Thymeleaf 的缓存,不然在开发过程中修改页面不会

    立刻生效需要重启,生产可配置为 true。

    在项目 resources 目录下会有两个文件夹static目录用于放置网站的静态内容如 cssjs图片

    templates 目录用于放置项目使用的页面模板。

    3、启动类

    启动类需要添加 Servlet 的支持

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4、数据库层代码

    实体类映射数据库表

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    继承 JpaRepository 类会自动实现很多内置的方法,包括增删改查,也可以根据方法名来自动生成相关 Sql。

    6、业务层处理

    Service 调用 Jpa 实现相关的增删改查,实际项目中 Service 层处理具体的业务代码。

    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);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    7、控制层

    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";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    Controller 负责接收请求,处理完后将页面内容返回给前端。

    • return "user/userEdit"; 代表会直接去 resources 目录下找相关的文件。

    • return "redirect:/list"; 代表转发到对应的 Controller,这个示例就相当于删除内容之后自动调整到

      list 请求,然后再输出到页面。

    8、页面内容

    list 列表 list.html

    DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8"/>
        <title>userListtitle>
        <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 Nameth>
                <th>Passwordth>
                <th>Ageth>
                <th>Editth>
                <th>Deleteth>
            tr>
            thead>
            <tbody>
            <tr  th:each="user : ${users}">
                <th scope="row" th:text="${user.id}">1th>
                <td th:text="${user.userName}">neotd>
                <td th:text="${user.password}">Ottotd>
                <td th:text="${user.age}">6td>
                <td><a th:href="@{/toEdit(id=${user.id})}">edita>td>
                <td><a th:href="@{/delete(id=${user.id})}">deletea>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">adda>
        div>
    div>
    
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    访问http://localhost:8080/,效果如下图所示:
    在这里插入图片描述

    这里会从 Controler 层 model set 的对象去获取相关的内容,th:each

    示会循环遍历对象内容。

    点击Add按钮会跳转到新增页面。

    新增页面 userAdd.html

    DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8"/>
        <title>usertitle>
        <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">userNamelabel>
                <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" >Passwordlabel>
                <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">agelabel>
                <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" />
                         
                    <input type="reset" value="Reset" class="btn btn-info" />
                div>
    
            div>
        form>
    div>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    在这里插入图片描述

    填写数据并且点击Submit按钮,用户添加成功并且跳转到用户列表页面。

    在这里插入图片描述

    点击edit按钮跳转到用户修改页面。

    修改页面 userEdit.html

    DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8"/>
        <title>usertitle>
        <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">userNamelabel>
                <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" >Passwordlabel>
                <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">agelabel>
                <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" />
                         
                    <a href="/toAdd" th:href="@{/list}" class="btn btn-info">Backa>
                div>
    
            div>
        form>
    div>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    在这里插入图片描述

    修改用户的年龄为100然后点击Submit按钮提交修改。

    然后跳转到用户列表页面发现数据修改了。

    在这里插入图片描述

    可以点击delete按钮删除用户。

    删除之后跳转到用户列表页面。

    在这里插入图片描述

    这样一个使用 Jpa 和 Thymeleaf 的增删改查示例就完成了。

  • 相关阅读:
    11数据库-进阶
    Android音频框架之OpenSL ES、AAudio、Oboe介绍(二)
    优化算法 - 学习率调度器
    简易实现QT中的virtualkeyboard及问题总结
    ElasticSearch(六)【分词器】
    Request_共享数据(域对象) [JavaWeb][Servlet]
    面试-Redis-缓存击穿
    .NET依赖注入之一个接口多个实现
    [MyBatisPlus]DML编程控制①(多记录操作、逻辑删除)
    大三Web课程设计——悬崖上的波妞(4页) HTML+CSS(可以很好的应付老师的作业)
  • 原文地址:https://blog.csdn.net/qq_30614345/article/details/131948106