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的配置,执行你的地址就行; 如有疑问之处,欢迎留言交流~