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! ".
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.
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>
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)
)
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
}
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.
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);
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);
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);
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);
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.
beginTransaction
Methode von Sql2o
(die Verbindung abrufen, die die Transaktion gestartet hat)// 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.
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