Статьи

Приложение CRUD Java с Couchbase, Java EE и WildFly

Couchbase — это база данных документов с открытым исходным кодом, NoSQL. Он позволяет получать доступ, индексировать и запрашивать документы JSON, используя преимущества интегрированного распределенного кэширования для высокопроизводительного доступа к данным.

Разработчики могут писать приложения для Couchbase, используя несколько SDK на разных языках (Java, Go, .NET, Node, PHP, Python, C). Этот блог покажет, как вы можете легко создать приложение CRUD, используя Java SDK для Couchbase.

ОТДЫХ с Couchbase

Приложение будет использовать curl для выдачи команд REST конечной точке JAX-RS, развернутой в WildFly. Затем эти команды будут выполнять операции CRUD на travel-sample в Couchbase. N1QL (язык SQL-запросов для JSON) будет использоваться для связи с Couchbase для получения результатов. Будут использованы как «шаблон компоновщика», так и команды N1QL.

couchbase-падла-JavaEE-завиток

TL; DR

Полный исходный код и инструкции для образца доступны по адресу github.com/arun-gupta/couchbase-javaee .

Давайте начнем!

Запустите Couchbase Server

Сервер Couchbase можно легко загрузить со страницы загрузок Couchbase Server . В контейнерном мире намного проще запустить сервер Couchbase с помощью Docker .

Если на вашем компьютере настроен Docker, то самый простой способ — использовать Docker Compose для Couchbase :

01
02
03
04
05
06
07
08
09
10
mycouchbase:
  name: mycouchbase
  image: couchbase/server
  volumes:
    - ~/couchbase:/opt/couchbase/var
  ports:
    - 8091:8091
    - 8092:8092
    - 8093:8093
    - 11210:11210

Запуск сервера приложений показывает:

1
2
> docker-compose up -d
Creating couchbaseserver_mycouchbase_1

И тогда логи можно рассматривать как:

1
2
3
> docker-compose logs
Attaching to couchbaseserver_mycouchbase_1
mycouchbase_1 | Starting Couchbase Server -- Web UI available at http://<ip>:8091

База данных должна быть настроена и объяснена в Настройке Couchbase Server . Убедитесь, что установили ковш для travel-sample .

Развертывание приложения Java EE на WildFly

  • Загрузите WildFly 9.0.2 , разархивируйте и запустите сервер приложений WildFly как ./wildfly-9.0.0.Final/bin/standalone.sh .
  • Git клонирует репозиторий: git clone https://github.com/arun-gupta/couchbase-javaee.git
  • Изменить каталог cd couchbase-javaee
  • Разверните приложение в WildFly: mvn install -Pwildfly .

Приложение использует Java SDK для Couchbase путем импорта следующих координат Maven:

1
2
3
4
5
<dependency>
    <groupId>com.couchbase.client</groupId>
    <artifactId>java-client</artifactId>
    <version>2.2.1</version>
</dependency>

Вызовите конечные точки REST, используя cURL

ПОЛУЧИТЬ ресурсы авиакомпании (ограничение до 10)

Давайте запросим базу данных, чтобы перечислить 10 ресурсов авиакомпании.

Запрос

