Nosql数据库开发之Couchabse———开发使用篇

couchabse的安装与介绍在上篇博客中已经说过了,下面开始进行couchabse的初步开发与使用;

在阅读下面内容前,请先查看 : Nosql数据库开发之Couchabse———安装介绍篇 ,有了解后阅读会更容易,couchabse下载地址:阿里云的oss对象存储,个人服务,请勿重复下载

注:使用couchabse查询前必须建立索引,否则会查询报错,建索引语句与mysql类似:

create primary index on `bucketname`

1、建表:

在couchabse中,建表其实就是建model,建实体类:

在实体类上需要加@Document注解,不加这个注解会报错,@Id注解加载主键上,必须有@Id注解,也就是必须制定主键,不然会运行报错,@Field是加上属性上的,不加@Field的属性即使有值也不会存入到couchbase数据库中的;

2、建立查询:

泛型中填写的是你要查询得实体类,这一步骤类似于mvc中的dao层,数据连接层,User是要查询得pojo,而String则是User的主键类型,就是@Id所加的类型是什么,如果写好这个,那么在写方法的过程中就会出现提示了,要根据什么查询,这个自带的api还是很棒的,可节省很多写查询语句的工作,也很方便,关键是写法要符合规则,建议用提示,支持模糊查询,多条件查询,分页查询等,我写的主键是String类型,ps,建议在使用couchabse的项目中不要定义Integer类型、不要定义Bigdecimal类型,因为couchbase不支持这两种类型,couchabse支持的数据类型如下:

对于不支持的数据类型,比如Bigdecimal,不是说存不进去,而是存进去它其实是一个对象,包括三个值,大小、长度、精度,然后查询时候会报错,类型转换错误,Integer同理,报long到Integer不能完成自动转换;如果你非要使用不支持的类型,或者自己定义的类型,那么有个方法可以参考一下,自定义类型转换器,稍后我会将demo项目中的BigDecimal自定义类型转换为String及String自定义类型转换为BigDecimal示例贴出来,

关于查询还有一点要主要下,当你写的方法名称不符合api的规则时会报错,可以理解为允许自定义方法,但是必须得写@Query注解,不然会默认为你在调用couchbase的API,会进行代码检测,检测规则由你的Model决定

正确的写法如图所示,请注意,_class 在这里不是我们主动存入的,而是在做保存操作的时候couchabse自动检测并存入的。值为你要保存的实体类的路径,包名,在同一个bucket中,可能存放着多个‘’’表‘’的数据,用户、角色、商品、订单等等,数据隔离是由_class这个值确定的,具体介绍请看我的上一篇博客 : Nosql数据库开发之Couchabse———安装介绍篇 ,这里有详细的介绍与解释,这里就不多说了,不明白的请留言,会尽快回复;

好了,到这里,数据连接层就写完了,下面我们封装逻辑层:service层;

如图所示,在service层需要将之前的数据连接层UserReponsitory注入,类似于接口编程,在这里,我列出了一些查询与保存逻辑,**关于保存与更新我需要提示一下,在couchabse中,保存(新增或更新)都是用save(Entity e)这个api,它是自带的,不要重写,并且couchbase对更新还是保存的处理很简单,entity中有主键那么就去更新主键值的数据,不论这条数据是什么,只要id相同,就更新,或者称为覆盖,因此,在couchbase中千万不要使用Integer或者Long类型作为@Id的注解值,**使用String最为保险;另外。还有一些其他的不要重新的api,可以很方便的直接调用,这也是spring-data的优点,这里我就不一一介绍了;

其实到这里,couchabse的初步使用已经可以了,如何调用我就不多说了,详情请查看源码,多表联查与条件查询主要是查询语句的问题,以下我介绍几种常用的查询写法与couchbase数据备份及保存相关的命令:

1、couchbase数据备份:

cbbackup http://127.0.0.1:8091 D:\CouchbaseBak -u 用户名 -p 密码 -b 你要备份的bucketName

eg:cbbackup http://localhost:8091 D:\CouchbaseBak -u shaoyanghui -p 951209 -b shaoyanghui

2、couchbase数据还原:

cbrestore 备份的文件夹地址 http://127.0.0.1:8091 -u 用户名 -p 密码 --bucket-source=源bucket名  --bucket-destination=目标bucket名

eg:cbrestore D:\CouchbaseBak http://localhost:8091 -u shaoyanghui -p 951209 --bucket-source=shaoyanghui --bucket-destination=shaoyanghui

关于命令请自己配置下couchabse的bin目录,默认的安装地址为:C:\Program Files\Couchbase\Server\bin

3、查询部分

//1、带条件的判断查询语句
@Repository
public interface ReportTemplateRepo extends JpaRepository<ReportTemplateBean, Long>{

    @Query("SELECT rb FROM ReportBeanTemplate rb JOIN ExampleTable et WHERE et.idTemplate = rb.id AND ($id is null OR $id = rb.id) AND ($city is null OR $city = rb.city) AND ($state is null OR $state = rb.state)")
    public List<ReportTemplateBean> findTemplates(@Param("id") Long id, @Param("city") String city, @Param("state") String state);
}

//2、分页查询语句
//分类和品牌 
@Query("select META(np).id as _ID,META(np).id as id,META(np).cas as _CAS,name,goodNo,brandId,categoryId,model,len,width,unitId,subUnitId,imageUrl,cost,secondCost,status,shelvesTime,valid,creationDate,createdBy,lastUpdateDate,lastUpdateBy,sales,content from `np-product` np "
        + "where np.categoryId = $1 and np.brandId = $2  and np.model like $3 and _class='np.product.model.Commodity' order by np.status,np.goodNo asc  limit $4 offset $5 ")
List<Commodity> findByCategoryIdAndBrandIdAndModel(Long categoryId,Long brandId,String model,Long pagesize,Long pager);

//3、查询条件判断
//这样如果某个条件如id不需要出现在查询里面,传null进来即可。
//参数可以设为nullable:
User findByEmailAddress(@Nullable EmailAddress emailAdress);   

查询的写法基本如上,另外再附上目前开发的项目中使用couchabse的查询:

可以看到,其实语句的写法很多都是与mysql的sql写法相同,因此学习成本还是不算太大的,上手也会比较快,因为couchabse的数据都是存放在内存当中的,所以查询速度还是很不错的,就是mysql看起来更直观,这也是nosql的缺点;

另外个人这段时间使用couchabse的感触就是:别扭,一个人踩坑确实很慢,但是架构师非说要用这个数据库,而且没有一个技术指导,完全自己摸索,所以很清楚这个过程的痛,特此将这段时间的尝试写成博客,如有错误或遗漏之处,请多多指教;

应该会有第三篇:开发进阶篇,等过段时间更熟悉了再写吧;下面贴出示例源码:阿里云git ,使用的是阿里云的云效,感觉更好用了,当然不是开源的了,权限为公有读,同时也整合了mybatis,方便挪数据之用;

还是加上码云吧:码云地址

请自行修改.yml的配置,eureka的配置及spring-cloud-configd的配置,执行你的地址就行; 如有疑问之处,欢迎留言交流~

转载于:https://my.oschina.net/73114dh/blog/1941416

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值