В этой статье описывается, как использовать 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" />
<a href="/toAdd" th:href="@{/list}" class="btn btn-info">Back</a>
</div>
</div>
</form>
</div>
</body>
</html>
Добавление страниц и модификация аналогичны отказу от публикации кода.
Изображение эффекта:
Такой пример добавления, удаления, изменения и проверки с помощью jpa и тимелеафа завершен.
Конечно, весь пример кода здесь:
образец кода
Если вам понравилась моя статья, обратите внимание на мой публичный номер