驱动下载

  创建maven工程,让maven来维护我们的jar,maven最重要的pom文件内容如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4.  
  5. <groupId>com.huawei</groupId>
  6. <artifactId>cassandra</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9.  
  10. <name>cassandra</name>
  11. <url>http://maven.apache.org</url>
  12.  
  13. <properties>
  14. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  15. </properties>
  16.  
  17. <dependencies>
  18. <dependency>
  19. <groupId>com.datastax.cassandra</groupId>
  20. <artifactId>cassandra-driver-core</artifactId>
  21. <version>2.1.10.3</version>
  22. </dependency>
  23. </dependencies>
  24. </project>

Session获取

  官方给的Quick start案例

  1. Cluster cluster = null;
  2. try {
  3. cluster = Cluster.builder() // (1)
  4. .addContactPoint("127.0.0.1")               // cassandra服务器ip
  5. .withCredentials("admin", "admin") // 若没有启用账号认证,此处可以去掉
  6. .build();
  7. Session session = cluster.connect(); // (2)
  8.  
  9. ResultSet rs = session.execute("select release_version from system.local"); // (3)
  10. Row row = rs.one();
  11. System.out.println(row.getString("release_version")); // (4)
  12. } finally {
  13. if (cluster != null) cluster.close(); // (5)
  14. }

  代码中的(1) ~ (5)分别表示或者代表什么

    (1):Cluster对象是驱动程序的主入口点,它保存着真实Cassandra集群的状态(尤其是元数据);Cluster是线程安全的,一个Cassandra集群创建一个Cluster的单例,整个应用用这一个单例即可

    (2):Session用来执行查询的,而且它也是线程安全的,同样也应该重复利用

    (3):利用execute来发送一个查询到Cassandra,execute返回一个Resultset(结果集),这个结果集就是必要的列的行集合(二维表,行是满足条件的记录,列是我们关注的某些字段)

    (4):从row中提取数据

    (5):当任务完成后,关闭cluster,关闭cluster的同时将会关闭它创建的全部session;这一步很重要,它会释放潜在的资源(TCP连接、线程池等),在真实的应用中,我们应该在应用关闭(或应用卸载)的时候关闭cluster

    有jdbc开发的经验,就会发现,上述代码似曾相识,上述代码中的session就相当于jdbc中的connection,是整个数据库操作的基础,那么我们将session的获取单独抽出来

  1. package com.huawei.cassandra.factory;
  2.  
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;
  5.  
  6. import com.datastax.driver.core.Cluster;
  7. import com.datastax.driver.core.Session;
  8.  
  9. public class SessionRepository
  10. {
  11. private static Session instance = null;
  12. private static Cluster cluster = null;
  13. private static Lock lock = new ReentrantLock();
  14.  
  15. private SessionRepository(){}
  16.  
  17. public static Session getSession()
  18. {
  19. if (null == instance)
  20. {
  21. try
  22. {
  23. lock.lock();
  24.  
  25. if (null == instance)
  26. {
  27. cluster = Cluster.builder()
  28. .addContactPoint("127.0.0.1")
  29. .withCredentials("admin", "admin")
  30. .build();
  31. instance = cluster.connect();
  32. // 也可以针对一个特定的keyspace获取一个session
  33. // instance = cluster.connect("mycas");
  34. }
  35. }
  36. finally
  37. {
  38. lock.unlock();
  39. }
  40. }
  41. return instance;
  42. }
  43.  
  44. public static void close()
  45. {
  46. if (null == cluster)
  47. {
  48. try
  49. {
  50. lock.lock();
  51.  
  52. if (null == cluster)
  53. {
  54. cluster.close();
  55. }
  56. }
  57. finally
  58. {
  59. lock.unlock();
  60. }
  61. }
  62. }
  63. }

    拿到session了,那么请随意操作Cassandra吧!

