Einfacher Datenbankzugriff mit Java Sql2o

1. Zuallererst

Dieses Mal möchte ich die grundlegende Verwendung von Sql2o erläutern, einer Bibliothek für den Zugriff auf Java-Datenbanken. Ich kannte Sql2o an erster Stelle, weil ich Sql2o für den DB-Zugriff in den Richtlinien von Spark Framework verwendet habe. Wenn "Spark Framework", ein Framework für einfache Mikrodienste, verwendet wird, ist "Sql2o" ebenfalls einfach, daher habe ich versucht, es zu verwenden. Weitere Informationen zu "Spark Framework" finden Sie unter [Easy Micro Service mit Spark Framework! ".

1.1. Was ist Sql2o?

Eine sehr einfache Java-Bibliothek für den Datenbankzugriff, die auf der offiziellen Website (https://www.sql2o.org/) wie folgt beschrieben wird:

Sql2o is a small Java library, that makes it easy to execute sql statements against your JDBC compliant database.

Es gibt Bewertung: Stern: 642 auf Github. (Stand 1. April 2018) Wie auf dieser Seite angegeben, wird behauptet, dass die Leistung von "SELECT" sehr hoch ist. Die Vergleichsergebnisse mit anderen wichtigen Datenbankzugriffsbibliotheken ("Apache DbUtils", "MyBatis", "Spring JdbcTemplate" usw.) werden aufgelistet. Wenn Sie interessiert sind, schauen Sie bitte.

2. Vorbereitung vorbereiten

2.1 Vorbereitung der Bibliothek

Die sql2o-Bibliothek kann aus dem Maven-Repository abgerufen werden. Fügen Sie den JDBC-Treiber von RDBMS hinzu, der zusammen mit der Abhängigkeit verwendet werden soll. Im Beispiel verwenden wir PostgreSQL.

pom.xml


<dependency> 
    <groupId>org.sql2o</groupId> 
    <artifactId>sql2o</artifactId> 
    <version>1.5.4</version> 
</dependency> 
<dependency> 
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId> 
    <version>9.4-1201-jdbc41</version> 
</dependency>

2.2 Tabelle vorbereiten

Erstellen Sie eine Tabelle, die im Beispiel verwendet werden soll.

create_table.ddl


CREATE TABLE todo
(
  todo_id character(36) NOT NULL,
  todo_title character(100),
  created_at timestamp without time zone NOT NULL,
  finished character(1) NOT NULL,
  CONSTRAINT todo_pk PRIMARY KEY (todo_id)
)

2.3. Definition der Klasse, die der Tabelle entspricht

Definiert eine Klasse, die die Daten in der Tabelle enthält. Es gibt nichts Besonderes und es ist als POJO implementiert. Es ist einfach, den Konstruktor und die Methode toString () mit der Eclipse-Funktion automatisch zu generieren.

Todo.java


package com.example.spark.demo;

import java.io.Serializable;
import java.util.Date;

public class Todo implements Serializable {

    private static final long serialVersionUID = 1L;
    private String todoId;
    private String todoTitle;
    private Date createdAt;
    private boolean finished;
    
    public Todo() {
        
    }

    public Todo(String todoId, String todoTitle, Date createdAt,
            boolean finished) {
        super();
        this.todoId = todoId;
        this.todoTitle = todoTitle;
        this.createdAt = createdAt;
        this.finished = finished;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("Todo [todoId=");
        builder.append(todoId);
        builder.append(", todoTitle=");
        builder.append(todoTitle);
        builder.append(", createdAt=");
        builder.append(createdAt);
        builder.append(", finished=");
        builder.append(finished);
        builder.append("]");
        return builder.toString();
    }
    
    // setter, getter omitted
}

3. Wie benutzt man Sql2o?

3.1. Grundlegende Verwendung

Zunächst möchte ich den Ablauf bei der Verwendung von "Sql2o" am Beispiel des einfachsten "Abrufen eines einzelnen Datensatzes" erläutern.

Sql2oDemo.java


package com.example.spark.demo;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.sql2o.Connection;
import org.sql2o.Query;
import org.sql2o.Sql2o;

public class Sql2oDemo2 {

    public static void main(String[] args) {
        //★ Punkt 1
        // 1. create sql2o instance
        Sql2o sql2o = new Sql2o("jdbc:postgresql://127.0.0.1:5432/demodb", // url
                "username",  // user
                "password"); // pass

        //★ Punkt 2
        // 2. set default column mappings (optional)
        Map<String, String> colMaps = new HashMap<String, String>();
        colMaps.put("TODO_ID", "todoId");
        colMaps.put("TODO_TITLE", "todoTitle");
        colMaps.put("CREATED_AT", "createdAt");
        sql2o.setDefaultColumnMappings(colMaps);

        //★ Punkt 3
        // 3. get connection
        try (Connection connection = sql2o.open()) {

            //★ Punkt 4
            // 4. create query
            String queryText = "SELECT todo_id, todo_title, created_at, finished FROM todo"
                    + " WHERE created_at = (SELECT max(created_at) FROM todo)";
            Query query = connection.createQuery(queryText);

            //★ Punkt 5
            // 5. execute query
            Todo todo = query.executeAndFetchFirst(Todo.class);
            System.out.println(todo);
        }
    }
}

** ★ Punkt 1 ** Erstellen Sie ein Objekt von Sql2o mit dem Operator new. Die Argumente des Konstruktors lauten wie folgt.

Von nun an wird das hier generierte Sql2o-Objekt verwendet.

**(Hinweis) Einige Konstruktoren verwenden "DataSource" als Argument. Es wird empfohlen, dies zu verwenden, wenn Sie "Sql2o" in einer Webanwendung verwenden. ** ** **

** ★ Punkt 2 ** Wenn der Spaltenname der Tabelle, auf die Sie zugreifen, mit dem Feldnamen der Klasse übereinstimmt, führt Sql2o die Zuordnung automatisch durch (wenn der Datentyp konvertierbar ist). Wenn die Namen unterschiedlich sind, müssen Sie mit den Namen in der AS -Klausel von SQL übereinstimmen, aber Sie können setDefaultColumnMappings verwenden, um diese Namenskonvertierungsregel vorkonfigurieren zu können.

** ★ Punkt 3 ** ★ Verwenden Sie die Methode open () aus dem an Punkt 1 erstellten Sql2o-Objekt, um eine Verbindung herzustellen. Wie in den Richtlinien empfohlen, stellen wir eine Verbindung mit "Try-with-Resources" her, um sie automatisch zu schließen. Dies ist der routinemäßige Verarbeitungsablauf bei Verwendung von Sql2o.

** ★ Punkt 4 ** Erstellen Sie ein "org.sql2o.Query" -Objekt, das die auszuführende SQL definiert. Die Definitionsmethode ist sowohl für das Referenzsystem als auch für das Aktualisierungssystem gleich, und die auszugebende SQL wird als "String" definiert. ★ Verwenden Sie die Methode "createQuery ()" aus der in Punkt 3 erhaltenen Verbindung, um ein "Query" -Objekt zu erstellen. Informationen zum Festlegen von Parametern in SQL finden Sie unter "[3.4. Festlegen von Parametern](# 34-Set Parameters)".

** ★ Punkt 5 ** SQL wird ausgeführt, indem die Methode des in ★ Punkt 4 generierten Abfrageobjekts aufgerufen wird. Die zu verwendende Methode hängt von der auszugebenden SQL ab. Die Hauptmethoden werden unten beschrieben.

3.2. Holen Sie sich einen einzelnen Datensatz

Verwenden Sie die Methode "executeAndFetchFirst", um einen einzelnen Datensatz abzurufen. Geben Sie im Argument den Datentyp (die Klasse) des Rückgabewerts an. ★ Wenn die Zuordnung an Punkt 2 korrekt durchgeführt wurde, können Sie den erfassten Datensatz problemlos als Objekt abrufen. Beachten Sie, dass, wie der Name "executeAndFetchFirst" andeutet, auch wenn das SQL-Ausführungsergebnis mehrere Datensätze enthält, kein Fehler auftritt und der erste Datensatz zurückgegeben wird.

// 4. create query
String queryText = "SELECT todo_id, todo_title, created_at, finished FROM todo"
        + " WHERE created_at = (SELECT max(created_at) FROM todo)";
Query query = connection.createQuery(queryText);

// 5. execute query
Todo todo = query.executeAndFetchFirst(Todo.class);
System.out.println(todo);

3.3. Mehrere Datensätze abrufen

Verwenden Sie die Methode "createQuery", um mehrere Datensätze abzurufen. Geben Sie im Argument den Datentyp (die Klasse) des Rückgabewerts an. Der Rückgabewert ist "java.util.List" des durch das Argument angegebenen Datentyps (Klasse). Wenn das Suchergebnis 0 ist, ist es "Liste" mit 0 Elementen.

// 4. create query
String queryText2 = "SELECT todo_id, todo_title, created_at, finished FROM todo";
Query query2 = connection.createQuery(queryText2);

// 5. execute query
List<Todo> todoList = query2.executeAndFetch(Todo.class);
System.out.println(todoList);

3.4. Parameter einstellen

Die Methode zum Einbetten von Parametern beim Erstellen einer SQL-Zeichenfolge kann eine SQL-Injection verursachen. Sql2o bietet addParameter in Query als Methode zum Einstellen von Parametern. Die Methode ist einfach: Schreiben Sie einfach : Parametername an die Stelle, an der Sie den SQL-Parameter verwenden möchten, und legen Sie den Wert, den Sie als Parameter einbetten möchten, mit addParameter fest.

// 4. create query
String queryText3 = "SELECT todo_id, todo_title, created_at, finished FROM todo WHERE todo_id=:todoId";
Query query3 = connection.createQuery(queryText3)
        .addParameter("todoId", "e8a57ac5-0e79-4444-be8a-3a281a5c0943");
// 5. execute query
Todo todo2 = query3.executeAndFetchFirst(Todo.class);
System.out.println(todo2);

3.5 Führen Sie Update SQL aus

Verwenden Sie die Methode executeUpdate, um Update SQL auszuführen. Diese Methode gibt eine Sql2o-Verbindung als Rückgabewert zurück. Ich denke, dass die Anzahl der geänderten Datensätze für die Aktualisierung von SQL erforderlich sein kann. In diesem Fall können Sie die Nummer mit der Methode "getResult" der Verbindung abrufen.

// 4. create query
String updateQueryText = "INSERT INTO todo(todo_id, todo_title, created_at, finished)"
        + " VALUES (:todoId, :todoTitle, :createAt, :finished)";
Query query4 = connection.createQuery(updateQueryText)
        .addParameter("todoId", UUID.randomUUID().toString())
        .addParameter("todoTitle", "world!")
        .addParameter("createAt", new Date())
        .addParameter("finished", "0");
// 5. execute query
int effectiveCount = query4.executeUpdate().getResult();
System.out.println(effectiveCount);

3.6. Transaktionen kontrollieren

Ich habe bisher noch nicht über Transaktionen gesprochen, aber es ist ein Punkt, den Sie bei der tatsächlichen Systementwicklung beachten sollten. Sql2o bietet keine deklarative Transaktionsfunktionalität. Es gibt eine Methode, die die Transaktion explizit steuert, und der Implementierer verwendet diese, um die Transaktion zu steuern.

// management transaction
try (Connection connection = sql2o.beginTransaction()) {
    // first sql
    String updateQuery = "UPDATE todo SET todo_title=:todoTitle WHERE todo_id = :todoId";
    Query query1 = connection.createQuery(updateQuery)
            .addParameter("todoTitle", "googbye.")
            .addParameter("todoId",
                    "e7801fe3-6e67-41ee-abb9-4f01841a3bf0");
    int updateCount = query1.executeUpdate().getResult();
    System.out.println(updateCount);

    // If you want to try it, let's raise an exception here.
    // sql2o.open() : first sql is effective(committed)
    // sql2o.beginTransaction() : first sql is ineffective(uncommitted)

    // second sql
    String deleteQuery = "DELETE FROM todo WHERE todo_title = :todoTitle";
    Query query2 = connection.createQuery(deleteQuery)
            .addParameter("todoTitle", "world!");
    int deleteCount = query2.executeUpdate().getResult();
    System.out.println(deleteCount);
    
    // commit transaction
    connection.commit();
}

**(Hinweis) Wenn Sie eine Transaktion mit der Methode beginTransaction in try-with-resources starten, wird das Rollback automatisch ausgeführt, wenn weder ein Commit noch ein Rollback durchgeführt wird. ** ** ** Dies wird auch in den Richtlinien [https://github.com/aaberg/sql2o/wiki/Transactions] erwähnt.

4. Schließlich

Dieses Mal erklärte ich die grundlegende Verwendung von Sql2o, einer Bibliothek für den Zugriff auf Java-Datenbanken. Ich denke, es war eine sehr einfache Funktion und Verwendung. Es fehlt ein bisschen an komplexer Datenbankzugriffsverarbeitung für das Unternehmen, aber ist es nicht gerade richtig, um einen einfachen Mikroservice zu erstellen?

Recommended Posts

Einfacher Datenbankzugriff mit Java Sql2o
(Java) Einfache BDD mit Spektrum?
Einfach mit regulären Java-Ausdrücken zu stolpern
Zugriffsmodifikator [Java]
Behandlung des Zugriffs auf Refactor-Eigenschaften mit Java Method Util
Einfacher LINE BOT mit Java Servlet
Wechseln Sie die Plätze mit Java
Installieren Sie Java mit Ansible
Bequemer Download mit JAVA
Informationen zu Java-Zugriffsmodifikatoren
Java-Download mit Ansible
Lass uns mit Java kratzen! !!
Erstellen Sie Java mit Wercker
Endian-Konvertierung mit JAVA
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Einfacher Mikroservice mit Spark Framework!
Verwenden Sie Lambda-Ebenen mit Java
Erstellen Sie mit Gradle ein Java-Multiprojekt
Erste Schritte mit Java Collection
Java-Konfiguration mit Spring MVC
Grundlegende Authentifizierung mit Java 11 HttpClient
Experimentieren wir mit der Java-Inline-Erweiterung
Führen Sie Batch mit Docker-Compose mit Java-Batch aus
[Vorlage] MySQL-Verbindung mit Java
Schreiben Sie Java Try-Catch mit Optional neu
Installieren Sie Java 7 mit Homebrew (Fass)
[Java] JSON-Kommunikation mit Jackson
Java zum Spielen mit Function
Versuchen Sie eine DB-Verbindung mit Java
[Java] JavaConfig mit statischer innerer Klasse
Versuchen Sie gRPC mit Java, Maven
Lassen Sie uns Excel mit Java betreiben! !!
Java-Versionsverwaltung mit SDKMAN
RSA-Verschlüsselung / Entschlüsselung mit Java 8
Paging PDF mit Java + PDFBox.jar
Sortieren Sie Zeichenfolgen als charakteristische Funktion mit Java
Objektorientiert mit Strike Gundam (Java)
Greifen Sie mit Micronaut auf Apache Kafka zu
Java-Versionsverwaltung mit jenv
Fehlerbehebung mit Java Flight Recorder
Optimieren Sie Java-Tests mit Spock
Stellen Sie mit Java eine Verbindung zur Datenbank her
Stellen Sie mit Java eine Verbindung zu MySQL 8 her
Fehler beim Spielen mit Java
Verwenden von Mapper mit Java (Spring)
Java Study Memo 2 mit Progate
Erste Schritte mit Java Basics
Einfaches Web-Scraping mit Jsoup
Einfache Bibliothekseinführung mit Maven!
Saisonale Anzeige mit Java-Schalter
Verwenden Sie SpatiaLite mit Java / JDBC
Lernen von Java mit Progate Note 1
Vergleichen Sie Java 8 Optional mit Swift
HTML-Analyse (Scraping) mit JAVA
Führen Sie Java VM mit Web Assembly aus
Bildschirmübergang mit Swing, Java
Java Unit Test mit Mockito
Herstellen einer Verbindung zu einer Datenbank mit Java (Teil 1) Möglicherweise die grundlegende Methode