[JAVA] Créez une application de recherche simple avec Spring Boot

Comme le titre l'indique, j'ai créé une application de recherche.

environnement d'utilisation

・ Windows10 (64 bits) ・ Démarrage à ressort: 2.2.6 ・ Éclipse: 4.9.0 ・ H2

Écran de fin

Lorsque vous entrez tout ou partie du genre, auteur, titre Tirez le contenu au bas de l'écran. image.png

Entity

BookData.java


import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class BookData {

	@Id
	private long isbn;

	private String genre;
	private String author;
	private String title;
	private int stock;
	private Boolean status;

	public long getIsbn() {
		return isbn;
	}
	public void setIsbn(long isbn) {
		this.isbn = isbn;
	}
	public String getGenre() {
		return genre;
	}
	public void setGenre(String genre) {
		this.genre = genre;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public int getStock() {
		return stock;
	}
	public void setStock(int stock) {
		this.stock = stock;
	}
	public Boolean getStatus() {
		return status;
	}
	public void setStatus(Boolean status) {
		this.status = status;
	}
}

Dao Préparez une classe Dao pour rechercher par genre, auteur et titre.

BookDataDao.java


import java.io.Serializable;
import java.util.List;

public interface BookDataDao extends Serializable {

	public List<BookData> search(String genre, String author, String title);
}

Repository Créez un BookDataDaoImpl qui implémente la classe Dao. Veuillez vous référer aux commentaires pour le contenu de chaque description.

BookDataDaoImpl.java


import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class BookDataDaoImpl implements BookDataDao {

	//Fournir les fonctions requises pour utiliser Entity
	@Autowired
	private EntityManager entityManager;

	public BookDataDaoImpl() {
		super();
	}

	public BookDataDaoImpl(EntityManager manager) {
		this();
		entityManager = manager;
	}

	//Remplacer la méthode de recherche fournie par la classe Dao
	@SuppressWarnings("unchecked")
	@Override
	public List<BookData> search(String genre, String author, String title) {

		//Concaténer les instructions SQL avec StringBuilder
		StringBuilder sql = new StringBuilder();
		sql.append("SELECT b From BookData b WHERE ");

		boolean genreFlg  = false;
		boolean authorFlg = false;
		boolean titleFlg  = false;
		boolean andFlg    = false;

		//Ajouter à la variable SQL si le genre n'est pas vide
		//Définissez l'indicateur sur true
		if(!"".equals(genre)) {
			sql.append("b.genre LIKE :genre");
			genreFlg = true;
			andFlg   = true;
		}

		//ajouter à la variable sql si l'auteur n'était pas vide
		//Définissez l'indicateur sur true
		if(!"".equals(author)) {
			if (andFlg) sql.append(" AND ");
			sql.append("b.author LIKE :author");
			authorFlg = true;
			andFlg    = true;
		}

		//Ajouter à la variable SQL si le titre n'est pas vide
		//Définissez l'indicateur sur true
		if(!"".equals(title)) {
			if (andFlg) sql.append(" AND ");
			sql.append("b.title LIKE :title");
			titleFlg = true;
			andFlg   = true;
		}

		/*
La requête a une fonction équivalente à une instruction de requête pour interroger des données avec SQL
Utilisez la méthode createQuery de entityManager
Passer la variable SQL en argument
		*/
	    Query query = entityManager.createQuery(sql.toString());

	    //Si l'instruction if ci-dessus est vraie, définissez une valeur pour chaque variable
	    //Cette fois, je souhaite effectuer une recherche ambiguë, j'utilise donc la clause like
	    if (genreFlg) query.setParameter("genre", "%" + genre + "%");
	    if (authorFlg) query.setParameter("author", "%" + author + "%");
	    if (titleFlg) query.setParameter("title", "%" + title + "%");
	    return query.getResultList();
	}
}

BookDataRepository

BookDataRepository.java


import org.springframework.data.jpa.repository.JpaRepository;

public interface BookDataRepository extends JpaRepository<BookData, Long> {

}

Service

BookService.java


import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BookService {

	@Autowired
	private BookDataRepository bookDataRepository;

	@Autowired
	private BookDataDaoImpl bookDataDaoImpl;


	//Rechercher tout
	public List<BookData> findAll(){
		return bookDataRepository.findAll();
	}

	//Trouvez l'ID correspondant
	public Optional<BookData> findById(long isbn) {
        return bookDataRepository.findById(isbn);
    }

	//sauvegarder
	public BookData save(BookData bookData) {
		return bookDataRepository.saveAndFlush(bookData);
	}

	//Chercher
	public List<BookData> search(String genre, String author, String title){

		List<BookData> result = new ArrayList<BookData>();

		//Si tout est vide, recherchez tout
		if ("".equals(genre) && "".equals(author) && "".equals(title)){
			result = bookDataRepository.findAll();
		}
		else {
			//Autre que ce qui précède, appelez la méthode de BookDataDaoImpl
			result = bookDataDaoImpl.search(genre, author, title);
		}
		return result;
	}
}

Controller

StockController.java


import java.util.List;
import java.util.Optional;

import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.RequestMapping;

@Controller
@RequestMapping("/book")
public class StockController {

	@Autowired
	private BookService bookService;

	@PersistenceContext
	EntityManager entityManager;

	//Traitement d'affichage de liste
	@GetMapping
	public String index(Model model,@ModelAttribute("formModel") BookData bookdata) {

		model.addAttribute("msg", "Contrôle de l'inventaire");
		model.addAttribute("msg2", "Veuillez saisir les conditions de recherche");
		List<BookData> books = bookService.findAll();
		model.addAttribute("books", books);

		return "index";
	}

	//Processus de réception des résultats de recherche
	//@Recevoir formModel depuis form avec ModelAttribute
	//Ce type(BookData)Et variables(bookdata)Spécifier
	@PostMapping
	public String select(@ModelAttribute("formModel") BookData bookdata, Model model) {

		model.addAttribute("msg", "Résultats de recherche");
		//Obtenez chaque valeur avec le getter de bookdata
		List<BookData> result = bookService.search(bookdata.getGenre(),bookdata.getAuthor(), bookdata.getTitle());
		model.addAttribute("books", result);

		return "index";
	}

	//Traitement d'écran détaillé
	//@Obtenez la valeur reçue de l'URL avec PathVariable
	@GetMapping("detail/{isbn}")
	public String detail(@PathVariable long isbn, Model model) {

		model.addAttribute("msg", "Écran de référence");
		Optional<BookData> data = bookService.findById(isbn);
		//Lorsque vous utilisez Facultatif, la valeur est get()Entrer
		model.addAttribute("form", data.get());

		return "detail";
	}


	//Processus d'initialisation
	@PostConstruct
	public void init() {

		BookData d1 = new BookData();
		d1.setAuthor("Natsume Soseki");
		d1.setTitle("Cœur");
		d1.setGenre("Littérature");
		d1.setIsbn(11111);
		d1.setStock(100);
		d1.setStatus(false);
		bookService.save(d1);

		BookData d2 = new BookData();
		d2.setAuthor("Jiro Ohno");
		d2.setTitle("Introduction au printemps");
		d2.setGenre("La technologie");
		d2.setIsbn(22222);
		d2.setStock(1);
		d2.setStatus(false);
		bookService.save(d2);

		BookData d3 = new BookData();
		d3.setAuthor("Taro Tanaka");
		d3.setTitle("Comment fonctionne le réseau");
		d3.setGenre("La technologie");
		d3.setIsbn(33333);
		d3.setStock(20);
		d3.setStatus(false);
		bookService.save(d3);

		BookData d4 = new BookData();
		d4.setAuthor("Montant Yoshikawa");
		d4.setTitle("Balle de boue");
		d4.setGenre("Mystère");
		d4.setIsbn(44444);
		d4.setStock(99);
		d4.setStatus(false);
		bookService.save(d4);

		BookData d5 = new BookData();
		d5.setAuthor("Natsume Soseki");
		d5.setTitle("Oreiller d'herbe");
		d5.setGenre("Littérature");
		d5.setIsbn(55555);
		d5.setStock(40);
		d5.setStatus(false);
		bookService.save(d5);

		BookData d6 = new BookData();
		d6.setAuthor("Testez Toshiro");
		d6.setTitle("Livre de cas de meurtre en série");
		d6.setGenre("Mystère");
		d6.setIsbn(66666);
		d6.setStock(40);
		d6.setStatus(false);
		bookService.save(d6);

		BookData d7 = new BookData();
		d7.setAuthor("Taro Jaba");
		d7.setTitle("Premiers pas avec Java");
		d7.setGenre("La technologie");
		d7.setIsbn(77777);
		d7.setStock(40);
		d7.setStatus(false);
		bookService.save(d7);
	}
}

index.html

index.html


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>écran initial</title>
<style>
h1 {font-size:18pt; font-weight:bold; color:gray;}
body {font-size:13pt; font-weight:bold; color:gray; margin:5px 25px;}
tr {margin:5px;}
th {padding:5px;color:white; background:darkgray;}
td {padding:5px;color:black; background:#f0f0f0;}
</style>
</head>
<body>
	<h1 th:text="${msg}"></h1>
		<p th:text="${msg2}"></p>
		<!--La valeur saisie est e:object="${formModel}"Emballer dans-->
		<!--th:Faire entrer la valeur initiale en valeur-->
		<form method="post" th:action="@{/book}" th:object="${formModel}">
			<label>Genre:</label>
			<input type="text" name="genre" th:value="*{genre}"><p>
			<label>Auteur:</label>
			<input type="text" name="author" th:value="*{author}"><p>
			<label>Titre:</label>
			<input type="text" name="title" th:value="*{title}"><p>
			<input type="submit" value="Chercher">
		</form>
		<table>
			<tr>
				<th>ISBN</th>
				<th>Titre</th>
				<th>Nom de l'auteur</th>
				<th>Quantité en stock</th>
				<th>Genre</th>
			</tr>
			<tr th:each="obj:${books}" th:object="${obj}">
				<!--th:Lier la configuration avec href-->
				<td><a th:href="@{/book/detail/{isbn}(isbn=*{isbn})}" th:text="*{isbn}"></a></td>
				<td th:text="*{title}"></td>
				<td th:text="*{author}"></td>
				<td th:text="*{stock}"></td>
				<td th:text="*{genre}"></td>
			</tr>
		</table>
</body>
</html>

Modèle de traitement 1

Entrez «littérature» dans le genre et appuyez sur le bouton de recherche. Lorsque l'écran des résultats de la recherche s'affiche, la valeur saisie à la page précédente est conservée et affichée à l'écran. Cliquez sur le lien ISBN dans les résultats de la recherche pour accéder à l'écran de référence. image.png

image.png

image.png

Modèle de traitement 2

Entrez "épais" pour l'auteur et appuyez sur le bouton de recherche. image.png

image.png

finalement

J'ai créé une application simple. Nous vous serions reconnaissants si vous pouviez nous faire savoir si vous avez des opinions telles que "Il vaut mieux faire cela!"

référence

[Introduction à la programmation Spring Boot 2](https://www.amazon.co.jp/Spring-Boot-2-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9 % E3% 83% 9F% E3% 83% B3% E3% 82% B0% E5% 85% A5% E9% 96% 80-% E6% 8E% 8C% E7% 94% B0% E6% B4% A5% E8% 80% B6% E4% B9% 83-ebook / dp / B07KF4R1HT / ref = sr_1_3? __ mk_ja_JP =% E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & dchild = 1 & mots-clés = Ressort + botte & qid = 1590664580 & sr = 8-3)

[Présentation détaillée de Spring](https://www.amazon.co.jp/Spring%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-Spring-Framework%E3% 81% AB% E3% 82% 88% E3% 82% 8BJava% E3% 82% A2% E3% 83% 97% E3% 83% AA% E3% 82% B1% E3% 83% BC% E3% 82% B7% E3% 83% A7% E3% 83% B3% E9% 96% 8B% E7% 99% BA-% E6% A0% AA% E5% BC% 8F% E4% BC% 9A% E7% A4% BENTT % E3% 83% 87% E3% 83% BC% E3% 82% BF-ebook / dp / B01IEWNLBU / ref = sr_1_2? __Mk_ja_JP =% E3% 82% AB% E3% 82% BF% E3% 82% AB% E3% 83% 8A & dchild = 1 & keywords = Spring + boot & qid = 1590664580 & sr = 8-2)

Recommended Posts

Créez une application de recherche simple avec Spring Boot
Créez une application avec Spring Boot 2
Créez une application avec Spring Boot
Créez un site de démonstration simple avec Spring Security avec Spring Boot 2.1
Créez un lot à la demande simple avec Spring Batch
J'ai créé un formulaire de recherche simple avec Spring Boot + GitHub Search API.
Créez un site Web avec Spring Boot + Gradle (jdk1.8.x)
Créer un serveur API Web avec Spring Boot
Créer un environnement de développement Spring Boot avec docker
Créer un micro service avec Spring Boot
Créez un projet de développement d'application Spring Boot avec la commande cURL + tar
Étapes pour créer une application chameau simple avec les démarreurs Apache Camel Spring Boot
Implémentez une API Rest simple avec Spring Security avec Spring Boot 2.0
Créer Restapi avec Spring Boot (jusqu'à l'exécution de l'application)
Créez une application Web Hello World avec Spring Framework + Jetty
Faisons une API simple avec EC2 + RDS + Spring boot ①
Implémentez une API Rest simple avec Spring Security & JWT avec Spring Boot 2.0
[Rails6] Créer une nouvelle application avec Rails [Débutant]
Créez une application Web simple avec Dropwizard
[Retrait des rails] Créez une fonction de retrait simple avec des rails
Créer un graphique à barres simple avec MPAndroidChart
[Rails 5] Créer une nouvelle application avec Rails [Débutant]
Créez une application de recherche de restaurant avec l'API IBM Watson + Guru Navi (avec source)
Créez un tableau d'affichage simple avec Java + MySQL
Créez une application Spring Boot à l'aide d'IntelliJ IDEA
Créez une application CRUD avec Spring Boot 2 + Thymeleaf + MyBatis
Créez votre propre utilitaire avec Thymeleaf avec Spring Boot
Créer un environnement Spring Boot avec Windows + VS Code
Télécharger avec Spring Boot
Créez un serveur Spring Cloud Config en toute sécurité avec Spring Boot 2.0
Créer une image docker pour exécuter une application Java simple
Entraînez-vous à créer une application de chat simple avec Docker + Sinatra
[Compatible JUnit 5] Ecrire un test en utilisant JUnit 5 avec Spring boot 2.2, 2.3
Comment créer un projet Spring Boot dans IntelliJ
[Spring Boot] Comment créer un projet (pour les débutants)
Créez une application de chat avec WebSocket (Tyrus) + libGDX + Kotlin
[JUnit 5] Ecrivez un test de validation avec Spring Boot! [Test de paramétrage]
Un mémorandum lors de la création d'un service REST avec Spring Boot
J'ai écrit un test avec Spring Boot + JUnit 5 maintenant
Hello World (application console) avec Apache Camel + Spring Boot 2
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Implémenter GraphQL avec Spring Boot
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Créez un terrain de jeu avec Xcode 12
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Envoyer du courrier avec Spring Boot
Créez une application Web parfaitement adaptée à l'apprentissage [Spring Boot + Thymeleaf + PostgreSQL]
[Rails] J'ai essayé de créer une mini application avec FullCalendar