Es wird in der Reihenfolge nach der Grundklasse erklärt.
Der Code wird auf GitHub veröffentlicht. Wenn Sie interessiert sind, klonen Sie ihn bitte. Klicken Sie hier für das GitHub-Repository
Alle Tools können kostenlos verwendet werden. Wenn Sie im Terminal mit SQL arbeiten können, benötigen Sie keine SQL-Tools.
GitHub verfügt über SQL-Dateien für die Datenbankerstellung und Suchdaten. Bitte entsprechend der Umgebung ausführen.
HTML Obwohl es im HTML-Tag als "th: value" beschrieben wird, wird es später erläutert.
form.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"></meta>
<title>Durchsuchen Sie tatsächlich die Datenbank</title>
</head>
<body>
<h1>Suchformular</h1>
<form method="post" action="/form/db">
Mitarbeiter-ID eingeben:<input type="text" name="Id" th:value="${id_value}" /><br>
Gib deinen Namen ein:<input type="text" name="Name" th:value="${name_value}" /><br>
Altersangabe:<input type="text" name="Age" th:value="${age_value}" /><br>
<input type="submit" value="Suche" />
</form>
</body>
</html>
responseDB.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"></meta>
<title>Versuchen Sie, die Datenbank zu durchsuchen</title>
</head>
<body>
<h1>Suchergebnisse anzeigen</h1>
<table>
<tr th:each="employee : ${employees}">
<td th:text="${employee.employeeId}"></td>
<td th:text="${employee.employeeName}"></td>
<td th:text="${employee.empoyeeAge}"></td>
</tr>
</table>
</body>
</html>
Java Die folgenden vier Klassen sind erforderlich, um einen Webdienst zu erstellen.
--Repository Klasse
Artikel zu Anmerkungen in Kürze
FormRepository.java
package com.example.demo;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class FormRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<Map<String, Object>> findData(Integer id, String name, Integer age) {
String query = "SELECT"
+ " employee_id,"
+ " employee_name,"
+ " age"
+ " FROM employee"
+ " WHERE employee_id=?"
+ " or employee_name LIKE ?"
+ " or age=?";
//Suchausführung
// queryForList =>Da es mehrere Suchergebnisse gibt, rufen Sie diese in der Liste auf
List<Map<String, Object>> employees = jdbcTemplate.queryForList(query, new Object[] {id, name, age});
return employees;
}
}
Dies ist die Antwort auf die Hauptfrage. Verwenden Sie "neues Objekt".
jdbcTemplate.queryForList(query, new Object[] {id, name, age});
Employee.java
package com.example.demo;
import lombok.Data;
@Data
public class Employee {
private int employeeId;
private String employeeName;
private int employeeAge;
}
Wenn Sie die Annotation "@ Data" verwenden, werden "getter" und "setter" automatisch erstellt, sodass die Änderung einfacher ist. Artikel über @Data in Kürze
FormService.java
package com.example.demo;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class FormService {
@Autowired
private FormRepository formRepository;
//Da ich das Prüfergebnis als Listentyp in der Repository-Klasse erhalten habe, um mehrere Suchergebnisse zu erhalten
//Domänenklasse, in der Daten gespeichert werden[Employee]Als Listentyp
public List<Employee> findData(Integer id, String name, Integer age) {
//Von der Repository-Klasse[findData]Setzt die Karte in die Liste, also holen Sie sie sich mit demselben Typ
List<Map<String, Object>> list = formRepository.findData(id, name, age);
//Generieren Sie eine Liste der Rückgabewerte von findData
List<Employee> employees = new ArrayList<Employee>();
//Von der Repository-Klasse[findData]Suchergebnisliste von
//Einer nach dem anderen in der Domänenklasse[Employee]Speichern in
for(Map<String, Object> map: list) {
int employeeId = (Integer)map.get("employee_id");
String employeeName = (String)map.get("employee_name");
int employeeAge = (Integer)map.get("age");
//Erstellen Sie eine Employee-Instanz
Employee employee = new Employee();
//Speichern Sie den Wert im automatisch generierten Setter der Domänenklasse
employee.setEmployeeId(employeeId);
employee.setEmployeeName(employeeName);
employee.setEmployeeAge(employeeAge);
employees.add(employee);
}
return employees;
}
}
Standardmäßig werden die Namen von "Getter" und "Setter" mit dem ersten Buchstaben des Variablennamens großgeschrieben. Es wird derjenige mit "get" und "set" sein.
employee.setEmployeeId(employeeId);
FormController.java
package com.example.demo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class FormController {
@Autowired
private FormService formService;
@GetMapping("/form")
public String getHello() {
// hello.Bildschirmübergang zu HTML
return "form";
}
//Suchformular Aktionsziel
@PostMapping("/form/db")
public String postDbReqest(
@RequestParam("Id")String Id,
@RequestParam("Name")String Name,
@RequestParam("Age")String Age, Model model) {
Integer id = (Id == "") ? null:Integer.parseInt(Id);
String name = (Name == "") ? "":Name;
Integer age = (Age == "") ? null:Integer.parseInt(Age);
//Serviceklasse[findData]Ist in der Liste der Domänenklassen[Employee]Weil es gespeichert ist
//Liste beim Empfang<Employee>
List<Employee> employees = formService.findData(id, name, age);
//Innerhalb der Mitarbeiter
// {"employeeId":1, "employeeName":"Yamada Taro", "employeeAge":30}
model.addAttribute("employees", employees);
return "responseDB";
}
}
Da die im Modell registrierten "Mitarbeiter" mehrere "Mitarbeiterklassen" enthalten
<tr th:each="employee : ${employees}">
Nacheinander aus "Mitarbeitern" extrahiert und "Mitarbeitern" zugeordnet
Mitarbeiterklasse
ist
private int employeeId;
private String employeeName;
private int employeeAge;
Da der Wert mit setter
in der repository class
gespeichert wurde, kann er wie folgt abgerufen werden.
<td th:text="${employee.employeeId}"></td>
<td th:text="${employee.employeeName}"></td>
<td th:text="${employee.empoyeeAge}"></td>
Das Buch enthält nur ein Suchergebnis, um mehrere Daten zu erfassen Ich weiß, dass ich "queryForList" verwende, aber selbst wenn ich eine SQL-Anweisung mit einem Platzhalter schreibe Es gab ein Problem, dass der Suchwert nicht gebunden werden konnte.
Repository-Klasse
//Suchausführung
// queryForList =>Da es mehrere Suchergebnisse gibt, rufen Sie diese in der Liste auf
//Der Suchwert wird als Objekt übergeben
List<Map<String, Object>> employees = jdbcTemplate.queryForList(query, new Object[] {id, name, age});
//SQL-Anweisung
String query = "SELECT"
+ " employee_id,"
+ " employee_name,"
+ " age"
+ " FROM employee"
+ " WHERE employee_id=:id"
+ " or employee_name LIKE :name"
+ " or age=:age";
//Karte verwenden
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("id", id);
parameters.put("name", name);
parameters.put("age", age);
List<Map<String, Object>> employees = jdbcTemplate.queryForList(query, parameters);
//Verwenden Sie SqlParameterSource
SqlParameterSource parameters = new MapSqlParameterSource("id", id)
.addValue("name", name)
.addValue("name", age);
List<Map<String, Object>> employees = jdbcTemplate.queryForList(query, parameters);
Ich wollte den Namen in der SQL-Anweisung der Repository-Klasse unbedingt mehrdeutig machen. Ich konnte nicht, weil ich den Platzhalter nicht verwenden konnte. Es mag eine Möglichkeit geben, es zu beschreiben, aber ich weiß es noch nicht, also werde ich es in Zukunft möglich machen.
String query = "SELECT"
+ " employee_id,"
+ " employee_name,"
+ " age"
+ " FROM employee"
+ " WHERE employee_id=?"
+ " or employee_name LIKE %?%" //Kann das nicht machen
+ " or age=?";
Recommended Posts