couchbase

Couchbase是一个开源的NoSQL文档数据库。 它允许访问,索引和查询JSON文档,同时利用集成的分布式缓存来实现高性能数据访问。

开发人员可以使用不同的语言(Java,Go,.NET,Node,PHP,Python,C) 多种SDK将应用程序编写到Couchbase。 该博客将展示如何使用Java SDK for Couchbase轻松创建CRUD应用程序。

带有Couchbase的REST

该应用程序将使用curl向部署在WildFly上的JAX-RS端点发出REST命令。 然后,这些命令将对Couchbase中的travel-sample存储桶执行CRUD操作。 N1QL(JSONSQL查询语言)将用于与Couchbase通信以检索结果。 “生成器模式”和原始N1QL命令都将使用。

TL; DR

样本的完整源代码和说明可在github.com/arun-gupta/couchbase-javaee中找到 。

让我们开始吧!

运行Couchbase服务器

可以从“ Couchbase服务器下载”页面轻松下载Couchbase服务器 。 在容器化的世界中, 使用Docker启动Couchbase服务器要容易得多 。

如果在您的计算机上配置了Docker,那么最简单的方法是将Docker Compose用于Couchbase :

mycouchbase:name: mycouchbaseimage: couchbase/servervolumes:- ~/couchbase:/opt/couchbase/varports:- 8091:8091- 8092:8092 - 8093:8093 - 11210:11210

启动应用程序服务器显示:

> docker-compose up -d
Creating couchbaseserver_mycouchbase_1

然后日志可以看成是:

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

该数据库需要配置,并在“ 配置Couchbase服务器”中进行了说明 。 确保安装travel-sample桶。

在WildFly上部署Java EE应用程序

  • 下载WildFly 9.0.2 ,解压缩,然后以./wildfly-9.0.0.Final/bin/standalone.sh启动WildFly应用程序服务器。
  • Git克隆仓库: git clone https://github.com/arun-gupta/couchbase-javaee.git
  • 更改目录cd couchbase-javaee
  • 将应用程序部署到WildFly: mvn install -Pwildfly

该应用程序通过导入以下Maven坐标将Java SDK用于Couchbase :

<dependency><groupId>com.couchbase.client</groupId><artifactId>java-client</artifactId><version>2.2.1</version>
</dependency>

使用cURL调用REST端点

GET航空公司资源(最多10个)

让我们查询数据库以列出10个航空公司资源。

请求

~ > 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: */*
>

响应

< 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查询对此写为:

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

并且也可以写成:

SELECT * FROM `travel-sample` LIMIT 10

您可以选择更新代码以包含ORDER BY子句,如N1QL教程中所示。

获得一份航空公司资源

使用id属性查询单个航空公司资源

请求

~ > 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: */*
>

响应

< 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"}}

发布新的航空公司资源

了解如何使用CBQ工具从CLI运行N1QL查询并验证现有样本数据:

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创建一个新文档。

请求

~ > 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
>

响应

* 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再次查询,现在结果显示为:

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}
}

请注意,返回的是两个JSON文档,而不是发出POST命令之前的一个。

放置现有的航空公司资源

使用HTTP POST更新现有资源。

travel-sample存储区的数据模型需要在有效负载和URI中都包含“ id”属性。

请求

~ > 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”,所有其他属性保持不变。

响应

< 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会给出:

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可得到:

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}
}

这显示了新更新的文档。

删除现有的航空公司资源

查询唯一的ID:

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}
}

请注意,返回了一个文档。

让我们删除此文档。

请求

