[JAVA] Une histoire accro aux espaces réservés des modèles JDBC

Environnement de développement

Examen du modèle JDBC

Tout d'abord, j'expliquerai brièvement comment utiliser JDBC Template.

Ajouter un espace de noms JDBC à XML

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
   ">
(Définition de la source de données)

Nécessaire lors de la définition d'une table ou de la saisie de données au moment de l'exécution, telles que des données de test. Dans cet exemple, le script pour H2 écrit dans / database / schema.sql sous le chemin de classe est chargé. Définissez nom-base de données sur celui défini dans ʻURL. Si omis, la chaîne de caractères définie dans ʻid est affichée.

context.xml


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

Référence: Un exemple de paramètres de base de données pour Logback. Faites correspondre la valeur de cette balise ʻurlavec lenom-base de données`.

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>
Définition du bean du modèle JDBC

Définissez simplement la source de données définie dans ↑ dans le constructeur

context.xml


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

Comment utiliser le modèle JDBC

Appel en code

Injectez simplement

java.test.java


  @Inject
  JdbcTemplate jdbcTemplate;
Exécutez SQL et obtenez le résultat

Vous pouvez recevoir le résultat de «SQL» comme «List» ou «Map» avec «queryForXXX». Voici un exemple d'obtention du message de la sortie du journal par Logback.

test.java


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

Vous pouvez également utiliser ? Pour devenir un espace réservé et lier une valeur. Voici un exemple d'obtention de la valeur associée à la clé «context» contenue dans «MDC» ou «Context».

test.java


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

Une histoire accro aux espaces réservés des modèles JDBC

--Si vous codez en dur SQL, cela semble être une faute de frappe, donc je veux le rendre constant: déçu_relieved:

test.java



    private static final String MESSAGE_COLUM_NAME = "formatted_message";

    //Abréviation

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

Résultat de l'exécution …… 出力結果

Pourquoi formaté_message: penser:?

Les noms de colonne et les noms de table ne peuvent pas être liés

La liaison de JDBCTemplate appelle en interne PreparedStatement, et l'espace réservé de PreparedStatement ne prend en charge que les paramètres. Il semble que les noms de colonne et les noms de table ne peuvent pas être liés.

J'ai cherché la documentation et recherché des points d'arrêt pendant un certain temps, mais je n'ai pas trouvé le libellé qui ne devrait pas être utilisé dans les noms de colonnes. Cependant, étant donné que la chaîne de caractères formatted_message a été retournée dans l'exemple de ↑ et qu'elle est liée sans échapper? Dans SQL, il semble que le processus d'échappement du pilote JDBC soit lié. Je vais.

Conclusion

Si vous souhaitez lier un nom de table ou un nom de colonne, utilisez le Format # chaîne etc.

Contexte de l'affichage

J'ai fait un article auquel j'étais accro quand j'ai utilisé le «JDBC Template» après un long moment.

Recommended Posts

Une histoire accro aux espaces réservés des modèles JDBC
Une histoire à laquelle j'étais accro avec toString () d'Interface qui était proxy avec JdkDynamicAopProxy
Comment créer un pilote JDBC
[Circle CI] Une histoire à laquelle j'étais accro chez Start Building
[rails] Comment créer un modèle partiel
Une histoire à laquelle j'étais accro lors du test de l'API à l'aide de MockMVC
Une histoire qui a mis du temps à établir une connexion
Histoire d'essayer de faire fonctionner le fichier JAVA
Une histoire à laquelle j'étais accro lors de l'obtention d'une clé qui a été automatiquement essayée sur MyBatis
Comment créer une URL JDBC (Oracle Database, Thin)
Une histoire d'essayer de s'entendre avec Mockito
Une histoire sur l'effort de décompiler les fichiers JAR
Une histoire sur la réduction de la consommation de mémoire à 1/100 avec find_in_batches
Une histoire dans laquelle j'étais accro à la conversion de type implicite d'ActiveRecord lors du test unitaire
Une histoire de malentendu sur l'utilisation du scanner Java (mémo)
L'histoire à laquelle j'étais accro lors de la création de STS