springboot (пятнадцать): пример добавления, удаления и модификации springboot+jpa+thymeleaf

задняя часть база данных Spring JavaScript

В этой статье описывается, как использовать jpa и тимелеаф для выполнения примера CRUD.

Позвольте мне поговорить с вами о том, почему мне нравится писать такого рода строительные проекты. Когда я изучаю новую технологию, я всегда хочу быстро создать демо-версию, чтобы испытать ее эффект. Чем проще и легче начать работу, тем лучше. Всегда проблематично найти нужную информацию в Интернете.Некоторые статьи очень хорошо написаны, но не имеют исходного кода, а некоторые имеют исходный код, но введение статьи не очень понятно.Немного сложно найти информацию. Поэтому, когда я буду изучать Spring Boot, я напишу несколько простых и базовых проектов-примеров. С одной стороны, это удобно для того, чтобы другим друзьям было максимально быстро понятно, с другой стороны, если в моем проекте нужно использовать родственные технологии, Я могу напрямую использовать этот пример в этом примере Версия может быть изменена или интегрирована.

Жанров технических блогов сейчас очень много.Некоторые любят анализировать исходный код, а некоторые склоняются к основополагающим принципам.Мне нравится писать такие маленькие и красивые примеры, чтобы облегчить себе и другим.

На самом деле, я уже писал статьи о тимелеафе и jpa:springboot (четыре): подробное объяснение использования тимелеафа-thymeleaf%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3.html) иspringboot (5): использование весенних данных jpa-spring-data-jpa%E7%9A%84%E4%BD%BF%E7%94%A8.html) Все примеры кода в облачной коллекции приведеныFavorites-web, в облачной коллекции много контента, и его не очень удобно находить, поэтому я хочу быстро и просто переставить контент, чтобы представить использование jpa и тимелеафа, что и является содержанием этой статьи.

В этой статье не рассказывается, что такое jpa и тимелеаф.Если вы не понимаете этих основных понятий, вы можете перейти к первым двум связанным статьям.

Начать быстро

конфигурационный файл

конфигурация пакета pom

Добавьте связанные ссылки на пакеты jpa и thymeleaf в пакет pom.

<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>

Добавьте конфигурацию в 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.jdbc.Driver

spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true

spring.thymeleaf.cache=false

вpropertiesspring.thymeleaf.cache=falseЭто закрыть кеш тимелеафа, иначе модификация страницы в процессе разработки не вступит в силу сразу и ее нужно перезапустить, а производство можно настроить на true.

В каталоге ресурсов проекта будет две папки: статический каталог используется для размещения статического содержимого веб-сайта, такого как css, js и изображения; каталог шаблонов используется для размещения шаблонов страниц, используемых проектом.

стартовый класс

Классу запуска необходимо добавить поддержку сервлетов.

@SpringBootApplication
public class JpaThymeleafApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(JpaThymeleafApplication.class);
    }

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

Код уровня базы данных

Таблица базы данных сопоставления классов сущностей

@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;
    ...
}

Наследование класса JpaRepository автоматически реализует многие встроенные методы, включая добавления, удаления и изменения. Вы также можете автоматически генерировать связанный sql в соответствии с именем метода.springboot (5): использование весенних данных jpa-spring-data-jpa%E7%9A%84%E4%BD%BF%E7%94%A8.html)

public interface UserRepository extends JpaRepository<User, Long> {
    User findById(long id);
    Long deleteById(Long id);
}

обработка бизнес-уровня

Служба вызывает jpa для реализации соответствующих дополнений, удалений и изменений.В реальном проекте уровень службы обрабатывает определенные бизнес-коды.

@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.delete(id);
    }
}

Контроллер отвечает за получение запроса и возврат содержимого страницы во внешний интерфейс после обработки.

@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";
    }
}
  • return "user/userEdit";Представитель перейдет непосредственно в каталог ресурсов, чтобы найти соответствующие файлы.
  • return "redirect:/list";Представляет переадресацию на соответствующий контроллер. Этот пример эквивалентен автоматической подстройке к запросу списка после удаления содержимого и последующему выводу его на страницу.

содержание страницы

список список

<!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>

Изображение эффекта:

<tr th:each="user : ${users}">Здесь соответствующий контент будет получен из объекта набора моделей уровня контроллера,th:eachУказывает, что он будет перебирать содержимое объекта.

На самом деле есть и другие способы написания, конкретное содержание грамматики можно посмотреть в этой статье:springboot (четыре): подробное объяснение использования тимелеафа-thymeleaf%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3.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>

Добавление страниц и модификация аналогичны отказу от публикации кода.

Изображение эффекта:

Такой пример добавления, удаления, изменения и проверки с помощью jpa и тимелеафа завершен.

Конечно, весь пример кода здесь:
образец кода


Если вам понравилась моя статья, обратите внимание на мой публичный номер