01
02
03
04
05
06
07
08
09
10
11
~ > curl -v http://localhost:8080/couchbase-javaee/resources/airline
* Hostname was NOT found in DNS cache
*   Trying ::1...
* connect to ::1 port 8080 failed: Connection refused
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /couchbase-javaee/resources/airline HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:8080
> Accept: */*
>

отклик

01
02
03
04
05
06
07
08
09
10
11
< HTTP/1.1 200 OK
< Connection: keep-alive
< X-Powered-By: Undertow/1
* Server WildFly/9 is not blacklisted
< Server: WildFly/9
< Content-Type: application/octet-stream
< Content-Length: 1415
< Date: Wed, 18 Nov 2015 21:19:15 GMT
<
* Connection #0 to host localhost left intact
[{"travel-sample":{"country":"France","iata":"SB","callsign":"AIRCALIN","name":"Air Caledonie International","icao":"ACI","id":139,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"WQ","callsign":null,"name":"PanAm World Airways","icao":"PQW","id":13633,"type":"airline"}}, {"travel-sample":{"country":"United Kingdom","iata":"BA","callsign":"SPEEDBIRD","name":"British Airways","icao":"BAW","id":1355,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"FL","callsign":"CITRUS","name":"AirTran Airways","icao":"TRS","id":1316,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"-+","callsign":null,"name":"U.S. Air","icao":"--+","id":13391,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"Q5","callsign":"MILE-AIR","name":"40-Mile Air","icao":"MLA","id":10,"type":"airline"}}, {"travel-sample":{"country":"France","iata":"AF","callsign":"AIRFRANS","name":"Air France","icao":"AFR","id":137,"type":"airline"}}, {"travel-sample":{"country":"United States","iata":"K5","callsign":"SASQUATCH","name":"SeaPort Airlines","icao":"SQH","id":10765,"type":"airline"}}, {"travel-sample":{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlinair","icao":"RLA","id":1203,"type":"airline"}}, {"travel-sample":{"country":"United Kingdom","iata":"5W","callsign":"FLYSTAR","name":"Astraeus","icao":"AEU","id":112,"type":"airline"}}]

Запрос N1QL для этого записывается так:

1
2
3
4
N1qlQuery query = N1qlQuery
                .simple(select("*")
                .from(i(database.getBucket().name()))
                .limit(10));

И также может быть записан как:

1
SELECT * FROM `travel-sample` LIMIT 10

При желании вы можете обновить код, включив в него предложение ORDER BY, как показано в руководстве по N1QL .

ПОЛУЧИТЬ один ресурс авиакомпании

Используйте атрибут id для запроса одного ресурса авиакомпании

Запрос

01
02
03
04
05
06
07
08
09
10
11
~ > curl -v http://localhost:8080/couchbase-javaee/resources/airline/139
* Hostname was NOT found in DNS cache
*   Trying ::1...
* connect to ::1 port 8080 failed: Connection refused
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /couchbase-javaee/resources/airline/139 HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:8080
> Accept: */*
>

отклик

01
02
03
04
05
06
07
08
09
10
11
< HTTP/1.1 200 OK
< Connection: keep-alive
< X-Powered-By: Undertow/1
* Server WildFly/9 is not blacklisted
< Server: WildFly/9
< Content-Type: application/octet-stream
< Content-Length: 148
< Date: Wed, 18 Nov 2015 21:23:34 GMT
<
* Connection #0 to host localhost left intact
{"travel-sample":{"country":"France","iata":"SB","callsign":"AIRCALIN","name":"Air Caledonie International","icao":"ACI","id":139,"type":"airline"}}

ПОСТ новый ресурс авиакомпании

Узнайте, как выполнять запросы N1QL из интерфейса командной строки с помощью инструмента CBQ, и проверьте имеющиеся образцы данных:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
bin > ./cbq -engine=http://192.168.99.100:8093
Couchbase query shell connected to http://192.168.99.100:8093/ . Type Ctrl-D to exit.
cbq> select * from `travel-sample` where name="Airlinair" limit 10;
{
    "requestID": "ce2de67b-2c05-47df-afbe-343cb7409d2b",
    "signature": {
        "*": "*"
    },
    "results": [
        {
            "travel-sample": {
                "callsign": "AIRLINAIR",
                "country": "France",
                "iata": "A5",
                "icao": "RLA",
                "id": 1203,
                "name": "Airlinair",
                "type": "airline"
            }
        }
    ],
    "status": "success",
    "metrics": {
        "elapsedTime": "3.418285894s",
        "executionTime": "3.418232688s",
        "resultCount": 1,
        "resultSize": 294
    }
}

Этот запрос позволяет получить документы, в которых авиакомпания носит название Airlinair . Количество отображается в metrics.resultCount .

