[JAVA] Erstellen Sie mit Spring Boot eine einfache Such-App

Wie der Titel schon sagt, habe ich eine Such-App erstellt.

Nutzungsumgebung

・ Windows 10 (64 Bit) ・ Spring-Boot: 2.2.6 ・ Eclipse: 4.9.0 ・ H2

Abschlussbildschirm

Wenn Sie ein oder alle Genres, Autoren und Titel eingeben Ziehen Sie den Inhalt am unteren Bildschirmrand. 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 Bereiten Sie eine Dao-Klasse für die Suche nach Genre, Autor und Titel vor.

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 Erstellen Sie ein BookDataDaoImpl, das die Dao-Klasse implementiert. Den Inhalt der einzelnen Beschreibungen entnehmen Sie bitte den Kommentaren.

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 {

	//Bereitstellung der für die Verwendung von Entity erforderlichen Funktionen
	@Autowired
	private EntityManager entityManager;

	public BookDataDaoImpl() {
		super();
	}

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

	//Überschreiben Sie die von der Dao-Klasse bereitgestellte Suchmethode
	@SuppressWarnings("unchecked")
	@Override
	public List<BookData> search(String genre, String author, String title) {

		//Verketten Sie SQL-Anweisungen mit 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;

		//An SQL-Variable anhängen, wenn das Genre nicht leer ist
		//Setzen Sie das Flag auf true
		if(!"".equals(genre)) {
			sql.append("b.genre LIKE :genre");
			genreFlg = true;
			andFlg   = true;
		}

		//an SQL-Variable anhängen, wenn der Autor nicht leer ist
		//Setzen Sie das Flag auf true
		if(!"".equals(author)) {
			if (andFlg) sql.append(" AND ");
			sql.append("b.author LIKE :author");
			authorFlg = true;
			andFlg    = true;
		}

		//An SQL-Variable anhängen, wenn der Titel nicht leer ist
		//Setzen Sie das Flag auf true
		if(!"".equals(title)) {
			if (andFlg) sql.append(" AND ");
			sql.append("b.title LIKE :title");
			titleFlg = true;
			andFlg   = true;
		}

		/*
Die Abfrage hat eine Funktion, die einer Abfrageanweisung zum Abfragen von Daten mit SQL entspricht
Verwenden Sie die createQuery-Methode des entityManager
Übergeben Sie die SQL-Variable als Argument
		*/
	    Query query = entityManager.createQuery(sql.toString());

	    //Wenn die obige if-Anweisung wahr ist, legen Sie für jede Variable einen Wert fest
	    //Dieses Mal möchte ich eine mehrdeutige Suche durchführen, daher verwende ich die like-Klausel
	    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;


	//Suche alle
	public List<BookData> findAll(){
		return bookDataRepository.findAll();
	}

	//Suchen Sie die entsprechende ID
	public Optional<BookData> findById(long isbn) {
        return bookDataRepository.findById(isbn);
    }

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

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

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

		//Wenn alle leer sind, suchen Sie alle
		if ("".equals(genre) && "".equals(author) && "".equals(title)){
			result = bookDataRepository.findAll();
		}
		else {
			//Rufen Sie anders als oben beschrieben die Methode von BookDataDaoImpl auf
			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;

	//Listenanzeigeverarbeitung
	@GetMapping
	public String index(Model model,@ModelAttribute("formModel") BookData bookdata) {

		model.addAttribute("msg", "Bestandskontrolle");
		model.addAttribute("msg2", "Bitte geben Sie die Suchbedingungen ein");
		List<BookData> books = bookService.findAll();
		model.addAttribute("books", books);

		return "index";
	}

	//Suchergebnis-Empfangsprozess
	//@Empfangen Sie formModel vom Formular mit ModelAttribute
	//Dieser Typ(BookData)Und Variablen(bookdata)Konkretisieren
	@PostMapping
	public String select(@ModelAttribute("formModel") BookData bookdata, Model model) {

		model.addAttribute("msg", "Suchergebnisse");
		//Holen Sie sich jeden Wert mit dem Getter von Buchdaten
		List<BookData> result = bookService.search(bookdata.getGenre(),bookdata.getAuthor(), bookdata.getTitle());
		model.addAttribute("books", result);

		return "index";
	}

	//Detaillierte Bildschirmverarbeitung
	//@Ruft den von der URL empfangenen Wert mit PathVariable ab
	@GetMapping("detail/{isbn}")
	public String detail(@PathVariable long isbn, Model model) {

		model.addAttribute("msg", "Referenzbildschirm");
		Optional<BookData> data = bookService.findById(isbn);
		//Bei Verwendung von Optional lautet der Wert get()Reinkommen
		model.addAttribute("form", data.get());

		return "detail";
	}


	//Initialisierungsprozess
	@PostConstruct
	public void init() {

		BookData d1 = new BookData();
		d1.setAuthor("Natsume Soseki");
		d1.setTitle("Herz");
		d1.setGenre("Literatur");
		d1.setIsbn(11111);
		d1.setStock(100);
		d1.setStatus(false);
		bookService.save(d1);

		BookData d2 = new BookData();
		d2.setAuthor("Jiro Ohno");
		d2.setTitle("Einführung in den Frühling");
		d2.setGenre("Technologie");
		d2.setIsbn(22222);
		d2.setStock(1);
		d2.setStatus(false);
		bookService.save(d2);

		BookData d3 = new BookData();
		d3.setAuthor("Taro Tanaka");
		d3.setTitle("Wie das Netzwerk funktioniert");
		d3.setGenre("Technologie");
		d3.setIsbn(33333);
		d3.setStock(20);
		d3.setStatus(false);
		bookService.save(d3);

		BookData d4 = new BookData();
		d4.setAuthor("Yoshikawa Menge");
		d4.setTitle("Schlammkugel");
		d4.setGenre("Geheimnis");
		d4.setIsbn(44444);
		d4.setStock(99);
		d4.setStatus(false);
		bookService.save(d4);

		BookData d5 = new BookData();
		d5.setAuthor("Natsume Soseki");
		d5.setTitle("Graskissen");
		d5.setGenre("Literatur");
		d5.setIsbn(55555);
		d5.setStock(40);
		d5.setStatus(false);
		bookService.save(d5);

		BookData d6 = new BookData();
		d6.setAuthor("Testen Sie Toshiro");
		d6.setTitle("Fallbuch zum Serienmord");
		d6.setGenre("Geheimnis");
		d6.setIsbn(66666);
		d6.setStock(40);
		d6.setStatus(false);
		bookService.save(d6);

		BookData d7 = new BookData();
		d7.setAuthor("Taro Jaba");
		d7.setTitle("Erste Schritte mit Java");
		d7.setGenre("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>Einstiegsbild</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>
		<!--Der eingegebene Wert ist th:object="${formModel}"Packen Sie ein-->
		<!--th:Geben Sie den Anfangswert als Wert ein-->
		<form method="post" th:action="@{/book}" th:object="${formModel}">
			<label>Genre:</label>
			<input type="text" name="genre" th:value="*{genre}"><p>
			<label>Autor:</label>
			<input type="text" name="author" th:value="*{author}"><p>
			<label>Titel:</label>
			<input type="text" name="title" th:value="*{title}"><p>
			<input type="submit" value="Suche">
		</form>
		<table>
			<tr>
				<th>ISBN</th>
				<th>Titel</th>
				<th>Autorenname</th>
				<th>Bestandsmenge</th>
				<th>Genre</th>
			</tr>
			<tr th:each="obj:${books}" th:object="${obj}">
				<!--th:Linkeinstellung mit 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>

Verarbeitungsmuster 1

Geben Sie "Literatur" in das Genre ein und drücken Sie die Suchtaste. Wenn der Suchergebnisbildschirm angezeigt wird, bleibt der auf der vorherigen Seite eingegebene Wert erhalten und wird auf dem Bildschirm angezeigt. Klicken Sie in den Suchergebnissen auf den Link ISBN, um zum Referenzbildschirm zu gelangen. image.png

image.png

image.png

Verarbeitungsmuster 2

Geben Sie "dick" für den Autor ein und drücken Sie die Suchtaste. image.png

image.png

Schließlich

Ich habe eine einfache App erstellt. Wir würden uns freuen, wenn Sie uns mitteilen könnten, ob Sie Meinungen wie "Es ist besser, dies zu tun!" Haben.

Referenz

[Einführung in die Spring Boot 2-Programmierung](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 & Schlüsselwörter = Spring + boot & qid = 1590664580 & sr = 8-3)

[Gründliche Einführung in den Frühling](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

Erstellen Sie mit Spring Boot eine einfache Such-App
Erstellen Sie eine App mit Spring Boot 2
Erstellen Sie eine App mit Spring Boot
Erstellen Sie mit Spring Security 2.1 eine einfache Demo-Site mit Spring Security
Erstellen Sie mit Spring Batch eine einfache On-Demand-Charge
Ich habe ein einfaches Suchformular mit Spring Boot + GitHub Search API erstellt.
Erstellen Sie eine Website mit Spring Boot + Gradle (jdk1.8.x)
Erstellen Sie einen Web-API-Server mit Spring Boot
Erstellen Sie mit Docker eine Spring Boot-Entwicklungsumgebung
Erstellen Sie mit Spring Boot einen Mikrodienst
Erstellen Sie mit dem Befehl cURL + tar ein Spring Boot-App-Entwicklungsprojekt
Schritte zum Erstellen einer einfachen Kamel-App mit Apache Camel Spring Boot-Startern
Implementieren Sie eine einfache Rest-API mit Spring Security mit Spring Boot 2.0
Erstellen Sie Restapi mit Spring Boot (bis zum Ausführen der App)
Erstellen Sie eine Hello World-Webanwendung mit Spring Framework + Jetty
Erstellen wir eine einfache API mit EC2 + RDS + Spring Boot ①
Implementieren Sie eine einfache Rest-API mit Spring Security & JWT mit Spring Boot 2.0
[Rails6] Erstelle eine neue App mit Rails [Anfänger]
Erstellen Sie mit Dropwizard eine einfache Webanwendung
[Schienenentnahme] Erstellen Sie eine einfache Entnahmefunktion mit Schienen
Erstellen eines einfachen Balkendiagramms mit MPAndroidChart
[Rails 5] Erstelle eine neue App mit Rails [Anfänger]
Erstellen Sie eine Restaurant-Such-App mit der IBM Watson + Guru Navi-API (mit Quelle).
Erstellen Sie mit Java + MySQL ein einfaches Bulletin Board
Erstellen Sie eine Spring Boot-Anwendung mit IntelliJ IDEA
Erstellen Sie eine CRUD-App mit Spring Boot 2 + Thymeleaf + MyBatis
Erstellen Sie Ihr eigenes Dienstprogramm mit Thymeleaf mit Spring Boot
Erstellen Sie eine Spring Boot-Umgebung mit Windows + VS-Code
Mit Spring Boot herunterladen
Erstellen Sie mit Spring Boot 2.0 einen Spring Cloud Config Server mit Sicherheit
Erstellen Sie ein Docker-Image, um eine einfache Java-App auszuführen
Üben Sie das Erstellen einer einfachen Chat-App mit Docker + Sinatra
[JUnit 5-kompatibel] Schreiben Sie einen Test mit JUnit 5 mit Spring Boot 2.2, 2.3
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
Erstellen Sie eine Chat-App mit WebSocket (Tyrus) + libGDX + Kotlin
[JUnit 5] Schreiben Sie einen Validierungstest mit Spring Boot! [Parametrisierungstest]
Ein Memorandum beim Erstellen eines REST-Service mit Spring Boot
Ich habe jetzt einen Test mit Spring Boot + JUnit 5 geschrieben
Hallo Welt (Konsolen-App) mit Apache Camel + Spring Boot 2
Generieren Sie mit Spring Boot einen Barcode
Hallo Welt mit Spring Boot
Implementieren Sie GraphQL mit Spring Boot
Beginnen Sie mit Spring Boot
Hallo Welt mit Spring Boot!
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
Datei-Upload mit Spring Boot
Spring Boot beginnt mit dem Kopieren
Erstellen Sie einen Spielplatz mit Xcode 12
Spring Boot beginnend mit Docker
Hallo Welt mit Spring Boot
Setzen Sie Cookies mit Spring Boot
Verwenden Sie Spring JDBC mit Spring Boot
Modul mit Spring Boot hinzufügen
Erste Schritte mit Spring Boot
Mail mit Spring Boot verschicken
Erstellen Sie eine Web-App, die genau zum Lernen geeignet ist [Spring Boot + Thymeleaf + PostgreSQL]
[Rails] Ich habe versucht, eine Mini-App mit FullCalendar zu erstellen