cassandra基本操作

  创建表

    在mycas下创建表student

  1. use mycas;
  2. create table student(
  3. id int,
  4. address text,
  5. name text,
  6. age int,
  7. height int,
  8. primary key(id,address,name)
  9. );
  10.  
  11. insert into student(id,address,name,age,height) values(1,'guangdong','lixiao',32,172);

  session直接执行cql

    和jdbc类似,关键是cql的拼接,下例是插入一条记录,删、改、查和这类似,不一一列举了

  1.     // 字符串注意单引号'
  2. String cql = "insert into mycas.student(id,address,name,age,height) values("
  3. + student.getId() + ",'" + student.getAddress() + "','" + student.getName()
  4. + "'," + student.getAge() + "," + student.getHeight() + ");";
  5. System.out.println(cql);
  6. session.execute(cql);

  Querybuilder

    利用Querybuilder可以减轻cql的拼接,sql语句的拼接由驱动完成

    查询一个student:

  1. @Override
  2. public Student getStudentByKeys(int id, String address, String name)
  3. {
  4. Student student = null;
  5. ResultSet rs = session.execute(
  6. QueryBuilder.select("id", "address", "name", "age", "height")
  7. .from("mycas", "student")
  8. .where(QueryBuilder.eq("id", id))
  9. .and(QueryBuilder.eq("address", address))
  10. .and(QueryBuilder.eq("name", name)));
  11. Iterator<Row> rsIterator = rs.iterator();
  12. if (rsIterator.hasNext())
  13. {
  14. Row row = rsIterator.next();
  15. student = new Student();
  16. student.setAddress(row.getString("address"));
  17. student.setAge(row.getInt("age"));
  18. student.setHeight(row.getInt("height"));
  19. student.setId(row.getInt("id"));
  20. student.setName(row.getString("name"));
  21. }
  22. return student;
  23. }

    保存一个student:

  1.   @Override
  2. public void saveStudent(Student student)
  3. {
  4. session.execute(
  5. QueryBuilder.insertInto("mycas", "student")
  6. .values(new String[]{"id", "address", "name", "age", "height"},
  7. new Object[]{student.getId(), student.getAddress(),
  8. student.getName(), student.getAge(), student.getHeight()}));
  9. }

    修改一个student:

  1. @Override
  2. public void updateStudent(Student student)
  3. {
  4. session.execute(
  5. QueryBuilder.update("mycas", "student")
  6. .with(QueryBuilder.set("age", student.getAge()))
  7. .and(QueryBuilder.set("height", student.getHeight()))
  8. .where(QueryBuilder.eq("id", student.getId()))
  9. .and(QueryBuilder.eq("address", student.getAddress()))
  10. .and(QueryBuilder.eq("name", student.getName())));
  11. }

    删除一个student:

  1. @Override
  2. public void removeStudent(int id, String address, String name)
  3. {
  4. session.execute(QueryBuilder.delete()
  5. .from("mycas", "student")
  6. .where(QueryBuilder.eq("id", id))
  7. .and(QueryBuilder.eq("address", address))
  8. .and(QueryBuilder.eq("name", name)));
  9. }

  注意:驱动版本不同,Querybuilder的用法有些许不同,有些版本的某些方法变成非静态的了!

  占位符

    cassandra也有类似jdbc那样使用预编译占位符

    http://docs.datastax.com/en/developer/java-driver/3.0/manual/statements/prepared/

    预编译的原理是怎样的了,上面的链接是驱动官方的解释,我来谈谈我的理解

    当我们预编译statement的时候,Cassandra会解析query语句,缓存解析的结果并返回一个唯一的标志(PreparedStatement对象保持着这个标志的内部引用,就相当于通过标志可以获取到query语句预编译后的内容):

    当你绑定并且执行预编译statement的时候,驱动只会发送这个标志,那么Cassandra就会跳过解析query语句的过程:

    所以,我们应该保证query语句只应该被预编译一次,缓存PreparedStatement 到我们的应用中(PreparedStatement 是线程安全的);如果我们对同一个query语句预编译了多次,那么驱动会打印警告日志;如果一个query语句只执行一次,那么预编译不会提供性能上的提高,反而会降低性能,因为它是两个来回(结合上面两张图),那么此时可以考虑用 simple statement 来代替

    和jdbc的预编译非常类似,我们来看看实际代码

    静态cql

  1.   private static final String GET_STUDENT = "select id,address,name,age,height from mycas.student where id=? and address=? and name=?;";
  2.   private static final String SAVE_STUDENT = "insert into mycas.student(id,address,name,age,height) values(?,?,?,?,?);";
  3.   private static final String UPDATE_STUDENT = "update mycas.student set age=?, height=? where id=? and address=? and name=?;";
  4.   private static final String REMOVE_STUDENT = "delete from mycas.student where id=? and address=? and name=?;";

    查询一个student

  1.      Student student = null;
  2. PreparedStatement prepareStatement = session.prepare(GET_STUDENT);
  3. BoundStatement bindStatement = new BoundStatement(prepareStatement).bind(id, address, name);
  4. ResultSet rs = session.execute(bindStatement);
  5. Iterator<Row> rsIterator = rs.iterator();
  6. if (rsIterator.hasNext())
  7. {
  8. Row row = rsIterator.next();
  9. student = new Student();
  10. student.setAddress(row.getString("address"));
  11. student.setAge(row.getInt("age"));
  12. student.setHeight(row.getInt("height"));
  13. student.setId(row.getInt("id"));
  14. student.setName(row.getString("name"));
  15. }
  16. return student;

    保存一个student

  1. PreparedStatement prepareStatement = session.prepare(SAVE_STUDENT);
  2. BoundStatement bindStatement = new BoundStatement(prepareStatement)
  3. .bind(student.getId(), student.getAddress(), student.getName(), student.getAge(), student.getHeight());
  4. session.execute(bindStatement);

    修改一个student

  1.      PreparedStatement prepareStatement = session.prepare(UPDATE_STUDENT);
  2. BoundStatement bindStatement = new BoundStatement(prepareStatement)
  3. .bind(student.getAge(), student.getHeight(), student.getId(), student.getAddress(), student.getName());
  4. session.execute(bindStatement);

    删除一个student

  1.      PreparedStatement prepareStatement = session.prepare(REMOVE_STUDENT);
  2. BoundStatement bindStatement = new BoundStatement(prepareStatement)
  3. .bind(id, address, name);
  4. session.execute(bindStatement);

  批量batch

  1. public static void batch()
  2. {
  3. Session session = SessionRepository.getSession();
  4. BoundStatement insertBind1 = new BoundStatement(
  5. session.prepare("insert into mycas.student(id,address,name,age,height) values(?,?,?,?,?);"))
  6. .bind(3, "guangxi", "huangfeihong", 67, 175);
  7.  
  8. BoundStatement insertBind2 = new BoundStatement(
  9. session.prepare("insert into mycas.student(id,address,name,age,height) values(?,?,?,?,?);"))
  10. .bind(4, "hunan", "youzhibing", 26, 160);
  11.  
  12. BoundStatement updateBind = new BoundStatement(
  13. session.prepare("update mycas.student set age=?, height=? where id=? and address=? and name=?;"))
  14. .bind(72, 173, 3, "guangxi", "huangfeihong");
  15.  
  16. BoundStatement deleteBind = new BoundStatement(
  17. session.prepare("delete from mycas.student where id=? and address=? and name=?;"))
  18. .bind(4, "hunan", "youzhibing");
  19.  
  20. BatchStatement batchStatement = new BatchStatement();
  21. batchStatement.add(insertBind1);
  22. batchStatement.add(insertBind2);
  23. batchStatement.add(updateBind);
  24. batchStatement.add(deleteBind);
  25. session.execute(batchStatement);
  26. }
  1. public static void batch()
  2. {
  3. Session session = SessionRepository.getSession();
  4. BoundStatement insertBind1 = new BoundStatement(
  5. session.prepare("insert into mycas.student(id,address,name,age,height) values(?,?,?,?,?);"))
  6. .bind(3, "guangxi", "huangfeihong", 67, 175);
  7.  
  8. BoundStatement insertBind2 = new BoundStatement(
  9. session.prepare("insert into mycas.student(id,address,name,age,height) values(?,?,?,?,?);"))
  10. .bind(4, "hunan", "youzhibing", 26, 160);
  11.  
  12. BoundStatement updateBind = new BoundStatement(
  13. session.prepare("update mycas.student set age=?, height=? where id=? and address=? and name=?;"))
  14. .bind(72, 173, 3, "guangxi", "huangfeihong");
  15.  
  16. BoundStatement deleteBind = new BoundStatement(
  17. session.prepare("delete from mycas.student where id=? and address=? and name=?;"))
  18. .bind(4, "hunan", "youzhibing");
  19.  
  20. BatchStatement batchStatement = new BatchStatement();
  21. batchStatement.add(insertBind1);
  22. batchStatement.add(insertBind2);
  23. batchStatement.add(updateBind);
  24. batchStatement.add(deleteBind);
  25. session.execute(batchStatement);
  26. }