Создайте новый документ, используя POST.

Запрос

01
02
03
04
05
06
07
08
09
10
11
12
13
~ > curl -v -H "Content-Type: application/json" -X POST -d '{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlinair","icao":"RLA","type":"airline"}' http://localhost:8080/couchbase-javaee/resources/airline
* Hostname was NOT found in DNS cache
*   Trying ::1...
* connect to ::1 port 8080 failed: Connection refused
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /couchbase-javaee/resources/airline HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:8080
> Accept: */*
> Content-Type: application/json
> Content-Length: 104
>

отклик

01
02
03
04
05
06
07
08
09
10
11
12
* upload completely sent off: 104 out of 104 bytes
< HTTP/1.1 200 OK
< Connection: keep-alive
< X-Powered-By: Undertow/1
* Server WildFly/9 is not blacklisted
< Server: WildFly/9
< Content-Type: application/octet-stream
< Content-Length: 117
< Date: Wed, 18 Nov 2015 21:42:51 GMT
<
* Connection #0 to host localhost left intact
{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlinair","icao":"RLA","id":"19810","type":"airline"}

Сделайте запрос снова, используя CBQ, и теперь результаты отображаются в виде:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
cbq> select * from `travel-sample` where name="Airlinair" limit 10;
{
    "requestID": "5e79031a-f7ee-4cc9-8c87-4e3b7484f09f",
    "signature": {
        "*": "*"
    },
    "results": [
        {
            "travel-sample": {
                "callsign": "AIRLINAIR",
                "country": "France",
                "iata": "A5",
                "icao": "RLA",
                "id": 1203,
                "name": "Airlinair",
                "type": "airline"
            }
        },
        {
            "travel-sample": {
                "callsign": "AIRLINAIR",
                "country": "France",
                "iata": "A5",
                "icao": "RLA",
                "id": "19810",
                "name": "Airlinair",
                "type": "airline"
            }
        }
    ],
    "status": "success",
    "metrics": {
        "elapsedTime": "3.342391947s",
        "executionTime": "3.342343455s",
        "resultCount": 2,
        "resultSize": 591
    }
}

Обратите внимание, что вместо одного документа перед выполнением команды POST возвращается два документа JSON.

PUT существующий ресурс авиакомпании

Обновите существующий ресурс, используя HTTP POST.

Модель данных для сегмента travel-sample требует включения атрибута «id» в полезную нагрузку, а также в URI.

Запрос

01
02
03
04
05
06
07
08
09
10
11
12
13
14
~ > curl -v -H "Content-Type: application/json" -X PUT -d '{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlin Air","icao":"RLA","type":"airline","id": "19810"}' http://localhost:8080/couchbase-javaee/resources/airline/19810
* Hostname was NOT found in DNS cache
*   Trying ::1...
* connect to ::1 port 8080 failed: Connection refused
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> PUT /couchbase-javaee/resources/airline/19810 HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:8080
> Accept: */*
> Content-Type: application/json
> Content-Length: 118
>
* upload completely sent off: 118 out of 118 bytes

Название авиакомпании обновляется с «Airlinair» до «Airlin Air», все остальные атрибуты остаются прежними.

отклик

