[JAVA] Eine Geschichte, die süchtig nach Platzhaltern für JDBC-Vorlagen ist

Entwicklungsumgebung

Überprüfung der JDBC-Vorlage

Zunächst werde ich kurz erklären, wie man die JDBC-Vorlage verwendet.

JDBC-Namespace zu XML hinzufügen

context.xml


<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:jdbc="http://www.springframework.org/schema/jdbc"

  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
   ">
(Datenquellendefinition)

Erforderlich beim Definieren einer Tabelle oder beim Eingeben von Daten zur Laufzeit, z. B. Testdaten. In diesem Beispiel wird das Skript für "H2" geladen, das in "/ database / schema.sql" unter dem Klassenpfad geschrieben ist. Setzen Sie "Datenbankname" auf den in "URL" festgelegten Wert. Wenn nicht angegeben, wird die Zeichenkette in "id" angezeigt.

context.xml


  <jdbc:embedded-database id="dataSource" type="H2" database-name="testdb">
    <jdbc:script location="classpath:/database/schema.sql" />
  </jdbc:embedded-database>

Referenz: Ein Beispiel für Datenbankeinstellungen für "Logback". Ordnen Sie den Wert dieses "url" -Tags dem "Datenbanknamen" zu.

logback.xml


      <dataSource class="org.apache.commons.dbcp2.BasicDataSource">
        <driverClassName>org.h2.Driver</driverClassName>
        <url>jdbc:h2:mem:testdb</url>
        <username>sa</username>
        <password></password>
      </dataSource>
Bean-Definition der JDBC-Vorlage

Stellen Sie einfach die in ↑ definierte Datenquelle im Konstruktor ein

context.xml


  <bean class="org.springframework.jdbc.core.JdbcTemplate">
    <constructor-arg ref="dataSource" />
  </bean>

Verwendung der JDBC-Vorlage

Code einrufen

Einfach injizieren

java.test.java


  @Inject
  JdbcTemplate jdbcTemplate;
Führen Sie SQL aus und erhalten Sie das Ergebnis

Sie können das Ergebnis von "SQL" als "Liste" oder "Karte" mit "queryForXXX" erhalten. Das folgende Beispiel zeigt, wie die Protokollnachricht von "Logback" ausgegeben wird.

test.java


    List<String> logginEvents = jdbcTemplate.queryForList(
        "SELECT formatted_message FROM logging_event ORDER BY timestmp", String.class);

Sie können auch ? Verwenden, um ein Platzhalter zu werden und einen Wert zu binden. Das Folgende ist ein Beispiel für das Abrufen des Werts, der dem in "MDC" oder "Kontext" enthaltenen Schlüssel "Kontext" zugeordnet ist.

test.java


    List<String> loggingEventProperties = jdbcTemplate.queryForList(
        "SELECT mapped_value FROM logging_event_property WHERE mapped_key=?", String.class,
        "context");

Eine Geschichte, die süchtig nach Platzhaltern für JDBC-Vorlagen ist

test.java



    private static final String MESSAGE_COLUM_NAME = "formatted_message";

    //Abkürzung

    List<String> logginEvents = jdbcTemplate.queryForList(
    "SELECT ? FROM logging_event ORDER BY timestmp", String.class, MESSAGE_COLUM_NAME);

Ausführungsergebnis …… 出力結果

Warum formatierte_message: denken :?

Spalten- und Tabellennamen können nicht gebunden werden

Die Bindung von "JDBCTemplate" ruft intern "PreparedStatement" auf, und der Platzhalter von "PreparedStatement" unterstützt nur Parameter. Es scheint, dass Spalten- und Tabellennamen nicht gebunden werden können.

Ich habe eine Weile in der Dokumentation gesucht und nach Haltepunkten gesucht, aber ich konnte den Wortlaut nicht finden, dass er nicht in Spaltennamen verwendet werden sollte. Wenn man jedoch bedenkt, dass die Zeichenfolge "formatted_message" im Beispiel von ↑ zurückgegeben wurde und ohne Escapezeichen gebunden ist? In "SQL" scheint der Escape-Prozess des "JDBC" -Treibers verwandt zu sein. Ich werde.

Fazit

Wenn Sie einen Tabellennamen oder Spaltennamen binden möchten, verwenden Sie "String # format" usw.

Hintergrund zum Posting

Ich habe einen Artikel geschrieben, von dem ich süchtig war, als ich nach langer Zeit "JDBC Template" verwendete.

Recommended Posts

Eine Geschichte, die süchtig nach Platzhaltern für JDBC-Vorlagen ist
Eine Geschichte, die von String () von Interface abhängig ist und von JdkDynamicAopProxy vertreten wird
So erstellen Sie einen JDBC-Treiber
[Circle CI] Eine Geschichte, der ich bei Start Building verfallen war
[Rails] So erstellen Sie eine Teilvorlage
Eine Geschichte, der ich beim Testen der API mit MockMVC verfallen war
Eine Geschichte, die Zeit brauchte, um eine Verbindung herzustellen
Die Geschichte des Versuchs, JAVA File zu bedienen
Eine Geschichte, nach der ich süchtig war, als ich einen Schlüssel bekam, der automatisch auf MyBatis ausprobiert wurde
So erstellen Sie eine JDBC-URL (Oracle Database, Thin)
Eine Geschichte über den Versuch, mit Mockito auszukommen
Eine Geschichte über das Bemühen, JAR-Dateien zu dekompilieren
Eine Geschichte über die Reduzierung des Speicherverbrauchs auf 1/100 mit find_in_batches
Eine Geschichte, die mich während des Komponententests von der impliziten Typkonvertierung von ActiveRecord abhängig machte
Eine Geschichte über Missverständnisse im Umgang mit Java-Scannern (Memo)
Die Geschichte, nach der ich beim Einrichten von STS süchtig war