JSONPlaceholder ist eine öffentliche Test-API ohne Authentifizierung — gut geeignet, um den RestJdbc-Treiber auszuprobieren (Lesen und Schreiben).
SQL-Dateien lassen sich direkt mit dem Treiber-JAR ausführen:
java -jar restjdbc.jar jsonplaceholder.sql
Die Datei jsonplaceholder.sql enthält Verbindung und Beispiel-Abfragen. Vorgehen:
restjdbc.jar)jsonplaceholder.sql und jsonplaceholder-spec.json liegenIm JDBC-Client:
connect 'jdbc:rest:https://jsonplaceholder.typicode.com|spec=jsonplaceholder-spec.json'
Nach Ausführung der Datei beendet quit den Client.
jdbc:rest:https://jsonplaceholder.typicode.com
Die Basis-URL der API steht in der JDBC-URL.
| Bestandteil | Wert |
|---|---|
| Treiber-Präfix | jdbc:rest: |
| API-Basis-URL | https://jsonplaceholder.typicode.com |
| Schema (SQL) | public (Standard) |
Beispiel-Verbindung (Java):
Properties props = new Properties();
props.setProperty("spec", "/pfad/zu/jsonplaceholder-spec.json");
Connection conn = DriverManager.getConnection(
"jdbc:rest:https://jsonplaceholder.typicode.com", props);
| Property | Wert für JSONPlaceholder | Erforderlich |
|---|---|---|
spec |
Pfad zur Spec (siehe unten) | Ja |
auth |
nicht nötig (none) |
Nein |
user, password, token |
— | Nein |
keyStore, … |
— | Nein |
Minimal:
props.setProperty("spec", "/pfad/zu/jsonplaceholder-spec.json");
Spec-Pfad: absoluter Pfad zu Ihrer lokalen Kopie der Spec-Datei.
Spec-Datei: jsonplaceholder-spec.json
Datei: jsonplaceholder-spec.json
Auszug (posts mit Seiten-Paginierung):
{
"entities": [
{
"name": "posts",
"path": "/posts",
"pagination": {
"type": "page",
"limitParam": "_limit",
"pageParam": "_page",
"defaultLimit": 10
},
"columns": [
{ "name": "id", "type": "BIGINT", "primaryKey": true },
{ "name": "userId", "type": "BIGINT" },
{ "name": "title", "type": "VARCHAR" },
{ "name": "body", "type": "VARCHAR" }
]
}
]
}
| SQL-Tabelle | REST-Pfad | Paginierung |
|---|---|---|
users |
/users |
none (ein Request) |
posts |
/posts |
page mit _limit, _page |
comments |
/comments |
page mit _limit, _page |
albums |
/albums |
none |
photos |
/photos |
page mit _limit, _page |
todos |
/todos |
page mit _limit, _page |
Bei page-Paginierung lädt der Treiber automatisch alle Seiten (z. B. alle 100 Posts), bis keine Daten mehr kommen.
Verschachtelte Felder bei users (address, company) sind in der Spec bewusst weggelassen — der Treiber liest standardmäßig nur flache Top-Level-Felder.
JSONPlaceholder verlangt keine Authentifizierung.
props.setProperty("auth", "none");
Oder einfach keine Auth-Properties setzen.
Es werden keine Authorization-Header gesendet; Client-Zertifikat (clientcert) ist nicht nötig.
Spalten mit gemischter Schreibweise (userId, postId) in SQL quoten ("userId").
SELECT id, name, email FROM users;
SELECT id, title FROM posts FILTER userId=1;
SELECT id, name, email FROM comments FILTER postId=1;
SELECT id, title, completed FROM todos FILTER userId=1;
| SQL | HTTP |
|---|---|
SELECT … FROM users |
GET https://jsonplaceholder.typicode.com/users |
SELECT … FROM posts FILTER userId=1 |
GET …/posts?userId=1 |
SELECT … FROM comments FILTER postId=1 |
GET …/comments?postId=1 |
SELECT … FROM posts (alle Posts) |
GET …/posts?_limit=10&_page=1, dann _page=2, … |
FILTER leitet Filter serverseitig an die API weiter (nicht wie WHERE lokal).
INSERT INTO posts ("userId", title, body)
VALUES (1, 'Test', 'Body');
→ POST https://jsonplaceholder.typicode.com/posts mit JSON-Body {"userId":1,"title":"Test","body":"Body"}.
JSONPlaceholder simuliert Schreiboperationen — die API antwortet mit Erfolg, persistiert Daten aber nicht dauerhaft.
UPDATE posts SET title = 'Neuer Titel', body = 'Neuer Inhalt' FILTER id=1;
→ PUT https://jsonplaceholder.typicode.com/posts/1 mit JSON-Body aus den SET-Spalten.
DELETE FROM posts FILTER id=1;
→ DELETE https://jsonplaceholder.typicode.com/posts/1.
Metadaten aus der Spec abfragen:
SELECT table_name, remarks FROM system.table_list;
SELECT column_name, type_name FROM system.column_list WHERE table_name = 'posts';
SELECT column_name FROM system.pk_list WHERE table_name = 'posts';
posts, comments, photos und todos ist in der Spec "type": "page" mit _limit und _page konfiguriert; der Treiber lädt alle Seiten automatisch.