~ > 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: */*
>

响应

> 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"}}

删除的文档显示在响应中。

再次查询已删除的ID:

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}
}

而且没有结果返回!

  • 如前所述,完整的代码库位于github.com/arun-gupta/couchbase-javaee 。

请享用!

翻译自: https://www.javacodegeeks.com/2015/11/crud-java-application-couchbase-java-ee-wildfly.html

couchbase

couchbase_具有Couchbase,Java EE和WildFly的CRUD Java应用程序相关推荐

  1. 具有Couchbase,Java EE和WildFly的CRUD Java应用程序

    Couchbase是一个开源的NoSQL文档数据库. 它允许访问,索引和查询JSON文档,同时利用集成的分布式缓存来实现高性能的数据访问. 开发人员可以使用不同的语言(Java,Go,.NET,Nod ...

  2. java ee maven_针对新手的Java EE7和Maven项目–第5部分–使用Arquillian / Wildfly 8进行单元测试...

    java ee maven 从前面的部分恢复 第1 部分 , 第2 部分 , 第3 部分 , 第4部分 , 这是第一篇"额外"文章,基于我在该系列博客文章中"构建&quo ...

  3. java ee各类组件_在Java EE组件中使用骆驼路线

    java ee各类组件 从现在开始我一直在与Camel合作,我真的很喜欢它的简单性. 在Java EE之上使用它一直是一个挑战,我最近发表了一篇关于如何做到这一点的演讲,而在Java EE中引导Cam ...

  4. java ee maven_针对新手的Java EE7和Maven项目–第8部分

    java ee maven 第一部分 , 第2部分 , 第3部分 , 第4部分 , 第5部分 , 第6部分 , 第7部分 第8部分 自上一篇文章以来,这一系列教程已经有很长时间了. 是时候恢复并在我们 ...

  5. java ee maven_针对新手的Java EE7和Maven项目–第6部分

    java ee maven 从前面的部分恢复 第1 部分 , 第2 部分 , 第3 部分 , 第4 部分 , 第5部分 在上一篇文章(第5部分)中,我们发现了如何使用Arquillian(我们的EJB ...

  6. java ee maven_针对新手的Java EE7和Maven项目–第7部分

    java ee maven 从前面的部分恢复 第1 部分 , 第2 部分 , 第3 部分 , 第4 部分 , 第5 部分 , 第6部分 在上一篇文章(第6章)中,我们发现了如何使用Arquillian ...

  7. java ee maven_针对新手的Java EE7和Maven项目–第1部分–简单的Maven项目结构–父pom...

    java ee maven 为什么呢 很多时候,我在日常工作中试图解决一些基本或复杂的Maven / Java EE项目结构问题. 为了提供解决方案,我经常最终会尝试项目结构,测试我在不同应用程序服务 ...

  8. java ee开发环境_设置Java EE 6开发环境

    java ee开发环境 本教程简要说明了如何设置典型的环境来开发基于Java EE 6的应用程序. 除了可以正常工作的Windows XP客户端具有足够的CPU能力和内存外,本教程没有其他先决条件. ...

  9. Java EE 8 –为更多设备提供更多应用程序

    如果我不喜欢夏天的一件事,那就是事实是没有太多要分享或谈论的新闻. 谁决定将Java Day Tokyo置于这一年的无聊时间里,谁干得不错,就给我一个机会撰写有关新的和即将到来的Java EE 8规范 ...

最新文章

  1. BeagleBone Black快速入门教程
  2. qt系统托盘显示、无主窗体
  3. Vue基础之Vue模板语法
  4. java object 转byte_Java将对象Object转换成Byte字节数组
  5. layui select 修改_layui怎么修改select的值?
  6. 2018北科大计算机学院复试方案,2018年北京交通大学考研复试及录取办法
  7. 系统级芯片设计语言和验证语言的发展
  8. catia快捷键_CATIA的管理员模式和多版本环境变量设置
  9. ppt将画好的箭头改为直线
  10. 浅析json_encode
  11. Codeforces - 1102F - Elongated Matrix(建图 + 哈密顿通路)
  12. 【漏洞扫描与复现】Kali之Metasploit渗透测试
  13. 演讲实录:“分布式数据库海量数据存储和实时查询实现与应用”
  14. spring jsm(一)
  15. maven项目对接harbor镜像仓库配置详解分析
  16. 基于ART-PI SPI驱动W25Q128
  17. 在计算机中c语言是属于什么作用,C语言属于下列哪一类计算机语言( )
  18. Qt编写可视化大屏电子看板系统30-模块8物料管理
  19. php表格怎么导成excel,cad表格如何导出到excel
  20. 极验第四代滑块验证码破解(一):AST还原混淆JS

热门文章

  1. 不止代码:机器分配(动态规划)
  2. CF605E-Intergalaxy Trips【期望dp】
  3. jzoj3237-间谍派遣【最小生成树,并查集】
  4. P1768-天路【负环,SPFA,01分数规划,二分答案】
  5. jzoj4248-n染色【数学,快速幂】
  6. 纪中C组模拟赛总结(2019.7.12)
  7. CERC2017 Gambling Guide,最短路变形,期望dp
  8. codeforces G - Almost Increasing Array 动态规划、动态开点线段树
  9. 汇编语言(三十二)之读写文件
  10. 告诉你,Spring Boot 真是个牛逼货