之前写了JAVA操作cassandra驱动包,现在来看看spring-data对cassandra的支持。这里是spring-data-cassandra的官方文档:http://docs.spring.io/spring-data/cassandra/docs/1.5.0.M1/reference/html/

这个目录下还有api、版本日志等:http://docs.spring.io/spring-data/cassandra/docs/1.5.0.M1/

  1. 引入jar包

    <!-- 这里对应的是cassandra3.0之后的版本 -->
    <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-cassandra</artifactId>
    <version>1.5.0.M1</version>
    </dependency>
  2. 定义域模型(实体类)
    不存在复合主键的情况:
    package com.my.domin.pojo;
    
    import org.springframework.data.cassandra.mapping.Column;
    import org.springframework.data.cassandra.mapping.PrimaryKey;
    import org.springframework.data.cassandra.mapping.Table; @Table
    public class Person
    {
    // 主键
    @PrimaryKey
    private String id; // 列名 与数据库列名一致时可不加
    @Column(value = "name")
    private String name; private int age; // 支持构造函数
    public Person(String id, String name, int age)
    {
    this.id = id;
    this.name = name;
    this.age = age;
    } public String getId()
    {
    return id;
    } public void setId(String id)
    {
    this.id = id;
    } public String getName()
    {
    return name;
    } public void setName(String name)
    {
    this.name = name;
    } public int getAge()
    {
    return age;
    } public void setAge(int age)
    {
    this.age = age;
    } @Override
    public String toString()
    {
    return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
    } }

    对应的CQL建表语句

    CREATE TABLE mydb.person (
    id text PRIMARY KEY,
    age int,
    name text
    )

    可以看出和JPA的注解很类似,不同的是cassandra主键用的是@PrimaryKey,而且允许使用构造函数。
    如果存在复合主键,则要先映射一个主键的实体类,再映射一个包含这个主键的实体类

    package com.my.domin.pojo;
    
    import org.springframework.cassandra.core.Ordering;
    import org.springframework.cassandra.core.PrimaryKeyType;
    import org.springframework.data.cassandra.mapping.PrimaryKeyClass;
    import org.springframework.data.cassandra.mapping.PrimaryKeyColumn; @PrimaryKeyClass
    public class Person2Key
    { // 分区键
    @PrimaryKeyColumn(name = "id", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    private String id; // 集群键
    @PrimaryKeyColumn(name = "name", ordinal = 1, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.DESCENDING)
    private String name; public String getId()
    {
    return id;
    } public void setId(String id)
    {
    this.id = id;
    } public String getName()
    {
    return name;
    } public void setName(String name)
    {
    this.name = name;
    } @Override
    public String toString()
    {
    return "Person2Key [id=" + id + ", name=" + name + "]";
    } }
    package com.my.domin.pojo;
    
    import org.springframework.data.cassandra.mapping.PrimaryKey;
    import org.springframework.data.cassandra.mapping.Table; @Table(value = "person2")
    public class Person2
    {
    @PrimaryKey
    private Person2Key pKey; private int age; public Person2Key getpKey()
    {
    return pKey;
    } public void setpKey(Person2Key pKey)
    {
    this.pKey = pKey;
    } public int getAge()
    {
    return age;
    } public void setAge(int age)
    {
    this.age = age;
    } @Override
    public String toString()
    {
    return "Person2 [pKey=" + pKey + ", age=" + age + "]";
    } }

    对应的CQL建表语句

    CREATE TABLE mydb.person2 (
    id text,
    name text,
    age int,
    PRIMARY KEY (id, name)
    ) WITH CLUSTERING ORDER BY (name DESC)

    其中的WITH CLUSTERING ORDER BY (name DESC) 对应主键类里的ordering = Ordering.DESCENDING,按照name降序存储,只有集群键才能在建表时设置降序存储。
    其实还有更加复杂的复合分区键、复合集群键组合成的主键,看懂了上面应该就能举一反三了,而且用的不多,这里就不写了。

  3. 定义spring-data接口
    package com.my.repository;
    
    import java.util.List;
    
    import org.springframework.data.cassandra.repository.Query;
    import org.springframework.data.repository.CrudRepository;
    import org.springframework.stereotype.Repository; import com.my.domin.pojo.Person2; @Repository
    public interface PersonRepository extends CrudRepository<Person2, String>
    {
    @Query("select * from Person2 where id= ?1 and name= ?2")
    List<Person2> findByIdAndName(String id, String name);
    }

    我们可以看看继承的CrudRepository这个仓库接口类

    /*
    * Copyright 2008-2011 the original author or authors.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    * http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    package org.springframework.data.repository; import java.io.Serializable; /**
    * Interface for generic CRUD operations on a repository for a specific type.
    *
    * @author Oliver Gierke
    * @author Eberhard Wolff
    */
    @NoRepositoryBean
    public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> { /**
    * Saves a given entity. Use the returned instance for further operations as the save operation might have changed the
    * entity instance completely.
    *
    * @param entity
    * @return the saved entity
    */
    <S extends T> S save(S entity); /**
    * Saves all given entities.
    *
    * @param entities
    * @return the saved entities
    * @throws IllegalArgumentException in case the given entity is {@literal null}.
    */
    <S extends T> Iterable<S> save(Iterable<S> entities); /**
    * Retrieves an entity by its id.
    *
    * @param id must not be {@literal null}.
    * @return the entity with the given id or {@literal null} if none found
    * @throws IllegalArgumentException if {@code id} is {@literal null}
    */
    T findOne(ID id); /**
    * Returns whether an entity with the given id exists.
    *
    * @param id must not be {@literal null}.
    * @return true if an entity with the given id exists, {@literal false} otherwise
    * @throws IllegalArgumentException if {@code id} is {@literal null}
    */
    boolean exists(ID id); /**
    * Returns all instances of the type.
    *
    * @return all entities
    */
    Iterable<T> findAll(); /**
    * Returns all instances of the type with the given IDs.
    *
    * @param ids
    * @return
    */
    Iterable<T> findAll(Iterable<ID> ids); /**
    * Returns the number of entities available.
    *
    * @return the number of entities
    */
    long count(); /**
    * Deletes the entity with the given id.
    *
    * @param id must not be {@literal null}.
    * @throws IllegalArgumentException in case the given {@code id} is {@literal null}
    */
    void delete(ID id); /**
    * Deletes a given entity.
    *
    * @param entity
    * @throws IllegalArgumentException in case the given entity is {@literal null}.
    */
    void delete(T entity); /**
    * Deletes the given entities.
    *
    * @param entities
    * @throws IllegalArgumentException in case the given {@link Iterable} is {@literal null}.
    */
    void delete(Iterable<? extends T> entities); /**
    * Deletes all entities managed by the repository.
    */
    void deleteAll();
    }

    这里面实现了一组CURD方法,如果要写一些条件查询的话可以参考

    @Query("select * from Person where id= ?1 and name= ?2 ALLOW FILTERING")
    List<Person> findByIdAndName(String id, String name);

    这里要注意的是cassandra支持的查询是有限制的,可以参考这篇文章http://zhaoyanblog.com/archives/265.html 。3.0之后的版本改善了许多(如上面的查询3.0以下的版本是不支持的,name为非主键字段),一个是支持了非主键的条件查询,一个是降低了集群键的查询限制条件,这里最好自己在cql中测试一下。
    spring-data-cassandra文档里还提到一个分页的仓库接口类PagingAndSortingRepository,这个继承自CrudRepository,而且提供了2个分页方法。但是经过测试是不能用的。。至少我没有测试通过,不知道是没有实现(比较倾向于这个,cassandra分页的确比较麻烦),还是自己没有正确使用。

  4. application.xml配置文件
    看名字就知道spring-data-cassandra是和spring一起使用的,下面的配置只是最最基本的,更多的配置选项可以参考 https://my.oschina.net/u/2392555/blog/469893 这篇文章。
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:cassandra="http://www.springframework.org/schema/data/cassandra"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/data/cassandra
    http://www.springframework.org/schema/data/cassandra/spring-cassandra-1.0.xsd
    http://www.springframework.org/schema/data/cassandra/spring-cql.xsd
    http://www.springframework.org/schema/data/cassandra/spring-cql-1.0.xsd
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    "> <!-- 引入属性文件 -->
    <context:property-placeholder location="classpath:cassandra.properties" /> <!-- 自动扫描(自动注入) -->
    <context:component-scan base-package="com.my" /> <!-- 注解方式配置事物 -->
    <tx:annotation-driven transaction-manager="transactionManager" /> <!-- spring-cassandra -->
    <cassandra:cluster contact-points="${cassandra_contactpoints}" port="${cassandra_port}" username="${cassandra_username}" password="${cassandra_password}" /> <!-- 当前使用scheam -->
    <cassandra:session keyspace-name="${cassandra_keyspace}" /> <!-- orm -->
    <cassandra:mapping /> <!-- 类型转换 -->
    <cassandra:converter /> <!-- cassandra operater -->
    <cassandra:template id="cqlTemplate" /> <!-- spring data 接口 -->
    <cassandra:repositories base-package="com.my.repository" /> </beans>

    这个配置文件都有注释,没什么可讲的,唯一要注意的是<cassandra:template id="cqlTemplate" /> ,官方文档上写的是<cassandra:template id="cassandraTemplate" />,经过测试官方文档上写的不能使用,改为上面的就好了。
    其中cassandra.properties文件配置

    #cassandra数据库连接
    #节点ip
    cassandra_contactpoints=192.168.3.89
    #端口
    cassandra_port=9042
    #当前操作键空间
    cassandra_keyspace=mydb
    #登录用户名
    cassandra_username=cassandra
    #登录密码
    cassandra_password=cassandra
  5. 使用测试
    cassandra数据库person表中数据如下:

    测试方法:
    package com.my.serviceImpl;
    
    import java.util.Iterator;
    import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.cassandra.core.CassandraOperations;
    import org.springframework.stereotype.Service; import com.datastax.driver.core.querybuilder.QueryBuilder;
    import com.datastax.driver.core.querybuilder.Select;
    import com.my.domin.pojo.Person;
    import com.my.repository.PersonRepository;
    import com.my.service.PersonService; @Service
    public class PersonServiceImpl implements PersonService
    {
    @Autowired
    private PersonRepository personRepository; @Autowired
    private CassandraOperations cassandraOperations; @Override
    public void test()
    {
    //通过Repository查询
    Iterable<Person> iterable = personRepository.findAll();
    Iterator<Person> it = iterable.iterator();
    System.out.println("==>findAll:");
    while (it.hasNext())
    {
    Person p = it.next();
    System.out.println(p.toString());
    } //通过Repository 自定义查询查询
    List<Person> list = personRepository.findByIdAndName("1", "one");
    System.out.println("==>findByIdAndName:");
    for (Person person : list)
    {
    System.out.println(person.toString());
    }
    //通过cassandraOperations查询
    Select select = QueryBuilder.select().from("person");
    select.where(QueryBuilder.eq("id", "1"));
    Person person = cassandraOperations.selectOne(select, Person.class);
    System.out.println("==>cassandraOperations:");
    System.out.println(person.toString()); } }

    打印结果


    这里面包含2种使用方法,一个是使用自己定义的仓库接口类,另一个是spring-data-cassandra提供的CassandraOperations类。CassandraOperations使用方式很多,上面只是列举了一种,其他具体应用官方文档都有说明。

  6. 到这里就告一段落了,官方文档还有很多内容,等有时间再去慢慢看了。

spring-data-cassanra的简单使用的更多相关文章

  1. Spring data jpa 实现简单动态查询的通用Specification方法

    本篇前提: SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法 这篇文章中的第二种方法 实现Specification 这块的方法 只适用于一个对象针对某一个固定字 ...

  2. SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

    软件152 尹以操 首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml ...

  3. spring data jpa 的简单使用

    先说简单一下JPA 概念:JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据. 影响 ...

  4. Spring整合Hibernate实现Spring Data JPA (简单使用)

    直接上代码: pom.xml <!-- hibernate start --> <!-- spring data jpa --> <dependency> < ...

  5. 一步步学习 Spring Data 系列之JPA(二)

    继上一篇文章对Spring Data JPA更深( )一步剖析. 上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求.这是当然的,在业务中查询 ...

  6. Spring Data(一)概念和仓库的定义

    Spring Data(一)概念和仓库的定义 Spring Data的主要任务是为数据访问提供一个相似的.一致的.基于Spring的编程模型,同时又保留着下面各个数据存储的特征.它使得使用数据访问技术 ...

  7. Spring Data JPA入门

    1. Spring Data JPA是什么 它是Spring基于ORM框架.JPA规范封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作.它提供了包括增删改查等在内的常用功能, ...

  8. Spring Data Redis实现消息队列——发布/订阅模式

    一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式.利用redis这两种场景的消息队列都能够实现. 定义:生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列, ...

  9. Spring boot 整合spring Data JPA+Spring Security+Thymeleaf框架(上)

    近期上班太忙所以耽搁了给大家分享实战springboot 框架的使用. 以下是spring boot 整合多个框架的使用. 首先是准备工作要做好. 第一  导入框架所需的包,我们用的事maven 进行 ...

  10. Spring Data REST不完全指南(二)

    上一篇文章介绍了Spring Data REST的功能及特征,以及演示了如何在项目中引入Spring Data REST并简单地启动演示了Spring Data REST项目.在本文中,我们将深入了解 ...

随机推荐

  1. 解决php网页运行超时问题:Maximum execution time of 30 seconds exceeded

    Fatal error: Maximum execution time of 30 seconds exceeded in C:\Inetpub\wwwroot\ry.php on line 11 意 ...

  2. mongo的碎片整理

    由于业务原因,需要将过期数据删除,但有一个问题出现了,频繁删除数据之后,会产生很多磁盘碎片,这些碎片如果没有被重复利用, 进而会影响查询性能(表查询时仍然会扫描这部分删除数据的磁盘空间块),随需要处理 ...

  3. 基于imgAreaSelect的用户图像截取

    前言:想到用户资料中一般有个图像自我截取的部分,为什么要截取呢,因为好看了.so,经过我各种百度,各种参考,终于打工搞成了,写下纪念纪念,让以后拿来就用也好. 一:想前端ui这东西,我就懒得说话了,哎 ...

  4. Android-理解window和windowmanager

    1.window和windowmanager的关系 window是一个抽象类,具体实现为phoneWindow.创建一个window可以通过windowmanager来实现. window的具体实现在 ...

  5. 九度OJ 1053:互换最大最小数 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6613 解决:2676 题目描述: 输入一个数n,然后输入n个数值各不相同,调换数组中最大和最小的两个数,然后输出. 输入: 测试数据有多组 ...

  6. 性能测试--初识Jmeter

    初识Jmeter Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可以用于测试静态和动 ...

  7. When Programmers and Testers Collaborate

    When Programmers and Testers Collaborate Janet Gregory SOMETHING MAGICAL HAPPENS when testers and pr ...

  8. 推荐20个非常有帮助的web前端开发教程

    1. CSS Vocabulary 一个伟大的指向和点击的小应用程序,让你加高速度掌握 CSS 语法的各个不同部分,学习各个属性的正确的名称. 2. Liquidapsive 一个简单的信息化布局.通 ...

  9. 《转》使用nginx和php实时产生缩略图

    在做自动静态化的时候,突然想到下面这个场景,也给出了解决方法.亲,真的很实用,耐心看下去.     当我从后台上传一个截图之后,480*800的截图之后,当时就没有压缩出320*480的小缩略图.好吧 ...

  10. sap crm 常用表

    [转自 http://blog.csdn.net/zhongguomao/article/details/6714616] SAP CRM 参数文件集目标组常用表: CRMD_MKTTG_TG_T C ...