Cassandra-Java(增删查改)的更多相关文章

  1. java中CRUD(增删查改)底层代码的实现

    java中CRUD(增删查改)底层代码的实现: package com.station.dao; import com.station.model.Product; import java.sql.* ...

  2. java实现简单的数据库的增删查改,并布局交互界面

        一.系统简介 1.1.简介  本系统提供了学生信息管理中常见的基本功能,主要包括管理员.管理员的主要功能有对学生信息进行增加.删除.修改.查找等操作,对信息进行管理,对信息进行修改.查找等操作 ...

  3. MongoDB在Java下的增删查改

    我们总不能一直使用cmd对数据库操作,数据库总是要在程序中使用的.今天来说一下怎么通过Java调用MongoDB. 学习一下最基本也是最常用的增删查改语句,这是使用数据库的基础. 注意事项: 1.要打 ...

  4. Java连接MySQL数据库及简单的增删查改操作

    主要摘自 https://www.cnblogs.com/town123/p/8336244.html https://www.runoob.com/java/java-mysql-connect.h ...

  5. java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)

    1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ...

  6. JAVA原生mvc实现用户信息的增删查改

    笔者最近学完jsp和servlet,于是心血来潮的打算写个简单的用户案例 环境准备: 开发工具eclipse jdk-1.8.0_72 tomcat-9.0.5 前端部分: 1.自己手写了一套样式 2 ...

  7. 后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)

    1 前言&概述 这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug. 本文是SpringBoot+Android+MySQL的增删查改的简单实现,用到 ...

  8. hibernate基础增删查改简单实例

    hibernate 基础理论知识网上很多,可以百度和google.这里不做多的介绍,以一个User表来开展例子 建一个web-project 我这里用了junit单元测试环境来进行增删查改的测试,别的 ...

  9. 2015.8.2 jdbc实现商品类的增删查改

    在惠普济宁基地进行了两周sql和java的学习,学到很多东西 刚才实现了用jdbc访问数据库对数据库进行操作,是用eclipse写的,过几天移植到NetBeans上,个人还是比较习惯看图形化界面 前几 ...

  10. Android——另外一种增删查改的方式(ContentProvider常用)

    以下介绍另外一种增删查改的方式 package com.njupt.sqllist; import java.util.ArrayList; import java.util.List; import ...

