web-dev-qa-db-de.com

wie führt man SQL-Anweisungen im Spring Boot Controller aus?

Ich möchte die SQL-Anweisung in meiner Spring-Boot-Controller-Klasse ausführen, ohne eine Methode im jpa-Repository definieren zu müssen. Die Aussage, die ich verwenden möchte, ist 

SELECT UUID();

Diese Anweisung ist datenbankbezogen und keiner bestimmten Entität zugeordnet. 

Es wäre schön, wenn jemand eine Lösung für die Ausführung der obigen Anweisung über

  1. federsteuerungsklasse
  2. jpa-Repository (falls empfohlen)

Update

regler:

@Autowired
JdbcTemplate jdbcTemplate;

@RequestMapping(value = "/UUID", method = RequestMethod.GET)
public ResponseEntity<String> getUUID() {
    String uuid = getUUID();
    return buildGuestResponse(uuid);
}

public String getUUID(){
    UUID uuid = (UUID)jdbcTemplate.queryForObject("select UUID()", UUID.class);
    return uuid.toString();
}
5
user2083529

Sie können JdbcTemplate in Ihrem Code verwenden.

Die Bean, die Sie in Ihrer Konfigurationsklasse benötigen, ist: -

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource)
{
    return new JdbcTemplate(dataSource);
}

Und der Code zum Ausführen der Abfrage lautet:

@Autowired
private JdbcTemplate JdbcTemplate;

public String getUUID(){
    UUID uuid = (UUID)jdbcTemplate.queryForObject("select UUID()", UUID.class);
    return uuid.toString();
}

oder kann so sein: -

public UUID getUUID(){
    UUID uuid = (UUID)jdbcTemplate.queryForObject("select UUID()", UUID.class);
    return uuid;
}
4
kakabali

Dies ist im Allgemeinen ein architektonisch schlechtes Design für die Ausführung von SQL (Persistenz) auf Präsentationsschicht (Controller oder View) in JEE-Anwendungen

Die beste Option ist, dass der Controller die Service-Schicht verwendet, wenn die Service-Ebene die Persistenz-Ebene zum Abrufen, Speichern oder Aktualisieren von Daten aufruft. 

In jedem Fall können Sie Spring Data JDBC verwenden. So etwas wie:

import org.springframework.jdbc.core.JdbcTemplate;

....
 UUID uuid = (UUID)jdbcTemplate.query("SELECT UUID()", UUID.class);
....
2
Victor Gubin

Ich könnte Ihnen ein kleines Beispiel geben, wie ich dies im Frühjahrsrahmen anhand von Federdaten durchgeführt habe.

Die Controller-Klasse:

@RestController
@RequestMapping("api/account")
public class AccountController {
  private AccountService accountService;

  @RequestMapping(
        method = RequestMethod.GET,
        produces = MediaType.APPLICATION_JSON_VALUE,
        path = "{id}"
  )
  public ResponseEntity getAccountId(@PathVariable("id") UUID id) {
    try {
        Account ac = accountService.findOne(id);
        return new ResponseEntity(ac, HttpStatus.OK);
    } catch (Exception ex) {
        return new ResponseEntity("Account not found.", HttpStatus.NOT_FOUND);
    }
}

In diesem kleinen Beispiel habe ich den AccountController und den AccountService, eine Schnittstelle, die die JpaRepository-Schnittstelle erweitert. Das Kontoobjekt ist ein selbst erstelltes Objekt. Wenn Sie die JpaRepository-Schnittstelle verwenden, müssen Sie die SQL-Anweisungen nicht selbst schreiben. Stattdessen müssen Sie ein gültiges Modellobjekt und den Bezeichner (in meinem Fall UUID) angeben.

Hier ist ein kleines Beispiel für das Account-Objekt:

@Entity
public class Account {

  private @Id @GeneratedValue(generator = "uuid2") UUID id;
  private String firstName, lastName, description;

  private Account() {}

  public Account(String firstName, String lastName, String description) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.description = description;
  }
}  

Für weitere Beispiele zum Umgang mit Federdaten empfehle ich die Kurzanleitung auf ihrer Website .

Ich hoffe es hilft!

1
Saltz