01
02
03
04
05
06
07
08
09
10
11
< HTTP/1.1 200 OK
< Connection: keep-alive
< X-Powered-By: Undertow/1
* Server WildFly/9 is not blacklisted
< Server: WildFly/9
< Content-Type: application/octet-stream
< Content-Length: 117
< Date: Wed, 18 Nov 2015 21:46:16 GMT
<
* Connection #0 to host localhost left intact
{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlin Air","icao":"RLA","id":"19810","type":"airline"}

Обновленная запись отображается в ответе.

Запрос для Airlinair дает:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cbq> select * from `travel-sample` where name="Airlinair" limit 10;
{
    "requestID": "a8d72427-9f4b-49ab-a77a-17cd99cdce5f",
    "signature": {
        "*": "*"
    },
    "results": [
        {
            "travel-sample": {
                "callsign": "AIRLINAIR",
                "country": "France",
                "iata": "A5",
                "icao": "RLA",
                "id": 1203,
                "name": "Airlinair",
                "type": "airline"
            }
        }
    ],
    "status": "success",
    "metrics": {
        "elapsedTime": "3.372603693s",
        "executionTime": "3.37256091s",
        "resultCount": 1,
        "resultSize": 294
    }
}

Таким образом, ранее добавленная запись теперь обновляется и, следовательно, не появляется в результатах запроса. Запрос для Airlin Air дает:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cbq> select * from `travel-sample` where name="Airlin Air" limit 10;
{
    "requestID": "a3797a73-d879-4ca1-be90-e07179aae118",
    "signature": {
        "*": "*"
    },
    "results": [
        {
            "travel-sample": {
                "callsign": "AIRLINAIR",
                "country": "France",
                "iata": "A5",
                "icao": "RLA",
                "id": "19810",
                "name": "Airlin Air",
                "type": "airline"
            }
        }
    ],
    "status": "success",
    "metrics": {
        "elapsedTime": "3.393649025s",
        "executionTime": "3.393530368s",
        "resultCount": 1,
        "resultSize": 298
    }
}

Это показывает недавно обновленный документ.

УДАЛИТЬ существующий ресурс авиакомпании

Запросить уникальный идентификатор:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cbq> select * from `travel-sample` where id="19810" limit 10;
{
    "requestID": "47a315cd-afe4-45a8-8814-5ab3034e0d0f",
    "signature": {
        "*": "*"
    },
    "results": [
        {
            "travel-sample": {
                "callsign": "AIRLINAIR",
                "country": "France",
                "iata": "A5",
                "icao": "RLA",
                "id": "19810",
                "name": "Airlin Air",
                "type": "airline"
            }
        }
    ],
    "status": "success",
    "metrics": {
        "elapsedTime": "3.006863656s",
        "executionTime": "3.006821997s",
        "resultCount": 1,
        "resultSize": 298
    }
}

Обратите внимание, что один документ возвращается.

Давайте удалим этот документ.

Запрос

01
02
03
04
05
06
07
08
09
10
11
~ > curl -v -X DELETE http://localhost:8080/couchbase-javaee/resources/airline/19810
* Hostname was NOT found in DNS cache
*   Trying ::1...
* connect to ::1 port 8080 failed: Connection refused
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> DELETE /couchbase-javaee/resources/airline/19810 HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:8080
> Accept: */*
>

отклик

01
02
03
04
05
06
07
08
09
10
11
> HTTP/1.1 200 OK
> Connection: keep-alive
> X-Powered-By: Undertow/1
* Server WildFly/9 is not blacklisted
> Server: WildFly/9
> Content-Type: application/octet-stream
> Content-Length: 136
> Date: Wed, 18 Nov 2015 21:52:47 GMT
>
* Connection #0 to host localhost left intact
{"travel-sample":{"country":"France","iata":"A5","callsign":"AIRLINAIR","name":"Airlin Air","icao":"RLA","id":"19810","type":"airline"}}

Удаленный документ отображается в ответе.

Снова запросите удаленный идентификатор:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
cbq> select * from `travel-sample` where id="19810" limit 10;
{
    "requestID": "972b0bbd-ba25-4f6c-a30e-ed188bf43588",
    "signature": {
        "*": "*"
    },
    "results": [
    ],
    "status": "success",
    "metrics": {
        "elapsedTime": "3.261481199s",
        "executionTime": "3.261431917s",
        "resultCount": 0,
        "resultSize": 0
    }
}

И никаких результатов не возвращается!

Наслаждайтесь!

Ссылка: Приложение CRUD Java с Couchbase, Java EE и WildFly от нашего партнера по JCG Аруна Гупта из блога Miles to go 2.0… .