随机推荐

  1. C#设计模式之22-模板方法模式

    模板方法模式(Template Method Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/429 访 ...

  2. C#LeetCode刷题之#447-回旋镖的数量(Number of Boomerangs)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3792 访问. 给定平面上 n 对不同的点,"回旋镖&q ...

  3. Redis持久化存储——>RDB & AOF

    Redis中两种持久化存储机制RDB和AOF redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB ...

  4. 牛X!看完阿里P8架构师推荐的spring三剑客,成功涨薪5k

    一直以来,Spring都被Java程序员视为杀手级别的应用,是为简化Java EE应用程序的开发为目标而创建的.Spring可以做很多事情,它为企业级开发提供给了丰富的功能,但是这些功能的底层都依赖于 ...

  5. 【Floyd】珍珠

    [题目描述] 有n颗形状和大小都一致的珍珠,它们的重量都不相同.n为整数,所有的珍珠从1到n编号.你的任务是发现哪颗珍珠的重量刚好处于正中间,即在所有珍珠的重量中,该珍珠的重量列(n+1)/2位.下面 ...

  6. 前端实现图片上传预览并转换base64

    前端实现文件的上传,就必须用到input标签,type属性为file. 在vue项目中通ref操作dom.input有一个属性accept,是必须要搭配type=file使用. multiple可以上 ...

  7. Spring源码阅读 ------------------- SpringFrameWork 5.2 +IDEA 部署

    Spring作为JAVA学习者的必须学习和熟悉的框架,需要理解Spring的设计原理,核心设计模式,对于理解设计模式,面向对象的深入理解有着深远持久的影响,特此首先要做到本地部署源码开始,下面将介绍如 ...

  8. try easy pytest 1tep介绍

    『 tep is a testing tool to help you write pytest more easily. Try Easy Pytest! 』 tep前身 tep的前身是接口自动化测 ...

  9. Kubernetes实战指南(三十三):都0202了,你还在手写k8s的yaml文件?

    目录 1. k8s的yaml文件到底有多复杂 2. 基于图形化的方式自动生成yaml 2.1 k8s图形化管理工具Ratel安装 2.2 使用Ratel创建生成yaml文件 2.2.1 基本配置 2. ...

  10. centos AAVMF_CODE.fd 文件下载

    centos: yum install AAVMF -y ubuntu: apt-get install qemu-efi*